github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/cloudplugin/cloudplugin1/grpc_client_test.go (about) 1 package cloudplugin1 2 3 import ( 4 "bytes" 5 "context" 6 "errors" 7 "fmt" 8 "io" 9 "testing" 10 11 "github.com/golang/mock/gomock" 12 "github.com/terramate-io/tf/cloudplugin/cloudproto1" 13 "github.com/terramate-io/tf/cloudplugin/mock_cloudproto1" 14 ) 15 16 var mockError = "this is a mock error" 17 18 func testGRPCloudClient(t *testing.T, ctrl *gomock.Controller, client *mock_cloudproto1.MockCommandService_ExecuteClient, executeError error) *GRPCCloudClient { 19 t.Helper() 20 21 if client != nil && executeError != nil { 22 t.Fatal("one of client or executeError must be nil") 23 } 24 25 result := mock_cloudproto1.NewMockCommandServiceClient(ctrl) 26 27 result.EXPECT().Execute( 28 gomock.Any(), 29 gomock.Any(), 30 gomock.Any(), 31 ).Return(client, executeError) 32 33 return &GRPCCloudClient{ 34 client: result, 35 context: context.Background(), 36 } 37 } 38 39 func Test_GRPCCloudClient_ExecuteError(t *testing.T) { 40 ctrl := gomock.NewController(t) 41 gRPCClient := testGRPCloudClient(t, ctrl, nil, errors.New(mockError)) 42 43 buffer := bytes.Buffer{} 44 exitCode := gRPCClient.Execute([]string{"example"}, io.Discard, &buffer) 45 46 if exitCode != 1 { 47 t.Fatalf("expected exit %d, got %d", 1, exitCode) 48 } 49 50 if buffer.String() != mockError { 51 t.Errorf("expected error %q, got %q", mockError, buffer.String()) 52 } 53 } 54 55 func Test_GRPCCloudClient_Execute_RecvError(t *testing.T) { 56 ctrl := gomock.NewController(t) 57 executeClient := mock_cloudproto1.NewMockCommandService_ExecuteClient(ctrl) 58 executeClient.EXPECT().Recv().Return(nil, errors.New(mockError)) 59 60 gRPCClient := testGRPCloudClient(t, ctrl, executeClient, nil) 61 62 buffer := bytes.Buffer{} 63 exitCode := gRPCClient.Execute([]string{"example"}, io.Discard, &buffer) 64 65 if exitCode != 1 { 66 t.Fatalf("expected exit %d, got %d", 1, exitCode) 67 } 68 69 mockRecvError := fmt.Sprintf("Failed to receive command response from cloudplugin: %s", mockError) 70 71 if buffer.String() != mockRecvError { 72 t.Errorf("expected error %q, got %q", mockRecvError, buffer.String()) 73 } 74 } 75 76 func Test_GRPCCloudClient_Execute_Invalid_Exit(t *testing.T) { 77 ctrl := gomock.NewController(t) 78 executeClient := mock_cloudproto1.NewMockCommandService_ExecuteClient(ctrl) 79 80 executeClient.EXPECT().Recv().Return( 81 &cloudproto1.CommandResponse{ 82 Data: &cloudproto1.CommandResponse_ExitCode{ 83 ExitCode: 3_000, 84 }, 85 }, nil, 86 ) 87 88 gRPCClient := testGRPCloudClient(t, ctrl, executeClient, nil) 89 90 exitCode := gRPCClient.Execute([]string{"example"}, io.Discard, io.Discard) 91 92 if exitCode != 255 { 93 t.Fatalf("expected exit %q, got %q", 255, exitCode) 94 } 95 } 96 97 func Test_GRPCCloudClient_Execute(t *testing.T) { 98 ctrl := gomock.NewController(t) 99 executeClient := mock_cloudproto1.NewMockCommandService_ExecuteClient(ctrl) 100 101 gomock.InOrder( 102 executeClient.EXPECT().Recv().Return( 103 &cloudproto1.CommandResponse{ 104 Data: &cloudproto1.CommandResponse_Stdout{ 105 Stdout: []byte("firstcall\n"), 106 }, 107 }, nil, 108 ), 109 executeClient.EXPECT().Recv().Return( 110 &cloudproto1.CommandResponse{ 111 Data: &cloudproto1.CommandResponse_Stdout{ 112 Stdout: []byte("secondcall\n"), 113 }, 114 }, nil, 115 ), 116 executeClient.EXPECT().Recv().Return( 117 &cloudproto1.CommandResponse{ 118 Data: &cloudproto1.CommandResponse_ExitCode{ 119 ExitCode: 99, 120 }, 121 }, nil, 122 ), 123 ) 124 125 gRPCClient := testGRPCloudClient(t, ctrl, executeClient, nil) 126 127 stdoutBuffer := bytes.Buffer{} 128 exitCode := gRPCClient.Execute([]string{"example"}, &stdoutBuffer, io.Discard) 129 130 if exitCode != 99 { 131 t.Fatalf("expected exit %q, got %q", 99, exitCode) 132 } 133 134 if stdoutBuffer.String() != "firstcall\nsecondcall\n" { 135 t.Errorf("expected output %q, got %q", "firstcall\nsecondcall\n", stdoutBuffer.String()) 136 } 137 }