Skip to content

Commit fcf70b0

Browse files
committed
Recalibrating expense workflow timeout to 12 mins
1 parent df6f7bd commit fcf70b0

File tree

3 files changed

+110
-5
lines changed

3 files changed

+110
-5
lines changed

cmd/samples/expense/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ func startWorkflow(h *common.SampleHelper, expenseID string) {
2626
workflowOptions := client.StartWorkflowOptions{
2727
ID: "expense_" + uuid.New(),
2828
TaskList: ApplicationName,
29-
ExecutionStartToCloseTimeout: time.Minute,
30-
DecisionTaskStartToCloseTimeout: time.Minute,
29+
ExecutionStartToCloseTimeout: time.Minute * 12,
30+
DecisionTaskStartToCloseTimeout: time.Minute * 12,
3131
}
3232
h.StartWorkflow(workflowOptions, sampleExpenseWorkflow, expenseID)
3333
}

cmd/samples/expense/workflow.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ func sampleExpenseWorkflow(ctx workflow.Context, expenseID string) (result strin
3333

3434
// step 2, wait for the expense report to be approved (or rejected)
3535
ao = workflow.ActivityOptions{
36-
ScheduleToStartTimeout: 10 * time.Minute,
37-
StartToCloseTimeout: 10 * time.Minute,
36+
ScheduleToStartTimeout: time.Minute,
37+
StartToCloseTimeout: 4 * time.Minute,
3838
}
3939
ctx2 := workflow.WithActivityOptions(ctx, ao)
40-
// Notice that we set the timeout to be 10 minutes for this sample demo. If the expected time for the activity to
40+
// Notice that we set the timeout to be 4 minutes for this sample demo. If the expected time for the activity to
4141
// complete (waiting for human to approve the request) is longer, you should set the timeout accordingly so the
4242
// cadence system will wait accordingly. Otherwise, cadence system could mark the activity as failure by timeout.
4343
var status string

cmd/samples/expense/workflow_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"errors"
45
"io"
56
"net/http"
67
"net/http/httptest"
@@ -50,6 +51,110 @@ func (s *UnitTestSuite) Test_WorkflowWithMockActivities() {
5051
s.Equal("COMPLETED", workflowResult)
5152
}
5253

54+
func (s *UnitTestSuite) Test_TimeoutWithMockActivities() {
55+
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
56+
// s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("APPROVED", nil).Once()
57+
// s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(nil).Once()
58+
s.env.SetWorkflowTimeout(time.Microsecond * 500)
59+
s.env.SetTestTimeout(time.Minute * 10)
60+
61+
s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")
62+
63+
var workflowResult string
64+
err := s.env.GetWorkflowResult(&workflowResult)
65+
s.Equal("TimeoutType: SCHEDULE_TO_CLOSE", err.Error())
66+
s.Empty(workflowResult)
67+
}
68+
69+
func (s *UnitTestSuite) Test_WorkflowStatusRejected() {
70+
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
71+
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("REJECTED", nil).Once()
72+
// s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(nil).Once()
73+
74+
s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")
75+
76+
s.True(s.env.IsWorkflowCompleted())
77+
s.NoError(s.env.GetWorkflowError())
78+
var workflowResult string
79+
err := s.env.GetWorkflowResult(&workflowResult)
80+
s.NoError(err)
81+
s.Empty(workflowResult)
82+
}
83+
84+
func (s *UnitTestSuite) Test_WorkflowStatusCancelled() {
85+
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
86+
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("CANCELLED", nil).Once()
87+
88+
s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")
89+
90+
s.True(s.env.IsWorkflowCompleted())
91+
s.NoError(s.env.GetWorkflowError())
92+
var workflowResult string
93+
err := s.env.GetWorkflowResult(&workflowResult)
94+
s.NoError(err)
95+
s.Empty(workflowResult)
96+
}
97+
98+
func (s *UnitTestSuite) Test_WorkflowStatusApprovedWithPaymentError() {
99+
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
100+
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("APPROVED", nil).Once()
101+
s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(errors.New("payment error")).Once()
102+
103+
s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")
104+
105+
s.True(s.env.IsWorkflowCompleted())
106+
s.Error(s.env.GetWorkflowError())
107+
var workflowResult string
108+
err := s.env.GetWorkflowResult(&workflowResult)
109+
s.Equal("payment error", err.Error())
110+
s.Empty(workflowResult)
111+
}
112+
113+
func (s *UnitTestSuite) Test_CreateActivityFailed() {
114+
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(errors.New("expense id is empty")).Once()
115+
116+
s.env.ExecuteWorkflow(sampleExpenseWorkflow, "")
117+
118+
s.True(s.env.IsWorkflowCompleted())
119+
s.Error(s.env.GetWorkflowError())
120+
var workflowResult string
121+
122+
err := s.env.GetWorkflowResult(&workflowResult)
123+
s.Equal("expense id is empty", err.Error())
124+
s.Empty(workflowResult)
125+
}
126+
127+
func (s *UnitTestSuite) Test_WaitForDecisionActivityFailed() {
128+
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
129+
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("", errors.New("failed to get decision")).Once()
130+
131+
s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")
132+
133+
s.True(s.env.IsWorkflowCompleted())
134+
s.Error(s.env.GetWorkflowError())
135+
var workflowResult string
136+
137+
err := s.env.GetWorkflowResult(&workflowResult)
138+
s.Equal("failed to get decision", err.Error())
139+
s.Empty(workflowResult)
140+
}
141+
142+
func (s *UnitTestSuite) Test_PaymentActivityFailed() {
143+
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
144+
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("APPROVED", nil).Once()
145+
s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(errors.New("payment failed")).Once()
146+
147+
s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")
148+
149+
s.True(s.env.IsWorkflowCompleted())
150+
s.Error(s.env.GetWorkflowError())
151+
var workflowResult string
152+
153+
err := s.env.GetWorkflowResult(&workflowResult)
154+
s.Equal("payment failed", err.Error())
155+
s.Empty(workflowResult)
156+
}
157+
53158
func (s *UnitTestSuite) Test_WorkflowWithMockServer() {
54159
// setup mock expense server
55160
handler := func(w http.ResponseWriter, r *http.Request) {

0 commit comments

Comments
 (0)