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  }