From 72dadb920be49baab8c6098638cb1822bfd6f2b8 Mon Sep 17 00:00:00 2001 From: arthurguber <38018478+arthurguber@users.noreply.github.com> Date: Tue, 17 Apr 2018 13:17:59 -0700 Subject: [PATCH] Dump all registered activities when activity not found (#437) This commit modifies task handler in the client SDK to dump all activities registered when a workflow executes an activity whose name is not found, for example, due to a typo when specifying the activity by name. --- internal/error_test.go | 16 ++++++++++++++-- internal/internal_task_handlers.go | 10 +++++++++- internal/internal_workflow_testsuite.go | 5 ++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/internal/error_test.go b/internal/error_test.go index 4304a0e3c..39977b981 100644 --- a/internal/error_test.go +++ b/internal/error_test.go @@ -22,11 +22,11 @@ package internal import ( "errors" - "testing" - + "fmt" "github.com/stretchr/testify/require" "go.uber.org/cadence/.gen/go/shared" "go.uber.org/zap" + "testing" ) const ( @@ -72,6 +72,18 @@ func Test_ActivityPanic(t *testing.T) { require.Equal(t, "panic-blabla", panicErr.Error()) } +func Test_ActivityNotRegistered(t *testing.T) { + registeredActivityFn, unregisteredActivitFn := "RegisteredActivity", "UnregisteredActivityFn" + RegisterActivityWithOptions(func() error { return nil }, RegisterActivityOptions{Name: registeredActivityFn}) + s := &WorkflowTestSuite{} + s.SetLogger(zap.NewNop()) + env := s.NewTestActivityEnvironment() + _, err := env.ExecuteActivity(unregisteredActivitFn) + require.Error(t, err) + require.Contains(t, err.Error(), fmt.Sprintf("unable to find activityType=%v", unregisteredActivitFn)) + require.Contains(t, err.Error(), registeredActivityFn) +} + func Test_WorkflowError(t *testing.T) { errorWorkflowFn := func(ctx Context, i int) error { return errs[i][0] diff --git a/internal/internal_task_handlers.go b/internal/internal_task_handlers.go index 701221f5e..3119f34fb 100644 --- a/internal/internal_task_handlers.go +++ b/internal/internal_task_handlers.go @@ -1240,7 +1240,8 @@ func (ath *activityTaskHandlerImpl) Execute(taskList string, t *s.PollForActivit activityImplementation := ath.getActivity(activityType.GetName()) if activityImplementation == nil { // Couldn't find the activity implementation. - return nil, fmt.Errorf("unable to find activityType=%v", activityType.GetName()) + supported := strings.Join(ath.getRegisteredActivityNames(), ", ") + return nil, fmt.Errorf("unable to find activityType=%v. Supported types: [%v]", activityType.GetName(), supported) } // panic handler @@ -1282,6 +1283,13 @@ func (ath *activityTaskHandlerImpl) getActivity(name string) activity { return nil } +func (ath *activityTaskHandlerImpl) getRegisteredActivityNames() (activityNames []string) { + for _, a := range ath.hostEnv.activityFuncMap { + activityNames = append(activityNames, a.ActivityType().Name) + } + return +} + func createNewDecision(decisionType s.DecisionType) *s.Decision { return &s.Decision{ DecisionType: common.DecisionTypePtr(decisionType), diff --git a/internal/internal_workflow_testsuite.go b/internal/internal_workflow_testsuite.go index bd32cf6a5..6034e6f6e 100644 --- a/internal/internal_workflow_testsuite.go +++ b/internal/internal_workflow_testsuite.go @@ -407,8 +407,11 @@ func (env *testWorkflowEnvironmentImpl) executeActivity( taskHandler := env.newTestActivityTaskHandler(defaultTestTaskList) result, err := taskHandler.Execute(defaultTestTaskList, task) if err != nil { - panic(err) + topLine := fmt.Sprintf("activity for %s [panic]:", defaultTestTaskList) + st := getStackTraceRaw(topLine, 7, 0) + return nil, newPanicError(err.Error(), st) } + if result == ErrActivityResultPending { return nil, ErrActivityResultPending }