From a2ce38ce126c13283753d14af642f4765d9d9616 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 7 Jul 2025 16:44:14 +0200 Subject: [PATCH] use gomock generated mocks for the action invoke stream API --- internal/plugin/grpc_provider_test.go | 186 ++++++++++++------------ internal/plugin/mock_proto/actions.go | 50 ------- internal/plugin/mock_proto/generate.go | 2 +- internal/plugin/mock_proto/mock.go | 127 +++++++++++++++- internal/plugin6/grpc_provider_test.go | 186 ++++++++++++------------ internal/plugin6/mock_proto/actions.go | 50 ------- internal/plugin6/mock_proto/generate.go | 2 +- internal/plugin6/mock_proto/mock.go | 128 +++++++++++++++- 8 files changed, 435 insertions(+), 296 deletions(-) delete mode 100644 internal/plugin/mock_proto/actions.go delete mode 100644 internal/plugin6/mock_proto/actions.go diff --git a/internal/plugin/grpc_provider_test.go b/internal/plugin/grpc_provider_test.go index 2fadda6953..0d1b4d5a28 100644 --- a/internal/plugin/grpc_provider_test.go +++ b/internal/plugin/grpc_provider_test.go @@ -2061,28 +2061,26 @@ func TestGRPCProvider_planAction_linked_provider_returns_error(t *testing.T) { } func TestGRPCProvider_invokeAction_unlinked_valid(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Progress_{ - Progress: &proto.InvokeAction_Event_Progress{ - Message: "Hello from the action", - }, - }, - }, - - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{}, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Progress_{ + Progress: &proto.InvokeAction_Event_Progress{ + Message: "Hello from the action", }, }, - } + }, nil) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{}, + }, + }, nil) + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2125,38 +2123,37 @@ func TestGRPCProvider_invokeAction_unlinked_invalid(t *testing.T) { } func TestGRPCProvider_invokeAction_lifecycle_valid(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Progress_{ - Progress: &proto.InvokeAction_Event_Progress{ - Message: "Lifecycle progress", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Progress_{ + Progress: &proto.InvokeAction_Event_Progress{ + Message: "Lifecycle progress", }, - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{{ - NewState: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa4attr\xa3new"), - }, - NewIdentity: &proto.ResourceIdentityData{ - IdentityData: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa7id_attr\xa2id"), - }, - }, - }}, + }, + }, nil) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{{ + NewState: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa3new"), }, - }, + NewIdentity: &proto.ResourceIdentityData{ + IdentityData: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa7id_attr\xa2id"), + }, + }, + }}, }, }, - } + }, nil) + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2263,28 +2260,28 @@ func TestGRPCProvider_invokeAction_lifecycle_extra_linked_resource(t *testing.T) } func TestGRPCProvider_invokeAction_lifecycle_provider_returns_error(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - Diagnostics: []*proto.Diagnostic{ - { - Severity: proto.Diagnostic_ERROR, - Summary: "Provider error", - Detail: "Something went wrong", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + Diagnostics: []*proto.Diagnostic{ + { + Severity: proto.Diagnostic_ERROR, + Summary: "Provider error", + Detail: "Something went wrong", }, }, }, }, - } + }, nil) + + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2327,50 +2324,49 @@ func TestGRPCProvider_invokeAction_lifecycle_provider_returns_error(t *testing.T } func TestGRPCProvider_invokeAction_linked_valid(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Progress_{ - Progress: &proto.InvokeAction_Event_Progress{ - Message: "Linked progress", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Progress_{ + Progress: &proto.InvokeAction_Event_Progress{ + Message: "Linked progress", }, - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{ - { - NewState: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa4attr\xa3new"), - }, - NewIdentity: &proto.ResourceIdentityData{ - IdentityData: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa7id_attr\xa2id"), - }, - }, + }, + }, nil) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{ + { + NewState: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa3new"), + }, + NewIdentity: &proto.ResourceIdentityData{ + IdentityData: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa7id_attr\xa2id"), }, - { - NewState: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa4attr\xa4new2"), - }, - NewIdentity: &proto.ResourceIdentityData{ - IdentityData: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa7id_attr\xa3id2"), - }, - }, + }, + }, + { + NewState: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa4new2"), + }, + NewIdentity: &proto.ResourceIdentityData{ + IdentityData: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa7id_attr\xa3id2"), }, }, }, }, }, }, - } + }, nil) + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2520,28 +2516,28 @@ func TestGRPCProvider_invokeAction_linked_too_many_linked_resources(t *testing.T } func TestGRPCProvider_invokeAction_linked_provider_returns_error(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - Diagnostics: []*proto.Diagnostic{ - { - Severity: proto.Diagnostic_ERROR, - Summary: "Provider error", - Detail: "Something went wrong", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + Diagnostics: []*proto.Diagnostic{ + { + Severity: proto.Diagnostic_ERROR, + Summary: "Provider error", + Detail: "Something went wrong", }, }, }, }, - } + }, nil) + + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), diff --git a/internal/plugin/mock_proto/actions.go b/internal/plugin/mock_proto/actions.go deleted file mode 100644 index 79098988ed..0000000000 --- a/internal/plugin/mock_proto/actions.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: BUSL-1.1 - -package mock_tfplugin5 - -import ( - context "context" - "io" - - proto "github.com/hashicorp/terraform/internal/tfplugin5" - metadata "google.golang.org/grpc/metadata" -) - -var _ proto.Provider_InvokeActionClient = (*MockInvokeProtoClient)(nil) - -type MockInvokeProtoClient struct { - Events []*proto.InvokeAction_Event -} - -func (m *MockInvokeProtoClient) Recv() (*proto.InvokeAction_Event, error) { - if len(m.Events) == 0 { - return nil, io.EOF - } - event := m.Events[0] - m.Events = m.Events[1:] - return event, nil -} - -func (m *MockInvokeProtoClient) CloseSend() error { - return nil -} - -func (m *MockInvokeProtoClient) Context() context.Context { - return context.TODO() -} - -func (m *MockInvokeProtoClient) Header() (metadata.MD, error) { - return nil, nil -} - -func (m *MockInvokeProtoClient) RecvMsg(k any) error { - return nil -} - -func (m *MockInvokeProtoClient) SendMsg(k any) error { - return nil -} -func (m *MockInvokeProtoClient) Trailer() metadata.MD { - return nil -} diff --git a/internal/plugin/mock_proto/generate.go b/internal/plugin/mock_proto/generate.go index fdfc1696bd..c35d5aa939 100644 --- a/internal/plugin/mock_proto/generate.go +++ b/internal/plugin/mock_proto/generate.go @@ -1,6 +1,6 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 -//go:generate go tool go.uber.org/mock/mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin5 ProviderClient,ProvisionerClient,Provisioner_ProvisionResourceClient,Provisioner_ProvisionResourceServer +//go:generate go tool go.uber.org/mock/mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin5 ProviderClient,ProvisionerClient,Provisioner_ProvisionResourceClient,Provisioner_ProvisionResourceServer,Provider_InvokeActionClient package mock_tfplugin5 diff --git a/internal/plugin/mock_proto/mock.go b/internal/plugin/mock_proto/mock.go index f4ed0f0c15..15952be897 100644 --- a/internal/plugin/mock_proto/mock.go +++ b/internal/plugin/mock_proto/mock.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/hashicorp/terraform/internal/tfplugin5 (interfaces: ProviderClient,ProvisionerClient,Provisioner_ProvisionResourceClient,Provisioner_ProvisionResourceServer) +// Source: github.com/hashicorp/terraform/internal/tfplugin5 (interfaces: ProviderClient,ProvisionerClient,Provisioner_ProvisionResourceClient,Provisioner_ProvisionResourceServer,Provider_InvokeActionClient) // // Generated by this command: // -// mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin5 ProviderClient,ProvisionerClient,Provisioner_ProvisionResourceClient,Provisioner_ProvisionResourceServer +// mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin5 ProviderClient,ProvisionerClient,Provisioner_ProvisionResourceClient,Provisioner_ProvisionResourceServer,Provider_InvokeActionClient // // Package mock_tfplugin5 is a generated GoMock package. @@ -906,3 +906,126 @@ func (mr *MockProvisioner_ProvisionResourceServerMockRecorder) SetTrailer(arg0 a mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockProvisioner_ProvisionResourceServer)(nil).SetTrailer), arg0) } + +// MockProvider_InvokeActionClient is a mock of Provider_InvokeActionClient interface. +type MockProvider_InvokeActionClient struct { + ctrl *gomock.Controller + recorder *MockProvider_InvokeActionClientMockRecorder +} + +// MockProvider_InvokeActionClientMockRecorder is the mock recorder for MockProvider_InvokeActionClient. +type MockProvider_InvokeActionClientMockRecorder struct { + mock *MockProvider_InvokeActionClient +} + +// NewMockProvider_InvokeActionClient creates a new mock instance. +func NewMockProvider_InvokeActionClient(ctrl *gomock.Controller) *MockProvider_InvokeActionClient { + mock := &MockProvider_InvokeActionClient{ctrl: ctrl} + mock.recorder = &MockProvider_InvokeActionClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockProvider_InvokeActionClient) EXPECT() *MockProvider_InvokeActionClientMockRecorder { + return m.recorder +} + +// CloseSend mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) CloseSend() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).CloseSend)) +} + +// Context mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Context)) +} + +// Header mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Header)) +} + +// Recv mocks base method. +func (m *MockProvider_InvokeActionClient) Recv() (*tfplugin5.InvokeAction_Event, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*tfplugin5.InvokeAction_Event) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockProvider_InvokeActionClientMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m *MockProvider_InvokeActionClient) RecvMsg(arg0 any) 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 *MockProvider_InvokeActionClientMockRecorder) RecvMsg(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).RecvMsg), arg0) +} + +// SendMsg mocks base method. +func (m *MockProvider_InvokeActionClient) SendMsg(arg0 any) 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 *MockProvider_InvokeActionClientMockRecorder) SendMsg(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).SendMsg), arg0) +} + +// Trailer mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) Trailer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Trailer)) +} diff --git a/internal/plugin6/grpc_provider_test.go b/internal/plugin6/grpc_provider_test.go index 7f1414fe0e..699f729177 100644 --- a/internal/plugin6/grpc_provider_test.go +++ b/internal/plugin6/grpc_provider_test.go @@ -2350,28 +2350,26 @@ func TestGRPCProvider_planAction_linked_provider_returns_error(t *testing.T) { } func TestGRPCProvider_invokeAction_unlinked_valid(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Progress_{ - Progress: &proto.InvokeAction_Event_Progress{ - Message: "Hello from the action", - }, - }, - }, - - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{}, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Progress_{ + Progress: &proto.InvokeAction_Event_Progress{ + Message: "Hello from the action", }, }, - } + }, nil) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{}, + }, + }, nil) + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2414,38 +2412,37 @@ func TestGRPCProvider_invokeAction_unlinked_invalid(t *testing.T) { } func TestGRPCProvider_invokeAction_lifecycle_valid(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Progress_{ - Progress: &proto.InvokeAction_Event_Progress{ - Message: "Lifecycle progress", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Progress_{ + Progress: &proto.InvokeAction_Event_Progress{ + Message: "Lifecycle progress", }, - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{{ - NewState: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa4attr\xa3new"), - }, - NewIdentity: &proto.ResourceIdentityData{ - IdentityData: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa7id_attr\xa2id"), - }, - }, - }}, + }, + }, nil) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{{ + NewState: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa3new"), }, - }, + NewIdentity: &proto.ResourceIdentityData{ + IdentityData: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa7id_attr\xa2id"), + }, + }, + }}, }, }, - } + }, nil) + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2552,28 +2549,28 @@ func TestGRPCProvider_invokeAction_lifecycle_extra_linked_resource(t *testing.T) } func TestGRPCProvider_invokeAction_lifecycle_provider_returns_error(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - Diagnostics: []*proto.Diagnostic{ - { - Severity: proto.Diagnostic_ERROR, - Summary: "Provider error", - Detail: "Something went wrong", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + Diagnostics: []*proto.Diagnostic{ + { + Severity: proto.Diagnostic_ERROR, + Summary: "Provider error", + Detail: "Something went wrong", }, }, }, }, - } + }, nil) + + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2616,50 +2613,49 @@ func TestGRPCProvider_invokeAction_lifecycle_provider_returns_error(t *testing.T } func TestGRPCProvider_invokeAction_linked_valid(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Progress_{ - Progress: &proto.InvokeAction_Event_Progress{ - Message: "Linked progress", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Progress_{ + Progress: &proto.InvokeAction_Event_Progress{ + Message: "Linked progress", }, - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{ - { - NewState: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa4attr\xa3new"), - }, - NewIdentity: &proto.ResourceIdentityData{ - IdentityData: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa7id_attr\xa2id"), - }, - }, + }, + }, nil) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + LinkedResources: []*proto.InvokeAction_Event_Completed_LinkedResource{ + { + NewState: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa3new"), + }, + NewIdentity: &proto.ResourceIdentityData{ + IdentityData: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa7id_attr\xa2id"), }, - { - NewState: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa4attr\xa4new2"), - }, - NewIdentity: &proto.ResourceIdentityData{ - IdentityData: &proto.DynamicValue{ - Msgpack: []byte("\x81\xa7id_attr\xa3id2"), - }, - }, + }, + }, + { + NewState: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa4attr\xa4new2"), + }, + NewIdentity: &proto.ResourceIdentityData{ + IdentityData: &proto.DynamicValue{ + Msgpack: []byte("\x81\xa7id_attr\xa3id2"), }, }, }, }, }, }, - } + }, nil) + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), @@ -2809,28 +2805,28 @@ func TestGRPCProvider_invokeAction_linked_too_many_linked_resources(t *testing.T } func TestGRPCProvider_invokeAction_linked_provider_returns_error(t *testing.T) { + ctrl := gomock.NewController(t) client := mockProviderClient(t) p := &GRPCProvider{ client: client, } - mockInvokeClient := &mockproto.MockInvokeProtoClient{ - Events: []*proto.InvokeAction_Event{ - { - Type: &proto.InvokeAction_Event_Completed_{ - Completed: &proto.InvokeAction_Event_Completed{ - Diagnostics: []*proto.Diagnostic{ - { - Severity: proto.Diagnostic_ERROR, - Summary: "Provider error", - Detail: "Something went wrong", - }, - }, + mockInvokeClient := mockproto.NewMockProvider_InvokeActionClient(ctrl) + mockInvokeClient.EXPECT().Recv().Return(&proto.InvokeAction_Event{ + Type: &proto.InvokeAction_Event_Completed_{ + Completed: &proto.InvokeAction_Event_Completed{ + Diagnostics: []*proto.Diagnostic{ + { + Severity: proto.Diagnostic_ERROR, + Summary: "Provider error", + Detail: "Something went wrong", }, }, }, }, - } + }, nil) + + mockInvokeClient.EXPECT().Recv().Return(nil, io.EOF) client.EXPECT().InvokeAction( gomock.Any(), diff --git a/internal/plugin6/mock_proto/actions.go b/internal/plugin6/mock_proto/actions.go deleted file mode 100644 index cb55176a4e..0000000000 --- a/internal/plugin6/mock_proto/actions.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: BUSL-1.1 - -package mock_tfplugin6 - -import ( - context "context" - "io" - - proto "github.com/hashicorp/terraform/internal/tfplugin6" - metadata "google.golang.org/grpc/metadata" -) - -var _ proto.Provider_InvokeActionClient = (*MockInvokeProtoClient)(nil) - -type MockInvokeProtoClient struct { - Events []*proto.InvokeAction_Event -} - -func (m *MockInvokeProtoClient) Recv() (*proto.InvokeAction_Event, error) { - if len(m.Events) == 0 { - return nil, io.EOF - } - event := m.Events[0] - m.Events = m.Events[1:] - return event, nil -} - -func (m *MockInvokeProtoClient) CloseSend() error { - return nil -} - -func (m *MockInvokeProtoClient) Context() context.Context { - return context.TODO() -} - -func (m *MockInvokeProtoClient) Header() (metadata.MD, error) { - return nil, nil -} - -func (m *MockInvokeProtoClient) RecvMsg(k any) error { - return nil -} - -func (m *MockInvokeProtoClient) SendMsg(k any) error { - return nil -} -func (m *MockInvokeProtoClient) Trailer() metadata.MD { - return nil -} diff --git a/internal/plugin6/mock_proto/generate.go b/internal/plugin6/mock_proto/generate.go index 2693a8448c..36cc550081 100644 --- a/internal/plugin6/mock_proto/generate.go +++ b/internal/plugin6/mock_proto/generate.go @@ -1,6 +1,6 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 -//go:generate go tool go.uber.org/mock/mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin6 ProviderClient +//go:generate go tool go.uber.org/mock/mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin6 ProviderClient,Provider_InvokeActionClient package mock_tfplugin6 diff --git a/internal/plugin6/mock_proto/mock.go b/internal/plugin6/mock_proto/mock.go index dfeac67bed..b7fabcde32 100644 --- a/internal/plugin6/mock_proto/mock.go +++ b/internal/plugin6/mock_proto/mock.go @@ -1,9 +1,9 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/hashicorp/terraform/internal/tfplugin6 (interfaces: ProviderClient) +// Source: github.com/hashicorp/terraform/internal/tfplugin6 (interfaces: ProviderClient,Provider_InvokeActionClient) // // Generated by this command: // -// mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin6 ProviderClient +// mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin6 ProviderClient,Provider_InvokeActionClient // // Package mock_tfplugin6 is a generated GoMock package. @@ -16,6 +16,7 @@ import ( tfplugin6 "github.com/hashicorp/terraform/internal/tfplugin6" gomock "go.uber.org/mock/gomock" grpc "google.golang.org/grpc" + metadata "google.golang.org/grpc/metadata" ) // MockProviderClient is a mock of ProviderClient interface. @@ -640,3 +641,126 @@ func (mr *MockProviderClientMockRecorder) ValidateStateStoreConfig(arg0, arg1 an varargs := append([]any{arg0, arg1}, arg2...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateStateStoreConfig", reflect.TypeOf((*MockProviderClient)(nil).ValidateStateStoreConfig), varargs...) } + +// MockProvider_InvokeActionClient is a mock of Provider_InvokeActionClient interface. +type MockProvider_InvokeActionClient struct { + ctrl *gomock.Controller + recorder *MockProvider_InvokeActionClientMockRecorder +} + +// MockProvider_InvokeActionClientMockRecorder is the mock recorder for MockProvider_InvokeActionClient. +type MockProvider_InvokeActionClientMockRecorder struct { + mock *MockProvider_InvokeActionClient +} + +// NewMockProvider_InvokeActionClient creates a new mock instance. +func NewMockProvider_InvokeActionClient(ctrl *gomock.Controller) *MockProvider_InvokeActionClient { + mock := &MockProvider_InvokeActionClient{ctrl: ctrl} + mock.recorder = &MockProvider_InvokeActionClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockProvider_InvokeActionClient) EXPECT() *MockProvider_InvokeActionClientMockRecorder { + return m.recorder +} + +// CloseSend mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) CloseSend() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).CloseSend)) +} + +// Context mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Context)) +} + +// Header mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Header)) +} + +// Recv mocks base method. +func (m *MockProvider_InvokeActionClient) Recv() (*tfplugin6.InvokeAction_Event, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*tfplugin6.InvokeAction_Event) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockProvider_InvokeActionClientMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m *MockProvider_InvokeActionClient) RecvMsg(arg0 any) 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 *MockProvider_InvokeActionClientMockRecorder) RecvMsg(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).RecvMsg), arg0) +} + +// SendMsg mocks base method. +func (m *MockProvider_InvokeActionClient) SendMsg(arg0 any) 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 *MockProvider_InvokeActionClientMockRecorder) SendMsg(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).SendMsg), arg0) +} + +// Trailer mocks base method. +func (m *MockProvider_InvokeActionClient) 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 *MockProvider_InvokeActionClientMockRecorder) Trailer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockProvider_InvokeActionClient)(nil).Trailer)) +}