// 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) }) } }