This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit c4bf3ebd6206d470ab570c4d67710b95fe153c42 Author: Sebastian Rühl <[email protected]> AuthorDate: Wed May 31 14:49:15 2023 +0200 refactor(plc4go/spi): move WorkerPool to own package --- plc4go/spi/{utils => pool}/WorkerPool.go | 82 ++++++---- plc4go/spi/{utils => pool}/WorkerPool_test.go | 55 ++++--- plc4go/spi/utils/mock_ExecutorOption_test.go | 85 ----------- plc4go/spi/utils/mock_Executor_test.go | 207 -------------------------- 4 files changed, 82 insertions(+), 347 deletions(-) diff --git a/plc4go/spi/utils/WorkerPool.go b/plc4go/spi/pool/WorkerPool.go similarity index 80% rename from plc4go/spi/utils/WorkerPool.go rename to plc4go/spi/pool/WorkerPool.go index a1d8202a7c..ae1f59849f 100644 --- a/plc4go/spi/utils/WorkerPool.go +++ b/plc4go/spi/pool/WorkerPool.go @@ -17,14 +17,16 @@ * under the License. */ -package utils +package pool import ( "context" "fmt" + "github.com/apache/plc4x/plc4go/spi/options" "github.com/pkg/errors" "github.com/rs/zerolog" "github.com/rs/zerolog/log" + "io" "runtime/debug" "sync" "sync/atomic" @@ -41,6 +43,8 @@ type worker struct { executor *executor hasEnded atomic.Bool lastReceived time.Time + + log zerolog.Logger } func (w *worker) initialize() { @@ -54,7 +58,7 @@ func (w *worker) initialize() { func (w *worker) work() { defer func() { if recovered := recover(); recovered != nil { - log.Error().Msgf("Recovering from panic():%v. Stack: %s", recovered, debug.Stack()) + w.log.Error().Msgf("Recovering from panic():%v. Stack: %s", recovered, debug.Stack()) } if !w.shutdown.Load() { // if we are not in shutdown we continue @@ -72,7 +76,7 @@ func (w *worker) work() { for !w.shutdown.Load() { workerLog.Debug().Msg("Working") select { - case _workItem := <-w.executor.queue: + case _workItem := <-w.executor.workItems: w.lastReceived = time.Now() workerLog.Debug().Msgf("Got work item %v", _workItem) if _workItem.completionFuture.cancelRequested.Load() || (w.shutdown.Load() && w.interrupted.Load()) { @@ -103,6 +107,7 @@ func (w *workItem) String() string { } type Executor interface { + io.Closer Start() Stop() Submit(ctx context.Context, workItemId int32, runnable Runnable) CompletionFuture @@ -115,24 +120,32 @@ type executor struct { shutdown bool stateChange sync.Mutex worker []*worker - queue chan workItem + workItems chan workItem traceWorkers bool + + log zerolog.Logger } -func NewFixedSizeExecutor(numberOfWorkers, queueDepth int, options ...ExecutorOption) Executor { +func NewFixedSizeExecutor(numberOfWorkers, queueDepth int, _options ...options.WithOption) Executor { workers := make([]*worker, numberOfWorkers) + customLogger := options.ExtractCustomLogger(_options...) for i := 0; i < numberOfWorkers; i++ { workers[i] = &worker{ - id: i, + id: i, + log: customLogger, } } _executor := &executor{ maxNumberOfWorkers: numberOfWorkers, - queue: make(chan workItem, queueDepth), + workItems: make(chan workItem, queueDepth), worker: workers, + log: customLogger, } - for _, option := range options { - option(_executor) + for _, option := range _options { + switch option := option.(type) { + case *tracerWorkersOption: + _executor.traceWorkers = option.traceWorkers + } } for i := 0; i < numberOfWorkers; i++ { workers[i].executor = _executor @@ -144,14 +157,19 @@ var upScaleInterval = 100 * time.Millisecond var downScaleInterval = 5 * time.Second var timeToBecomeUnused = 5 * time.Second -func NewDynamicExecutor(maxNumberOfWorkers, queueDepth int, options ...ExecutorOption) Executor { +func NewDynamicExecutor(maxNumberOfWorkers, queueDepth int, _options ...options.WithOption) Executor { + customLogger := options.ExtractCustomLogger(_options...) _executor := &executor{ maxNumberOfWorkers: maxNumberOfWorkers, - queue: make(chan workItem, queueDepth), + workItems: make(chan workItem, queueDepth), worker: make([]*worker, 0), + log: customLogger, } - for _, option := range options { - option(_executor) + for _, option := range _options { + switch option := option.(type) { + case *tracerWorkersOption: + _executor.traceWorkers = option.traceWorkers + } } // We spawn one initial worker _executor.worker = append(_executor.worker, &worker{ @@ -159,13 +177,14 @@ func NewDynamicExecutor(maxNumberOfWorkers, queueDepth int, options ...ExecutorO interrupter: make(chan struct{}, 1), executor: _executor, lastReceived: time.Now(), + log: customLogger, }) mutex := sync.Mutex{} // Worker spawner go func() { defer func() { if err := recover(); err != nil { - log.Error().Msgf("panic-ed %v", err) + customLogger.Error().Msgf("panic-ed %v", err) } }() workerLog := log.With().Str("Worker type", "spawner").Logger() @@ -176,7 +195,7 @@ func NewDynamicExecutor(maxNumberOfWorkers, queueDepth int, options ...ExecutorO workerLog.Debug().Msgf("Sleeping for %v", upScaleInterval) time.Sleep(upScaleInterval) mutex.Lock() - numberOfItemsInQueue := len(_executor.queue) + numberOfItemsInQueue := len(_executor.workItems) numberOfWorkers := len(_executor.worker) workerLog.Debug().Msgf("Checking if %d > %d && %d < %d", numberOfItemsInQueue, numberOfWorkers, numberOfWorkers, maxNumberOfWorkers) if numberOfItemsInQueue > numberOfWorkers && numberOfWorkers < maxNumberOfWorkers { @@ -185,6 +204,7 @@ func NewDynamicExecutor(maxNumberOfWorkers, queueDepth int, options ...ExecutorO interrupter: make(chan struct{}, 1), executor: _executor, lastReceived: time.Now(), + log: customLogger, } _executor.worker = append(_executor.worker, _worker) _worker.initialize() @@ -200,7 +220,7 @@ func NewDynamicExecutor(maxNumberOfWorkers, queueDepth int, options ...ExecutorO go func() { defer func() { if err := recover(); err != nil { - log.Error().Msgf("panic-ed %v", err) + _executor.log.Error().Msgf("panic-ed %v", err) } }() workerLog := log.With().Str("Worker type", "killer").Logger() @@ -231,12 +251,13 @@ func NewDynamicExecutor(maxNumberOfWorkers, queueDepth int, options ...ExecutorO return _executor } -type ExecutorOption func(*executor) +func WithExecutorOptionTracerWorkers(traceWorkers bool) options.WithOption { + return &tracerWorkersOption{traceWorkers: traceWorkers} +} -func WithExecutorOptionTracerWorkers(traceWorkers bool) ExecutorOption { - return func(executor *executor) { - executor.traceWorkers = traceWorkers - } +type tracerWorkersOption struct { + options.Option + traceWorkers bool } func (e *executor) Submit(ctx context.Context, workItemId int32, runnable Runnable) CompletionFuture { @@ -245,20 +266,24 @@ func (e *executor) Submit(ctx context.Context, workItemId int32, runnable Runnab value.Store(errors.New("runnable must not be nil")) return &future{err: value} } - log.Trace().Int32("workItemId", workItemId).Msg("Submitting runnable") + e.log.Trace().Int32("workItemId", workItemId).Msg("Submitting runnable") completionFuture := &future{} + if e.shutdown { + completionFuture.Cancel(false, errors.New("executor in shutdown")) + return completionFuture + } select { - case e.queue <- workItem{ + case e.workItems <- workItem{ workItemId: workItemId, runnable: runnable, completionFuture: completionFuture, }: - log.Trace().Msg("Item added") + e.log.Trace().Msg("Item added") case <-ctx.Done(): completionFuture.Cancel(false, ctx.Err()) } - log.Trace().Int32("workItemId", workItemId).Msg("runnable queued") + e.log.Trace().Int32("workItemId", workItemId).Msg("runnable queued") return completionFuture } @@ -284,17 +309,22 @@ func (e *executor) Stop() { return } e.shutdown = true - close(e.queue) for i := 0; i < len(e.worker); i++ { worker := e.worker[i] worker.shutdown.Store(true) worker.interrupted.Store(true) close(worker.interrupter) } + close(e.workItems) e.running = false e.shutdown = false } +func (e *executor) Close() error { + e.Stop() + return nil +} + func (e *executor) IsRunning() bool { return e.running && !e.shutdown } diff --git a/plc4go/spi/utils/WorkerPool_test.go b/plc4go/spi/pool/WorkerPool_test.go similarity index 93% rename from plc4go/spi/utils/WorkerPool_test.go rename to plc4go/spi/pool/WorkerPool_test.go index fcb006b982..d940b1c545 100644 --- a/plc4go/spi/utils/WorkerPool_test.go +++ b/plc4go/spi/pool/WorkerPool_test.go @@ -17,11 +17,12 @@ * under the License. */ -package utils +package pool import ( "context" "fmt" + "github.com/apache/plc4x/plc4go/spi/options" "github.com/pkg/errors" "github.com/stretchr/testify/assert" "math/rand" @@ -68,7 +69,7 @@ func TestExecutor_Start(t *testing.T) { running: tt.fields.running, shutdown: tt.fields.shutdown, worker: tt.fields.worker, - queue: tt.fields.queue, + workItems: tt.fields.queue, traceWorkers: tt.fields.traceWorkers, } e.Start() @@ -116,7 +117,7 @@ func TestExecutor_Stop(t *testing.T) { running: tt.fields.running, shutdown: tt.fields.shutdown, worker: tt.fields.worker, - queue: tt.fields.queue, + workItems: tt.fields.queue, traceWorkers: tt.fields.traceWorkers, } e.Stop() @@ -198,7 +199,7 @@ func TestExecutor_Submit(t *testing.T) { running: executor.running, shutdown: executor.shutdown, worker: executor.worker, - queue: executor.queue, + queue: executor.workItems, traceWorkers: true, } }(), @@ -222,7 +223,7 @@ func TestExecutor_Submit(t *testing.T) { running: tt.fields.running, shutdown: tt.fields.shutdown, worker: tt.fields.worker, - queue: tt.fields.queue, + workItems: tt.fields.queue, traceWorkers: tt.fields.traceWorkers, } e.Start() @@ -239,7 +240,7 @@ func TestNewFixedSizeExecutor(t *testing.T) { type args struct { numberOfWorkers int queueDepth int - options []ExecutorOption + options []options.WithOption } tests := []struct { name string @@ -251,10 +252,10 @@ func TestNewFixedSizeExecutor(t *testing.T) { args: args{ numberOfWorkers: 13, queueDepth: 14, - options: []ExecutorOption{WithExecutorOptionTracerWorkers(true)}, + options: []options.WithOption{WithExecutorOptionTracerWorkers(true)}, }, executorValidator: func(t *testing.T, e *executor) bool { - return !e.running && !e.shutdown && len(e.worker) == 13 && cap(e.queue) == 14 + return !e.running && !e.shutdown && len(e.worker) == 13 && cap(e.workItems) == 14 }, }, } @@ -271,7 +272,7 @@ func TestNewDynamicExecutor(t *testing.T) { type args struct { numberOfWorkers int queueDepth int - options []ExecutorOption + options []options.WithOption } tests := []struct { name string @@ -284,13 +285,13 @@ func TestNewDynamicExecutor(t *testing.T) { args: args{ numberOfWorkers: 13, queueDepth: 14, - options: []ExecutorOption{WithExecutorOptionTracerWorkers(true)}, + options: []options.WithOption{WithExecutorOptionTracerWorkers(true)}, }, executorValidator: func(t *testing.T, e *executor) bool { assert.False(t, e.running) assert.False(t, e.shutdown) assert.Len(t, e.worker, 1) - assert.Equal(t, cap(e.queue), 14) + assert.Equal(t, cap(e.workItems), 14) return true }, }, @@ -299,7 +300,7 @@ func TestNewDynamicExecutor(t *testing.T) { args: args{ numberOfWorkers: 2, queueDepth: 2, - options: []ExecutorOption{WithExecutorOptionTracerWorkers(true)}, + options: []options.WithOption{WithExecutorOptionTracerWorkers(true)}, }, manipulator: func(t *testing.T, e *executor) { { @@ -331,7 +332,7 @@ func TestNewDynamicExecutor(t *testing.T) { t.Log("fill some jobs") go func() { for i := 0; i < 500; i++ { - e.queue <- workItem{ + e.workItems <- workItem{ workItemId: int32(i), runnable: func() { max := 100 @@ -372,21 +373,17 @@ func TestWithExecutorOptionTracerWorkers(t *testing.T) { tests := []struct { name string args args - executorValidator func(*testing.T, *executor) bool + executorValidator options.WithOption }{ { - name: "option should set option", - args: args{traceWorkers: true}, - executorValidator: func(t *testing.T, e *executor) bool { - return e.traceWorkers == true - }, + name: "option should set option", + args: args{traceWorkers: true}, + executorValidator: &tracerWorkersOption{traceWorkers: true}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - var _executor executor - WithExecutorOptionTracerWorkers(tt.args.traceWorkers)(&_executor) - assert.True(t, tt.executorValidator(t, &_executor)) + assert.Equal(t, tt.executorValidator, WithExecutorOptionTracerWorkers(tt.args.traceWorkers)) }) } } @@ -440,11 +437,11 @@ func TestWorker_work(t *testing.T) { id: 0, executor: func() *executor { e := &executor{ - queue: make(chan workItem), + workItems: make(chan workItem), traceWorkers: true, } go func() { - e.queue <- workItem{ + e.workItems <- workItem{ workItemId: 0, runnable: func() { panic("Oh no what should I do???") @@ -474,11 +471,11 @@ func TestWorker_work(t *testing.T) { id: 1, executor: func() *executor { e := &executor{ - queue: make(chan workItem), + workItems: make(chan workItem), traceWorkers: true, } go func() { - e.queue <- workItem{ + e.workItems <- workItem{ workItemId: 0, runnable: func() { time.Sleep(time.Millisecond * 70) @@ -507,7 +504,7 @@ func TestWorker_work(t *testing.T) { id: 1, executor: func() *executor { e := &executor{ - queue: make(chan workItem), + workItems: make(chan workItem), traceWorkers: true, } return e @@ -532,13 +529,13 @@ func TestWorker_work(t *testing.T) { id: 1, executor: func() *executor { e := &executor{ - queue: make(chan workItem), + workItems: make(chan workItem), traceWorkers: true, } go func() { completionFuture := &future{} completionFuture.cancelRequested.Store(true) - e.queue <- workItem{ + e.workItems <- workItem{ workItemId: 0, runnable: func() { time.Sleep(time.Millisecond * 70) diff --git a/plc4go/spi/utils/mock_ExecutorOption_test.go b/plc4go/spi/utils/mock_ExecutorOption_test.go deleted file mode 100644 index 9d0a05afa5..0000000000 --- a/plc4go/spi/utils/mock_ExecutorOption_test.go +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -// Code generated by mockery v2.28.1. DO NOT EDIT. - -package utils - -import mock "github.com/stretchr/testify/mock" - -// MockExecutorOption is an autogenerated mock type for the ExecutorOption type -type MockExecutorOption struct { - mock.Mock -} - -type MockExecutorOption_Expecter struct { - mock *mock.Mock -} - -func (_m *MockExecutorOption) EXPECT() *MockExecutorOption_Expecter { - return &MockExecutorOption_Expecter{mock: &_m.Mock} -} - -// Execute provides a mock function with given fields: _a0 -func (_m *MockExecutorOption) Execute(_a0 *executor) { - _m.Called(_a0) -} - -// MockExecutorOption_Execute_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Execute' -type MockExecutorOption_Execute_Call struct { - *mock.Call -} - -// Execute is a helper method to define mock.On call -// - _a0 *executor -func (_e *MockExecutorOption_Expecter) Execute(_a0 interface{}) *MockExecutorOption_Execute_Call { - return &MockExecutorOption_Execute_Call{Call: _e.mock.On("Execute", _a0)} -} - -func (_c *MockExecutorOption_Execute_Call) Run(run func(_a0 *executor)) *MockExecutorOption_Execute_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*executor)) - }) - return _c -} - -func (_c *MockExecutorOption_Execute_Call) Return() *MockExecutorOption_Execute_Call { - _c.Call.Return() - return _c -} - -func (_c *MockExecutorOption_Execute_Call) RunAndReturn(run func(*executor)) *MockExecutorOption_Execute_Call { - _c.Call.Return(run) - return _c -} - -type mockConstructorTestingTNewMockExecutorOption interface { - mock.TestingT - Cleanup(func()) -} - -// NewMockExecutorOption creates a new instance of MockExecutorOption. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockExecutorOption(t mockConstructorTestingTNewMockExecutorOption) *MockExecutorOption { - mock := &MockExecutorOption{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/plc4go/spi/utils/mock_Executor_test.go b/plc4go/spi/utils/mock_Executor_test.go deleted file mode 100644 index fa86fa9cf4..0000000000 --- a/plc4go/spi/utils/mock_Executor_test.go +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -// Code generated by mockery v2.28.1. DO NOT EDIT. - -package utils - -import ( - context "context" - - mock "github.com/stretchr/testify/mock" -) - -// MockExecutor is an autogenerated mock type for the Executor type -type MockExecutor struct { - mock.Mock -} - -type MockExecutor_Expecter struct { - mock *mock.Mock -} - -func (_m *MockExecutor) EXPECT() *MockExecutor_Expecter { - return &MockExecutor_Expecter{mock: &_m.Mock} -} - -// IsRunning provides a mock function with given fields: -func (_m *MockExecutor) IsRunning() bool { - ret := _m.Called() - - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// MockExecutor_IsRunning_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsRunning' -type MockExecutor_IsRunning_Call struct { - *mock.Call -} - -// IsRunning is a helper method to define mock.On call -func (_e *MockExecutor_Expecter) IsRunning() *MockExecutor_IsRunning_Call { - return &MockExecutor_IsRunning_Call{Call: _e.mock.On("IsRunning")} -} - -func (_c *MockExecutor_IsRunning_Call) Run(run func()) *MockExecutor_IsRunning_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *MockExecutor_IsRunning_Call) Return(_a0 bool) *MockExecutor_IsRunning_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockExecutor_IsRunning_Call) RunAndReturn(run func() bool) *MockExecutor_IsRunning_Call { - _c.Call.Return(run) - return _c -} - -// Start provides a mock function with given fields: -func (_m *MockExecutor) Start() { - _m.Called() -} - -// MockExecutor_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' -type MockExecutor_Start_Call struct { - *mock.Call -} - -// Start is a helper method to define mock.On call -func (_e *MockExecutor_Expecter) Start() *MockExecutor_Start_Call { - return &MockExecutor_Start_Call{Call: _e.mock.On("Start")} -} - -func (_c *MockExecutor_Start_Call) Run(run func()) *MockExecutor_Start_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *MockExecutor_Start_Call) Return() *MockExecutor_Start_Call { - _c.Call.Return() - return _c -} - -func (_c *MockExecutor_Start_Call) RunAndReturn(run func()) *MockExecutor_Start_Call { - _c.Call.Return(run) - return _c -} - -// Stop provides a mock function with given fields: -func (_m *MockExecutor) Stop() { - _m.Called() -} - -// MockExecutor_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' -type MockExecutor_Stop_Call struct { - *mock.Call -} - -// Stop is a helper method to define mock.On call -func (_e *MockExecutor_Expecter) Stop() *MockExecutor_Stop_Call { - return &MockExecutor_Stop_Call{Call: _e.mock.On("Stop")} -} - -func (_c *MockExecutor_Stop_Call) Run(run func()) *MockExecutor_Stop_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *MockExecutor_Stop_Call) Return() *MockExecutor_Stop_Call { - _c.Call.Return() - return _c -} - -func (_c *MockExecutor_Stop_Call) RunAndReturn(run func()) *MockExecutor_Stop_Call { - _c.Call.Return(run) - return _c -} - -// Submit provides a mock function with given fields: ctx, workItemId, runnable -func (_m *MockExecutor) Submit(ctx context.Context, workItemId int32, runnable Runnable) CompletionFuture { - ret := _m.Called(ctx, workItemId, runnable) - - var r0 CompletionFuture - if rf, ok := ret.Get(0).(func(context.Context, int32, Runnable) CompletionFuture); ok { - r0 = rf(ctx, workItemId, runnable) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(CompletionFuture) - } - } - - return r0 -} - -// MockExecutor_Submit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Submit' -type MockExecutor_Submit_Call struct { - *mock.Call -} - -// Submit is a helper method to define mock.On call -// - ctx context.Context -// - workItemId int32 -// - runnable Runnable -func (_e *MockExecutor_Expecter) Submit(ctx interface{}, workItemId interface{}, runnable interface{}) *MockExecutor_Submit_Call { - return &MockExecutor_Submit_Call{Call: _e.mock.On("Submit", ctx, workItemId, runnable)} -} - -func (_c *MockExecutor_Submit_Call) Run(run func(ctx context.Context, workItemId int32, runnable Runnable)) *MockExecutor_Submit_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(int32), args[2].(Runnable)) - }) - return _c -} - -func (_c *MockExecutor_Submit_Call) Return(_a0 CompletionFuture) *MockExecutor_Submit_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockExecutor_Submit_Call) RunAndReturn(run func(context.Context, int32, Runnable) CompletionFuture) *MockExecutor_Submit_Call { - _c.Call.Return(run) - return _c -} - -type mockConstructorTestingTNewMockExecutor interface { - mock.TestingT - Cleanup(func()) -} - -// NewMockExecutor creates a new instance of MockExecutor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockExecutor(t mockConstructorTestingTNewMockExecutor) *MockExecutor { - mock := &MockExecutor{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -}
