blob: f267ba206b84a03e1a63c97479d0ef68fc4896cc [file] [log] [blame]
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())
}