Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
4.5 KiB

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package client
import (
"context"
"fmt"
"testing"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
"github.com/hashicorp/consul/agent"
"github.com/hashicorp/consul/internal/resource/demo"
"github.com/hashicorp/consul/proto-public/pbresource"
"github.com/hashicorp/consul/proto/private/prototest"
"github.com/hashicorp/consul/sdk/freeport"
"github.com/hashicorp/consul/sdk/testutil"
"github.com/hashicorp/consul/testrpc"
)
func TestResourceRead(t *testing.T) {
availablePort := freeport.GetOne(t)
a := agent.NewTestAgent(t, fmt.Sprintf("ports { grpc = %d }", availablePort))
testrpc.WaitForTestAgent(t, a.RPC, "dc1")
grpcConfig, err := LoadGRPCConfig(&GRPCConfig{Address: fmt.Sprintf("127.0.0.1:%d", availablePort)})
require.NoError(t, err)
gRPCClient, err := NewGRPCClient(grpcConfig)
require.NoError(t, err)
t.Cleanup(func() {
a.Shutdown()
gRPCClient.Conn.Close()
})
t.Run("test", func(t *testing.T) {
if err != nil {
fmt.Println("error when create new grpc client")
}
v2Artist, err := demo.GenerateV2Artist()
require.NoError(t, err)
writeRsp, err := gRPCClient.Client.Write(testutil.TestContext(t), &pbresource.WriteRequest{Resource: v2Artist})
require.NoError(t, err)
readRsp, err := gRPCClient.Client.Read(context.Background(), &pbresource.ReadRequest{Id: v2Artist.Id})
require.NoError(t, err)
require.Equal(t, proto.Equal(readRsp.Resource.Id.Type, demo.TypeV2Artist), true)
prototest.AssertDeepEqual(t, writeRsp.Resource, readRsp.Resource)
})
}
func TestResourceReadInTLS(t *testing.T) {
tests := []struct {
name string
requireClientCert bool
grpcConfig func() (*GRPCConfig, int)
}{
{
name: "Test with CertFile, KeyFile and CAFile",
requireClientCert: true,
grpcConfig: func() (*GRPCConfig, int) {
availablePort := freeport.GetOne(t)
return &GRPCConfig{
Address: fmt.Sprintf("127.0.0.1:%d", availablePort),
GRPCTLS: true,
CertFile: "../../../test/client_certs/client.crt",
KeyFile: "../../../test/client_certs/client.key",
CAFile: "../../../test/client_certs/rootca.crt",
}, availablePort
},
},
{
name: "Test without CAFile",
requireClientCert: true,
grpcConfig: func() (*GRPCConfig, int) {
availablePort := freeport.GetOne(t)
return &GRPCConfig{
Address: fmt.Sprintf("127.0.0.1:%d", availablePort),
GRPCTLS: true,
GRPCTLSVerify: false,
CertFile: "../../../test/client_certs/client.crt",
KeyFile: "../../../test/client_certs/client.key",
}, availablePort
},
},
{
name: "Test without client certificates",
requireClientCert: false,
grpcConfig: func() (*GRPCConfig, int) {
availablePort := freeport.GetOne(t)
return &GRPCConfig{
Address: fmt.Sprintf("127.0.0.1:%d", availablePort),
GRPCTLS: true,
}, availablePort
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
grpcClientConfig, availablePort := tt.grpcConfig()
a := agent.StartTestAgent(t, agent.TestAgent{
HCL: fmt.Sprintf(`
ports { grpc_tls = %d }
enable_agent_tls_for_checks = true
tls {
defaults {
verify_incoming = %t
key_file = "../../../test/client_certs/server.key"
cert_file = "../../../test/client_certs/server.crt"
ca_file = "../../../test/client_certs/rootca.crt"
}
}`, availablePort, tt.requireClientCert),
UseGRPCTLS: true,
})
testrpc.WaitForTestAgent(t, a.RPC, "dc1")
grpcConfig, err := LoadGRPCConfig(grpcClientConfig)
require.NoError(t, err)
gRPCClient, err := NewGRPCClient(grpcConfig)
require.NoError(t, err)
t.Cleanup(func() {
a.Shutdown()
gRPCClient.Conn.Close()
})
v2Artist, err := demo.GenerateV2Artist()
require.NoError(t, err)
_, err = gRPCClient.Client.Read(context.Background(), &pbresource.ReadRequest{Id: v2Artist.Id})
require.Equal(t, codes.NotFound.String(), status.Code(err).String())
writeRsp, err := gRPCClient.Client.Write(testutil.TestContext(t), &pbresource.WriteRequest{Resource: v2Artist})
require.NoError(t, err)
readRsp, err := gRPCClient.Client.Read(context.Background(), &pbresource.ReadRequest{Id: v2Artist.Id})
require.NoError(t, err)
require.Equal(t, proto.Equal(readRsp.Resource.Id.Type, demo.TypeV2Artist), true)
prototest.AssertDeepEqual(t, writeRsp.Resource, readRsp.Resource)
})
}
}