| package common |
| |
| import ( |
| "testing" |
| "time" |
| |
| "github.com/stretchr/testify/mock" |
| "github.com/stretchr/testify/require" |
| "go.temporal.io/sdk/testsuite" |
| "go.temporal.io/sdk/workflow" |
| ) |
| |
| // sampleWorkflowWithMutex is used to unit test the mutex workflow |
| func sampleWorkflowWithMutex(ctx workflow.Context, resourceID string) error { |
| currentWorkflowID := workflow.GetInfo(ctx).WorkflowExecution.ID |
| m := NewMutex(currentWorkflowID, "TestUseCase") |
| unlockFunc, err := m.Lock(ctx, resourceID, 10*time.Minute) |
| if err != nil { |
| return err |
| } |
| _ = workflow.Sleep(ctx, 10*time.Second) |
| _ = unlockFunc() |
| return nil |
| } |
| |
| // mockMutexLock stubs mutex.Lock call |
| func mockMutexLock(env *testsuite.TestWorkflowEnvironment, resourceID string, mockError error) { |
| execution := &workflow.Execution{ID: "mockID", RunID: "mockRunID"} |
| env.OnActivity(signalWithStartMutexWorkflowActivity, mock.Anything, mock.Anything, resourceID, mock.Anything, mock.Anything).Return(execution, mockError) |
| env.RegisterDelayedCallback(func() { |
| env.SignalWorkflow(AcquireLockSignalName, "mockReleaseLockChannelName") |
| }, time.Millisecond*0) |
| if mockError == nil { |
| env.OnSignalExternalWorkflow(mock.Anything, mock.Anything, execution.RunID, mock.Anything, mock.Anything).Return(nil) |
| } |
| } |
| |
| func TestSampleWorkflow_Success(t *testing.T) { |
| mockResourceID := "mockResourceID" |
| |
| testSuite := &testsuite.WorkflowTestSuite{} |
| env := testSuite.NewTestWorkflowEnvironment() |
| mockMutexLock(env, mockResourceID, nil) |
| env.ExecuteWorkflow(sampleWorkflowWithMutex, mockResourceID) |
| |
| require.True(t, env.IsWorkflowCompleted()) |
| require.NoError(t, env.GetWorkflowError()) |
| env.AssertExpectations(t) |
| } |
| |
| // TODO(sunxiaodi@): Create unit test to test two ongoing workflows |
| // vying for the same resource and verify that the lock works. |
| |
| func TestMutexWorkflow_Success(t *testing.T) { |
| mockNamespace := "mockNamespace" |
| mockResourceID := "mockResourceID" |
| mockUnlockTimeout := 10 * time.Minute |
| mockSenderWorkflowID := "mockSenderWorkflowID" |
| |
| testSuite := &testsuite.WorkflowTestSuite{} |
| env := testSuite.NewTestWorkflowEnvironment() |
| env.RegisterDelayedCallback(func() { |
| env.SignalWorkflow(RequestLockSignalName, mockSenderWorkflowID) |
| }, time.Millisecond*0) |
| env.RegisterDelayedCallback(func() { |
| env.SignalWorkflow("unlock-event-mockSenderWorkflowID", "releaseLock") |
| }, time.Millisecond*0) |
| env.OnSignalExternalWorkflow(mock.Anything, mockSenderWorkflowID, "", AcquireLockSignalName, mock.Anything).Return(nil) |
| |
| env.ExecuteWorkflow(mutexWorkflow, mockNamespace, mockResourceID, mockUnlockTimeout) |
| |
| require.True(t, env.IsWorkflowCompleted()) |
| require.NoError(t, env.GetWorkflowError()) |
| } |
| |
| func TestMutexWorkflow_TimeoutSuccess(t *testing.T) { |
| mockNamespace := "mockNamespace" |
| mockResourceID := "mockResourceID" |
| mockUnlockTimeout := 10 * time.Minute |
| mockSenderWorkflowID := "mockSenderWorkflowID" |
| |
| testSuite := &testsuite.WorkflowTestSuite{} |
| env := testSuite.NewTestWorkflowEnvironment() |
| env.RegisterDelayedCallback(func() { |
| env.SignalWorkflow(RequestLockSignalName, mockSenderWorkflowID) |
| }, time.Millisecond*0) |
| env.OnSignalExternalWorkflow(mock.Anything, mockSenderWorkflowID, "", AcquireLockSignalName, mock.Anything).Return(nil) |
| |
| env.ExecuteWorkflow(mutexWorkflow, mockNamespace, mockResourceID, mockUnlockTimeout) |
| |
| require.True(t, env.IsWorkflowCompleted()) |
| require.NoError(t, env.GetWorkflowError()) |
| } |