From 6d4ec2df9f94389e64949c67465bb077b420017c Mon Sep 17 00:00:00 2001 From: Joakim Recht Date: Wed, 21 Feb 2024 23:45:05 +0100 Subject: [PATCH 1/2] Make it possible to cancel workflows by ID when testing (#1392) Make it possible to cancel workflows by ID when testing --- internal/internal_workflow_testsuite.go | 8 +++- internal/internal_workflow_testsuite_test.go | 40 ++++++++++++++++++++ internal/workflow_testsuite.go | 5 +++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/internal/internal_workflow_testsuite.go b/internal/internal_workflow_testsuite.go index a5da99996..f851c5482 100644 --- a/internal/internal_workflow_testsuite.go +++ b/internal/internal_workflow_testsuite.go @@ -2427,12 +2427,16 @@ func (env *testWorkflowEnvironmentImpl) getActivityInfo(activityID ActivityID, a } func (env *testWorkflowEnvironmentImpl) cancelWorkflow(callback ResultHandler) { + env.cancelWorkflowByID(env.workflowInfo.WorkflowExecution.ID, env.workflowInfo.WorkflowExecution.RunID, callback) +} + +func (env *testWorkflowEnvironmentImpl) cancelWorkflowByID(workflowID string, runID string, callback ResultHandler) { env.postCallback(func() { // RequestCancelWorkflow needs to be run in main thread env.RequestCancelExternalWorkflow( env.workflowInfo.Namespace, - env.workflowInfo.WorkflowExecution.ID, - env.workflowInfo.WorkflowExecution.RunID, + workflowID, + runID, callback, ) }, true) diff --git a/internal/internal_workflow_testsuite_test.go b/internal/internal_workflow_testsuite_test.go index 9644480c1..e9c413263 100644 --- a/internal/internal_workflow_testsuite_test.go +++ b/internal/internal_workflow_testsuite_test.go @@ -602,6 +602,46 @@ func (s *WorkflowTestSuiteUnitTest) Test_WorkflowCancellation() { s.True(errors.As(err, &err1)) } +func (s *WorkflowTestSuiteUnitTest) Test_ChildWorkflowCancellation() { + childWorkflowFn := func(ctx Context) error { + ctx = WithActivityOptions(ctx, s.activityOptions) + f := ExecuteActivity(ctx, testActivityHeartbeat, "msg1", time.Second*10) + err := f.Get(ctx, nil) // wait for result + return err + } + + childID := "child_workflow_id" + workflowFn := func(ctx Context) (string, error) { + ctx = WithChildWorkflowOptions(ctx, ChildWorkflowOptions{ + WorkflowID: childID, + }) + err := ExecuteChildWorkflow(ctx, childWorkflowFn).Get(ctx, nil) + if err != nil { + return err.Error(), nil + } + return "", nil + } + + env := s.NewTestWorkflowEnvironment() + env.RegisterDelayedCallback(func() { + env.CancelWorkflowByID(childID, "") + }, time.Second) + + env.RegisterWorkflow(workflowFn) + env.RegisterWorkflow(childWorkflowFn) + env.RegisterActivity(testActivityHeartbeat) + + env.ExecuteWorkflow(workflowFn) + + s.True(env.IsWorkflowCompleted()) + err := env.GetWorkflowError() + s.NoError(err) + + var res string + s.NoError(env.GetWorkflowResult(&res)) + s.Contains(res, "canceled") +} + func testWorkflowHello(ctx Context) (string, error) { ao := ActivityOptions{ ScheduleToStartTimeout: time.Minute, diff --git a/internal/workflow_testsuite.go b/internal/workflow_testsuite.go index 9104d7468..811290c56 100644 --- a/internal/workflow_testsuite.go +++ b/internal/workflow_testsuite.go @@ -861,6 +861,11 @@ func (e *TestWorkflowEnvironment) CancelWorkflow() { e.impl.cancelWorkflow(func(result *commonpb.Payloads, err error) {}) } +// CancelWorkflowByID requests cancellation (through workflow Context) to the specified workflow. +func (e *TestWorkflowEnvironment) CancelWorkflowByID(workflowID string, runID string) { + e.impl.cancelWorkflowByID(workflowID, runID, func(result *commonpb.Payloads, err error) {}) +} + // SignalWorkflow sends signal to the currently running test workflow. func (e *TestWorkflowEnvironment) SignalWorkflow(name string, input interface{}) { e.impl.signalWorkflow(name, input, true) From a71e4c47a828ae9fc8b9dfcc5e9b605b83caa9e2 Mon Sep 17 00:00:00 2001 From: Quinn Klassen Date: Thu, 22 Feb 2024 21:44:35 -0800 Subject: [PATCH 2/2] Update CI to Go lang 1.22 (#1389) --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3aba8452..dc49e2a3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,10 +10,10 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - go-version: ["1.20", "1.21"] + go-version: ["1.21", "1.22"] include: - os: ubuntu-latest - go-version: "1.21" + go-version: "1.22" # We only want to upload coverage on a single target uploadCoverage: true # We only want to check docker compose on a single target @@ -87,7 +87,7 @@ jobs: cloud-test: strategy: matrix: - go-version: ["1.20", "1.21"] + go-version: ["1.21", "1.22"] # Try to avoid running tests in parallel to avoid workflow ID conflict max-parallel: 1 # Only supported in non-fork runs, since secrets are not available in forks.