diff --git a/chaoscenter/subscriber/go.mod b/chaoscenter/subscriber/go.mod index 3ae8f31cc33..aad2058003f 100644 --- a/chaoscenter/subscriber/go.mod +++ b/chaoscenter/subscriber/go.mod @@ -3,6 +3,7 @@ module subscriber go 1.20 require ( + github.com/golang/mock v1.6.0 github.com/argoproj/argo-workflows/v3 v3.3.1 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/gorilla/websocket v1.5.0 @@ -13,6 +14,7 @@ require ( k8s.io/api v0.26.0 k8s.io/apimachinery v0.26.0 k8s.io/client-go v12.0.0+incompatible + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 ) require ( diff --git a/chaoscenter/subscriber/go.sum b/chaoscenter/subscriber/go.sum index 82c972e25a5..b88dc31a1a4 100644 --- a/chaoscenter/subscriber/go.sum +++ b/chaoscenter/subscriber/go.sum @@ -21,6 +21,8 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= @@ -100,6 +102,8 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -381,6 +385,7 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/chaoscenter/subscriber/pkg/events/mocks/events.go b/chaoscenter/subscriber/pkg/events/mocks/events.go new file mode 100644 index 00000000000..a4df9bffe7a --- /dev/null +++ b/chaoscenter/subscriber/pkg/events/mocks/events.go @@ -0,0 +1,192 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: subscriber/pkg/events (interfaces: SubscriberEvents) + +// Package mock_events is a generated GoMock package. +package mock_events + +import ( + reflect "reflect" + types "subscriber/pkg/types" + + v1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + gomock "github.com/golang/mock/gomock" + v1alpha10 "github.com/litmuschaos/chaos-operator/pkg/client/clientset/versioned/typed/litmuschaos/v1alpha1" +) + +// MockSubscriberEvents is a mock of SubscriberEvents interface. +type MockSubscriberEvents struct { + ctrl *gomock.Controller + recorder *MockSubscriberEventsMockRecorder +} + +// MockSubscriberEventsMockRecorder is the mock recorder for MockSubscriberEvents. +type MockSubscriberEventsMockRecorder struct { + mock *MockSubscriberEvents +} + +// NewMockSubscriberEvents creates a new mock instance. +func NewMockSubscriberEvents(ctrl *gomock.Controller) *MockSubscriberEvents { + mock := &MockSubscriberEvents{ctrl: ctrl} + mock.recorder = &MockSubscriberEventsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockSubscriberEvents) EXPECT() *MockSubscriberEventsMockRecorder { + return m.recorder +} + +// ChaosEventWatcher mocks base method. +func (m *MockSubscriberEvents) ChaosEventWatcher(arg0 chan struct{}, arg1 chan types.WorkflowEvent, arg2 map[string]string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ChaosEventWatcher", arg0, arg1, arg2) +} + +// ChaosEventWatcher indicates an expected call of ChaosEventWatcher. +func (mr *MockSubscriberEventsMockRecorder) ChaosEventWatcher(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChaosEventWatcher", reflect.TypeOf((*MockSubscriberEvents)(nil).ChaosEventWatcher), arg0, arg1, arg2) +} + +// CheckChaosData mocks base method. +func (m *MockSubscriberEvents) CheckChaosData(arg0 v1alpha1.NodeStatus, arg1 string, arg2 *v1alpha10.LitmuschaosV1alpha1Client) (string, *types.ChaosData, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckChaosData", arg0, arg1, arg2) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(*types.ChaosData) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// CheckChaosData indicates an expected call of CheckChaosData. +func (mr *MockSubscriberEventsMockRecorder) CheckChaosData(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckChaosData", reflect.TypeOf((*MockSubscriberEvents)(nil).CheckChaosData), arg0, arg1, arg2) +} + +// GenerateWorkflowPayload mocks base method. +func (m *MockSubscriberEvents) GenerateWorkflowPayload(arg0, arg1, arg2, arg3 string, arg4 types.WorkflowEvent) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GenerateWorkflowPayload", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GenerateWorkflowPayload indicates an expected call of GenerateWorkflowPayload. +func (mr *MockSubscriberEventsMockRecorder) GenerateWorkflowPayload(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateWorkflowPayload", reflect.TypeOf((*MockSubscriberEvents)(nil).GenerateWorkflowPayload), arg0, arg1, arg2, arg3, arg4) +} + +// GetWorkflowObj mocks base method. +func (m *MockSubscriberEvents) GetWorkflowObj(arg0 string) (*v1alpha1.Workflow, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWorkflowObj", arg0) + ret0, _ := ret[0].(*v1alpha1.Workflow) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWorkflowObj indicates an expected call of GetWorkflowObj. +func (mr *MockSubscriberEventsMockRecorder) GetWorkflowObj(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWorkflowObj", reflect.TypeOf((*MockSubscriberEvents)(nil).GetWorkflowObj), arg0) +} + +// ListWorkflowObject mocks base method. +func (m *MockSubscriberEvents) ListWorkflowObject(arg0 string) (*v1alpha1.WorkflowList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListWorkflowObject", arg0) + ret0, _ := ret[0].(*v1alpha1.WorkflowList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListWorkflowObject indicates an expected call of ListWorkflowObject. +func (mr *MockSubscriberEventsMockRecorder) ListWorkflowObject(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListWorkflowObject", reflect.TypeOf((*MockSubscriberEvents)(nil).ListWorkflowObject), arg0) +} + +// SendWorkflowUpdates mocks base method. +func (m *MockSubscriberEvents) SendWorkflowUpdates(arg0 map[string]string, arg1 types.WorkflowEvent) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendWorkflowUpdates", arg0, arg1) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SendWorkflowUpdates indicates an expected call of SendWorkflowUpdates. +func (mr *MockSubscriberEventsMockRecorder) SendWorkflowUpdates(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendWorkflowUpdates", reflect.TypeOf((*MockSubscriberEvents)(nil).SendWorkflowUpdates), arg0, arg1) +} + +// StopChaosEngineState mocks base method. +func (m *MockSubscriberEvents) StopChaosEngineState(arg0 string, arg1 *string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StopChaosEngineState", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// StopChaosEngineState indicates an expected call of StopChaosEngineState. +func (mr *MockSubscriberEventsMockRecorder) StopChaosEngineState(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StopChaosEngineState", reflect.TypeOf((*MockSubscriberEvents)(nil).StopChaosEngineState), arg0, arg1) +} + +// StopWorkflow mocks base method. +func (m *MockSubscriberEvents) StopWorkflow(arg0, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StopWorkflow", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// StopWorkflow indicates an expected call of StopWorkflow. +func (mr *MockSubscriberEventsMockRecorder) StopWorkflow(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StopWorkflow", reflect.TypeOf((*MockSubscriberEvents)(nil).StopWorkflow), arg0, arg1) +} + +// WorkflowEventHandler mocks base method. +func (m *MockSubscriberEvents) WorkflowEventHandler(arg0 *v1alpha1.Workflow, arg1 string, arg2 int64) (types.WorkflowEvent, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WorkflowEventHandler", arg0, arg1, arg2) + ret0, _ := ret[0].(types.WorkflowEvent) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WorkflowEventHandler indicates an expected call of WorkflowEventHandler. +func (mr *MockSubscriberEventsMockRecorder) WorkflowEventHandler(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkflowEventHandler", reflect.TypeOf((*MockSubscriberEvents)(nil).WorkflowEventHandler), arg0, arg1, arg2) +} + +// WorkflowEventWatcher mocks base method. +func (m *MockSubscriberEvents) WorkflowEventWatcher(arg0 chan struct{}, arg1 chan types.WorkflowEvent, arg2 map[string]string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "WorkflowEventWatcher", arg0, arg1, arg2) +} + +// WorkflowEventWatcher indicates an expected call of WorkflowEventWatcher. +func (mr *MockSubscriberEventsMockRecorder) WorkflowEventWatcher(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkflowEventWatcher", reflect.TypeOf((*MockSubscriberEvents)(nil).WorkflowEventWatcher), arg0, arg1, arg2) +} + +// WorkflowUpdates mocks base method. +func (m *MockSubscriberEvents) WorkflowUpdates(arg0 map[string]string, arg1 chan types.WorkflowEvent) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "WorkflowUpdates", arg0, arg1) +} + +// WorkflowUpdates indicates an expected call of WorkflowUpdates. +func (mr *MockSubscriberEventsMockRecorder) WorkflowUpdates(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkflowUpdates", reflect.TypeOf((*MockSubscriberEvents)(nil).WorkflowUpdates), arg0, arg1) +} diff --git a/chaoscenter/subscriber/pkg/events/testdata/fuzz/FuzzGenerateWorkflowPayload/582528ddfad69eb5 b/chaoscenter/subscriber/pkg/events/testdata/fuzz/FuzzGenerateWorkflowPayload/582528ddfad69eb5 new file mode 100644 index 00000000000..a96f5599e6b --- /dev/null +++ b/chaoscenter/subscriber/pkg/events/testdata/fuzz/FuzzGenerateWorkflowPayload/582528ddfad69eb5 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("0") diff --git a/chaoscenter/subscriber/pkg/events/utils_fuzz_test.go b/chaoscenter/subscriber/pkg/events/utils_fuzz_test.go new file mode 100644 index 00000000000..8ed645f459d --- /dev/null +++ b/chaoscenter/subscriber/pkg/events/utils_fuzz_test.go @@ -0,0 +1,42 @@ +package events + +import ( + "fmt" + "subscriber/pkg/graphql" + "subscriber/pkg/k8s" + "subscriber/pkg/types" + "testing" + + fuzz "github.com/AdaLogics/go-fuzz-headers" + "github.com/golang/mock/gomock" +) + +func FuzzGenerateWorkflowPayload(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + fuzzConsumer := fuzz.NewConsumer(data) + + targetStruct := &struct { + cid, accessKey, version, completed string + wfEvent types.WorkflowEvent + }{} + err := fuzzConsumer.GenerateStruct(targetStruct) + if err != nil { + return + } + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + subscriberGraphql := graphql.NewSubscriberGql() + subscriberK8s := k8s.NewK8sSubscriber(subscriberGraphql) + subscriberEvents := NewSubscriberEventsOperator(subscriberGraphql, subscriberK8s) + + event, err := subscriberEvents.GenerateWorkflowPayload(targetStruct.cid, targetStruct.accessKey, targetStruct.version, targetStruct.completed, targetStruct.wfEvent) + if err != nil { + fmt.Println(event) + t.Errorf("Unexpected error: %v", err) + } + if event == nil { + t.Errorf("Returned payload is nil") + } + }) +}