Skip to content

Commit 6739dd6

Browse files
authored
Updated expense workflow timeout to 12 mins (#88)
* Recalibrating expense workflow timeout to 12 mins
1 parent 2417a4e commit 6739dd6

File tree

3 files changed

+107
-5
lines changed

3 files changed

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

0 commit comments

Comments
 (0)