mirror of https://github.com/hashicorp/terraform
parent
539e140d3e
commit
a806f6220a
@ -0,0 +1,137 @@
|
||||
package cloudplugin1
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/hashicorp/terraform/internal/cloudplugin/cloudproto1"
|
||||
"github.com/hashicorp/terraform/internal/cloudplugin/mock_cloudproto1"
|
||||
)
|
||||
|
||||
var mockError = "this is a mock error"
|
||||
|
||||
func testGRPCloudClient(t *testing.T, ctrl *gomock.Controller, client *mock_cloudproto1.MockCommandService_ExecuteClient, executeError error) *GRPCCloudClient {
|
||||
t.Helper()
|
||||
|
||||
if client != nil && executeError != nil {
|
||||
t.Fatal("one of client or executeError must be nil")
|
||||
}
|
||||
|
||||
result := mock_cloudproto1.NewMockCommandServiceClient(ctrl)
|
||||
|
||||
result.EXPECT().Execute(
|
||||
gomock.Any(),
|
||||
gomock.Any(),
|
||||
gomock.Any(),
|
||||
).Return(client, executeError)
|
||||
|
||||
return &GRPCCloudClient{
|
||||
client: result,
|
||||
context: context.Background(),
|
||||
}
|
||||
}
|
||||
|
||||
func Test_GRPCCloudClient_ExecuteError(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
gRPCClient := testGRPCloudClient(t, ctrl, nil, errors.New(mockError))
|
||||
|
||||
buffer := bytes.Buffer{}
|
||||
exitCode := gRPCClient.Execute([]string{"example"}, io.Discard, &buffer)
|
||||
|
||||
if exitCode != 1 {
|
||||
t.Fatalf("expected exit %d, got %d", 1, exitCode)
|
||||
}
|
||||
|
||||
if buffer.String() != mockError {
|
||||
t.Errorf("expected error %q, got %q", mockError, buffer.String())
|
||||
}
|
||||
}
|
||||
|
||||
func Test_GRPCCloudClient_Execute_RecvError(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
executeClient := mock_cloudproto1.NewMockCommandService_ExecuteClient(ctrl)
|
||||
executeClient.EXPECT().Recv().Return(nil, errors.New(mockError))
|
||||
|
||||
gRPCClient := testGRPCloudClient(t, ctrl, executeClient, nil)
|
||||
|
||||
buffer := bytes.Buffer{}
|
||||
exitCode := gRPCClient.Execute([]string{"example"}, io.Discard, &buffer)
|
||||
|
||||
if exitCode != 1 {
|
||||
t.Fatalf("expected exit %d, got %d", 1, exitCode)
|
||||
}
|
||||
|
||||
mockRecvError := fmt.Sprintf("Failed to receive command response from cloudplugin: %s", mockError)
|
||||
|
||||
if buffer.String() != mockRecvError {
|
||||
t.Errorf("expected error %q, got %q", mockRecvError, buffer.String())
|
||||
}
|
||||
}
|
||||
|
||||
func Test_GRPCCloudClient_Execute_Invalid_Exit(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
executeClient := mock_cloudproto1.NewMockCommandService_ExecuteClient(ctrl)
|
||||
|
||||
executeClient.EXPECT().Recv().Return(
|
||||
&cloudproto1.CommandResponse{
|
||||
Data: &cloudproto1.CommandResponse_ExitCode{
|
||||
ExitCode: 3_000,
|
||||
},
|
||||
}, nil,
|
||||
)
|
||||
|
||||
gRPCClient := testGRPCloudClient(t, ctrl, executeClient, nil)
|
||||
|
||||
exitCode := gRPCClient.Execute([]string{"example"}, io.Discard, io.Discard)
|
||||
|
||||
if exitCode != 255 {
|
||||
t.Fatalf("expected exit %q, got %q", 255, exitCode)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_GRPCCloudClient_Execute(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
executeClient := mock_cloudproto1.NewMockCommandService_ExecuteClient(ctrl)
|
||||
|
||||
gomock.InOrder(
|
||||
executeClient.EXPECT().Recv().Return(
|
||||
&cloudproto1.CommandResponse{
|
||||
Data: &cloudproto1.CommandResponse_Stdout{
|
||||
Stdout: []byte("firstcall\n"),
|
||||
},
|
||||
}, nil,
|
||||
),
|
||||
executeClient.EXPECT().Recv().Return(
|
||||
&cloudproto1.CommandResponse{
|
||||
Data: &cloudproto1.CommandResponse_Stdout{
|
||||
Stdout: []byte("secondcall\n"),
|
||||
},
|
||||
}, nil,
|
||||
),
|
||||
executeClient.EXPECT().Recv().Return(
|
||||
&cloudproto1.CommandResponse{
|
||||
Data: &cloudproto1.CommandResponse_ExitCode{
|
||||
ExitCode: 99,
|
||||
},
|
||||
}, nil,
|
||||
),
|
||||
)
|
||||
|
||||
gRPCClient := testGRPCloudClient(t, ctrl, executeClient, nil)
|
||||
|
||||
stdoutBuffer := bytes.Buffer{}
|
||||
exitCode := gRPCClient.Execute([]string{"example"}, &stdoutBuffer, io.Discard)
|
||||
|
||||
if exitCode != 99 {
|
||||
t.Fatalf("expected exit %q, got %q", 99, exitCode)
|
||||
}
|
||||
|
||||
if stdoutBuffer.String() != "firstcall\nsecondcall\n" {
|
||||
t.Errorf("expected error %q, got %q", "firstcall\nsecondcall\n", stdoutBuffer.String())
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
// Copyright (c) HashiCorp, Inc.
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
//go:generate go run github.com/golang/mock/mockgen -destination mock.go github.com/hashicorp/terraform/internal/cloudplugin/cloudproto1 CommandServiceClient,CommandService_ExecuteClient
|
||||
|
||||
package mock_cloudproto1
|
||||
@ -0,0 +1,181 @@
|
||||
// Code generated by MockGen. DO NOT EDIT.
|
||||
// Source: github.com/hashicorp/terraform/internal/cloudplugin/cloudproto1 (interfaces: CommandServiceClient,CommandService_ExecuteClient)
|
||||
|
||||
// Package mock_cloudproto1 is a generated GoMock package.
|
||||
package mock_cloudproto1
|
||||
|
||||
import (
|
||||
context "context"
|
||||
reflect "reflect"
|
||||
|
||||
gomock "github.com/golang/mock/gomock"
|
||||
cloudproto1 "github.com/hashicorp/terraform/internal/cloudplugin/cloudproto1"
|
||||
grpc "google.golang.org/grpc"
|
||||
metadata "google.golang.org/grpc/metadata"
|
||||
)
|
||||
|
||||
// MockCommandServiceClient is a mock of CommandServiceClient interface.
|
||||
type MockCommandServiceClient struct {
|
||||
ctrl *gomock.Controller
|
||||
recorder *MockCommandServiceClientMockRecorder
|
||||
}
|
||||
|
||||
// MockCommandServiceClientMockRecorder is the mock recorder for MockCommandServiceClient.
|
||||
type MockCommandServiceClientMockRecorder struct {
|
||||
mock *MockCommandServiceClient
|
||||
}
|
||||
|
||||
// NewMockCommandServiceClient creates a new mock instance.
|
||||
func NewMockCommandServiceClient(ctrl *gomock.Controller) *MockCommandServiceClient {
|
||||
mock := &MockCommandServiceClient{ctrl: ctrl}
|
||||
mock.recorder = &MockCommandServiceClientMockRecorder{mock}
|
||||
return mock
|
||||
}
|
||||
|
||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||
func (m *MockCommandServiceClient) EXPECT() *MockCommandServiceClientMockRecorder {
|
||||
return m.recorder
|
||||
}
|
||||
|
||||
// Execute mocks base method.
|
||||
func (m *MockCommandServiceClient) Execute(arg0 context.Context, arg1 *cloudproto1.CommandRequest, arg2 ...grpc.CallOption) (cloudproto1.CommandService_ExecuteClient, error) {
|
||||
m.ctrl.T.Helper()
|
||||
varargs := []interface{}{arg0, arg1}
|
||||
for _, a := range arg2 {
|
||||
varargs = append(varargs, a)
|
||||
}
|
||||
ret := m.ctrl.Call(m, "Execute", varargs...)
|
||||
ret0, _ := ret[0].(cloudproto1.CommandService_ExecuteClient)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// Execute indicates an expected call of Execute.
|
||||
func (mr *MockCommandServiceClientMockRecorder) Execute(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
varargs := append([]interface{}{arg0, arg1}, arg2...)
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Execute", reflect.TypeOf((*MockCommandServiceClient)(nil).Execute), varargs...)
|
||||
}
|
||||
|
||||
// MockCommandService_ExecuteClient is a mock of CommandService_ExecuteClient interface.
|
||||
type MockCommandService_ExecuteClient struct {
|
||||
ctrl *gomock.Controller
|
||||
recorder *MockCommandService_ExecuteClientMockRecorder
|
||||
}
|
||||
|
||||
// MockCommandService_ExecuteClientMockRecorder is the mock recorder for MockCommandService_ExecuteClient.
|
||||
type MockCommandService_ExecuteClientMockRecorder struct {
|
||||
mock *MockCommandService_ExecuteClient
|
||||
}
|
||||
|
||||
// NewMockCommandService_ExecuteClient creates a new mock instance.
|
||||
func NewMockCommandService_ExecuteClient(ctrl *gomock.Controller) *MockCommandService_ExecuteClient {
|
||||
mock := &MockCommandService_ExecuteClient{ctrl: ctrl}
|
||||
mock.recorder = &MockCommandService_ExecuteClientMockRecorder{mock}
|
||||
return mock
|
||||
}
|
||||
|
||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||
func (m *MockCommandService_ExecuteClient) EXPECT() *MockCommandService_ExecuteClientMockRecorder {
|
||||
return m.recorder
|
||||
}
|
||||
|
||||
// CloseSend mocks base method.
|
||||
func (m *MockCommandService_ExecuteClient) CloseSend() error {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "CloseSend")
|
||||
ret0, _ := ret[0].(error)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// CloseSend indicates an expected call of CloseSend.
|
||||
func (mr *MockCommandService_ExecuteClientMockRecorder) CloseSend() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockCommandService_ExecuteClient)(nil).CloseSend))
|
||||
}
|
||||
|
||||
// Context mocks base method.
|
||||
func (m *MockCommandService_ExecuteClient) Context() context.Context {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Context")
|
||||
ret0, _ := ret[0].(context.Context)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// Context indicates an expected call of Context.
|
||||
func (mr *MockCommandService_ExecuteClientMockRecorder) Context() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockCommandService_ExecuteClient)(nil).Context))
|
||||
}
|
||||
|
||||
// Header mocks base method.
|
||||
func (m *MockCommandService_ExecuteClient) Header() (metadata.MD, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Header")
|
||||
ret0, _ := ret[0].(metadata.MD)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// Header indicates an expected call of Header.
|
||||
func (mr *MockCommandService_ExecuteClientMockRecorder) Header() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockCommandService_ExecuteClient)(nil).Header))
|
||||
}
|
||||
|
||||
// Recv mocks base method.
|
||||
func (m *MockCommandService_ExecuteClient) Recv() (*cloudproto1.CommandResponse, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Recv")
|
||||
ret0, _ := ret[0].(*cloudproto1.CommandResponse)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// Recv indicates an expected call of Recv.
|
||||
func (mr *MockCommandService_ExecuteClientMockRecorder) Recv() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockCommandService_ExecuteClient)(nil).Recv))
|
||||
}
|
||||
|
||||
// RecvMsg mocks base method.
|
||||
func (m *MockCommandService_ExecuteClient) RecvMsg(arg0 interface{}) error {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "RecvMsg", arg0)
|
||||
ret0, _ := ret[0].(error)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// RecvMsg indicates an expected call of RecvMsg.
|
||||
func (mr *MockCommandService_ExecuteClientMockRecorder) RecvMsg(arg0 interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockCommandService_ExecuteClient)(nil).RecvMsg), arg0)
|
||||
}
|
||||
|
||||
// SendMsg mocks base method.
|
||||
func (m *MockCommandService_ExecuteClient) SendMsg(arg0 interface{}) error {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "SendMsg", arg0)
|
||||
ret0, _ := ret[0].(error)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// SendMsg indicates an expected call of SendMsg.
|
||||
func (mr *MockCommandService_ExecuteClientMockRecorder) SendMsg(arg0 interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockCommandService_ExecuteClient)(nil).SendMsg), arg0)
|
||||
}
|
||||
|
||||
// Trailer mocks base method.
|
||||
func (m *MockCommandService_ExecuteClient) Trailer() metadata.MD {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Trailer")
|
||||
ret0, _ := ret[0].(metadata.MD)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// Trailer indicates an expected call of Trailer.
|
||||
func (mr *MockCommandService_ExecuteClientMockRecorder) Trailer() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockCommandService_ExecuteClient)(nil).Trailer))
|
||||
}
|
||||
Loading…
Reference in new issue