Skip to content

Commit 59996ea

Browse files
authored
Part1: Record the data type change scenario for shadower/replayer test suite (#1227)
* Fixed the spelling of replay_test file. * Added one scenario for greeting workflow.changed activity signature to something incompatible with arguments * Added all the scenarios for CDNC-4316 * Added all the scenarios for CDNC-4316 * Added supporting documentation for the tests * Added supporting documentation for the workflow
1 parent 8fd9d91 commit 59996ea

File tree

3 files changed

+572
-0
lines changed

3 files changed

+572
-0
lines changed

test/replaytests/greetings.json

Lines changed: 341 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,341 @@
1+
[
2+
{
3+
"eventId": 1,
4+
"timestamp": 1678403666710299250,
5+
"eventType": "WorkflowExecutionStarted",
6+
"version": 0,
7+
"taskId": 2097152,
8+
"workflowExecutionStartedEventAttributes": {
9+
"workflowType": {
10+
"name": "greetings"
11+
},
12+
"taskList": {
13+
"name": "greetingsGroup"
14+
},
15+
"executionStartToCloseTimeoutSeconds": 60,
16+
"taskStartToCloseTimeoutSeconds": 60,
17+
"continuedExecutionRunId": "",
18+
"originalExecutionRunId": "b36e5edb-288e-4b98-9b66-2170238f8fc7",
19+
"identity": "8979@agautam-NV709R969P@@00c72a14-c860-4283-b900-a9f732951789",
20+
"firstExecutionRunId": "b36e5edb-288e-4b98-9b66-2170238f8fc7",
21+
"attempt": 0,
22+
"cronSchedule": "",
23+
"firstDecisionTaskBackoffSeconds": 0,
24+
"header": {}
25+
}
26+
},
27+
{
28+
"eventId": 2,
29+
"timestamp": 1678403666710498292,
30+
"eventType": "DecisionTaskScheduled",
31+
"version": 0,
32+
"taskId": 2097153,
33+
"decisionTaskScheduledEventAttributes": {
34+
"taskList": {
35+
"name": "greetingsGroup"
36+
},
37+
"startToCloseTimeoutSeconds": 60,
38+
"attempt": 0
39+
}
40+
},
41+
{
42+
"eventId": 3,
43+
"timestamp": 1678403666741684958,
44+
"eventType": "DecisionTaskStarted",
45+
"version": 0,
46+
"taskId": 2097158,
47+
"decisionTaskStartedEventAttributes": {
48+
"scheduledEventId": 2,
49+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
50+
"requestId": "fcaf3c19-b8a8-47c8-9373-1986cba56ae2"
51+
}
52+
},
53+
{
54+
"eventId": 4,
55+
"timestamp": 1678403666764246458,
56+
"eventType": "DecisionTaskCompleted",
57+
"version": 0,
58+
"taskId": 2097161,
59+
"decisionTaskCompletedEventAttributes": {
60+
"scheduledEventId": 2,
61+
"startedEventId": 3,
62+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
63+
"binaryChecksum": "4c71e1c8cb815b51ff74bc0dbbb86cfa"
64+
}
65+
},
66+
{
67+
"eventId": 5,
68+
"timestamp": 1678403666764500583,
69+
"eventType": "ActivityTaskScheduled",
70+
"version": 0,
71+
"taskId": 2097162,
72+
"activityTaskScheduledEventAttributes": {
73+
"activityId": "0",
74+
"activityType": {
75+
"name": "main.getGreetingActivity"
76+
},
77+
"taskList": {
78+
"name": "greetingsGroup"
79+
},
80+
"scheduleToCloseTimeoutSeconds": 60,
81+
"scheduleToStartTimeoutSeconds": 60,
82+
"startToCloseTimeoutSeconds": 60,
83+
"heartbeatTimeoutSeconds": 20,
84+
"decisionTaskCompletedEventId": 4,
85+
"header": {}
86+
}
87+
},
88+
{
89+
"eventId": 6,
90+
"timestamp": 1678403666764575958,
91+
"eventType": "ActivityTaskStarted",
92+
"version": 0,
93+
"taskId": 2097163,
94+
"activityTaskStartedEventAttributes": {
95+
"scheduledEventId": 5,
96+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
97+
"requestId": "0f95e6e3-f170-4f6c-bd92-720d2673fe2d",
98+
"attempt": 0,
99+
"lastFailureReason": ""
100+
}
101+
},
102+
{
103+
"eventId": 7,
104+
"timestamp": 1678403666779516000,
105+
"eventType": "ActivityTaskCompleted",
106+
"version": 0,
107+
"taskId": 2097166,
108+
"activityTaskCompletedEventAttributes": {
109+
"result": "IkhlbGxvIgo=",
110+
"scheduledEventId": 5,
111+
"startedEventId": 6,
112+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224"
113+
}
114+
},
115+
{
116+
"eventId": 8,
117+
"timestamp": 1678403666779571208,
118+
"eventType": "DecisionTaskScheduled",
119+
"version": 0,
120+
"taskId": 2097168,
121+
"decisionTaskScheduledEventAttributes": {
122+
"taskList": {
123+
"name": "agautam-NV709R969P:053628af-d5cb-4a19-80b2-fd09b728e9d9"
124+
},
125+
"startToCloseTimeoutSeconds": 60,
126+
"attempt": 0
127+
}
128+
},
129+
{
130+
"eventId": 9,
131+
"timestamp": 1678403666794335375,
132+
"eventType": "DecisionTaskStarted",
133+
"version": 0,
134+
"taskId": 2097172,
135+
"decisionTaskStartedEventAttributes": {
136+
"scheduledEventId": 8,
137+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
138+
"requestId": "87e9fac9-6aa6-4778-8b1e-4e7850545f6a"
139+
}
140+
},
141+
{
142+
"eventId": 10,
143+
"timestamp": 1678403666811876125,
144+
"eventType": "DecisionTaskCompleted",
145+
"version": 0,
146+
"taskId": 2097175,
147+
"decisionTaskCompletedEventAttributes": {
148+
"scheduledEventId": 8,
149+
"startedEventId": 9,
150+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
151+
"binaryChecksum": "4c71e1c8cb815b51ff74bc0dbbb86cfa"
152+
}
153+
},
154+
{
155+
"eventId": 11,
156+
"timestamp": 1678403666812034417,
157+
"eventType": "ActivityTaskScheduled",
158+
"version": 0,
159+
"taskId": 2097176,
160+
"activityTaskScheduledEventAttributes": {
161+
"activityId": "1",
162+
"activityType": {
163+
"name": "main.getNameActivity"
164+
},
165+
"taskList": {
166+
"name": "greetingsGroup"
167+
},
168+
"scheduleToCloseTimeoutSeconds": 60,
169+
"scheduleToStartTimeoutSeconds": 60,
170+
"startToCloseTimeoutSeconds": 60,
171+
"heartbeatTimeoutSeconds": 20,
172+
"decisionTaskCompletedEventId": 10,
173+
"header": {}
174+
}
175+
},
176+
{
177+
"eventId": 12,
178+
"timestamp": 1678403666812095833,
179+
"eventType": "ActivityTaskStarted",
180+
"version": 0,
181+
"taskId": 2097177,
182+
"activityTaskStartedEventAttributes": {
183+
"scheduledEventId": 11,
184+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
185+
"requestId": "8f2bf260-1cfa-4531-b054-cc8cacbe7b06",
186+
"attempt": 0,
187+
"lastFailureReason": ""
188+
}
189+
},
190+
{
191+
"eventId": 13,
192+
"timestamp": 1678403666823607458,
193+
"eventType": "ActivityTaskCompleted",
194+
"version": 0,
195+
"taskId": 2097180,
196+
"activityTaskCompletedEventAttributes": {
197+
"result": "IkNhZGVuY2UiCg==",
198+
"scheduledEventId": 11,
199+
"startedEventId": 12,
200+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224"
201+
}
202+
},
203+
{
204+
"eventId": 14,
205+
"timestamp": 1678403666823669292,
206+
"eventType": "DecisionTaskScheduled",
207+
"version": 0,
208+
"taskId": 2097182,
209+
"decisionTaskScheduledEventAttributes": {
210+
"taskList": {
211+
"name": "agautam-NV709R969P:053628af-d5cb-4a19-80b2-fd09b728e9d9"
212+
},
213+
"startToCloseTimeoutSeconds": 60,
214+
"attempt": 0
215+
}
216+
},
217+
{
218+
"eventId": 15,
219+
"timestamp": 1678403666837054083,
220+
"eventType": "DecisionTaskStarted",
221+
"version": 0,
222+
"taskId": 2097186,
223+
"decisionTaskStartedEventAttributes": {
224+
"scheduledEventId": 14,
225+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
226+
"requestId": "519ec075-5402-4c58-b19d-0eddc15be712"
227+
}
228+
},
229+
{
230+
"eventId": 16,
231+
"timestamp": 1678403666851767917,
232+
"eventType": "DecisionTaskCompleted",
233+
"version": 0,
234+
"taskId": 2097189,
235+
"decisionTaskCompletedEventAttributes": {
236+
"scheduledEventId": 14,
237+
"startedEventId": 15,
238+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
239+
"binaryChecksum": "4c71e1c8cb815b51ff74bc0dbbb86cfa"
240+
}
241+
},
242+
{
243+
"eventId": 17,
244+
"timestamp": 1678403666851909542,
245+
"eventType": "ActivityTaskScheduled",
246+
"version": 0,
247+
"taskId": 2097190,
248+
"activityTaskScheduledEventAttributes": {
249+
"activityId": "2",
250+
"activityType": {
251+
"name": "main.sayGreetingActivity"
252+
},
253+
"taskList": {
254+
"name": "greetingsGroup"
255+
},
256+
"input": "IkhlbGxvIgoiQ2FkZW5jZSIK",
257+
"scheduleToCloseTimeoutSeconds": 60,
258+
"scheduleToStartTimeoutSeconds": 60,
259+
"startToCloseTimeoutSeconds": 60,
260+
"heartbeatTimeoutSeconds": 20,
261+
"decisionTaskCompletedEventId": 16,
262+
"header": {}
263+
}
264+
},
265+
{
266+
"eventId": 18,
267+
"timestamp": 1678403666851975417,
268+
"eventType": "ActivityTaskStarted",
269+
"version": 0,
270+
"taskId": 2097191,
271+
"activityTaskStartedEventAttributes": {
272+
"scheduledEventId": 17,
273+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
274+
"requestId": "8f8d541c-96fe-4c96-9af7-70a70a9be096",
275+
"attempt": 0,
276+
"lastFailureReason": ""
277+
}
278+
},
279+
{
280+
"eventId": 19,
281+
"timestamp": 1678403666864198625,
282+
"eventType": "ActivityTaskCompleted",
283+
"version": 0,
284+
"taskId": 2097194,
285+
"activityTaskCompletedEventAttributes": {
286+
"result": "IkdyZWV0aW5nOiBIZWxsbyBDYWRlbmNlIVxuIgo=",
287+
"scheduledEventId": 17,
288+
"startedEventId": 18,
289+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224"
290+
}
291+
},
292+
{
293+
"eventId": 20,
294+
"timestamp": 1678403666864249708,
295+
"eventType": "DecisionTaskScheduled",
296+
"version": 0,
297+
"taskId": 2097196,
298+
"decisionTaskScheduledEventAttributes": {
299+
"taskList": {
300+
"name": "agautam-NV709R969P:053628af-d5cb-4a19-80b2-fd09b728e9d9"
301+
},
302+
"startToCloseTimeoutSeconds": 60,
303+
"attempt": 0
304+
}
305+
},
306+
{
307+
"eventId": 21,
308+
"timestamp": 1678403666877005167,
309+
"eventType": "DecisionTaskStarted",
310+
"version": 0,
311+
"taskId": 2097200,
312+
"decisionTaskStartedEventAttributes": {
313+
"scheduledEventId": 20,
314+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
315+
"requestId": "919b570f-0ebf-4b88-94dd-cc183c898ad5"
316+
}
317+
},
318+
{
319+
"eventId": 22,
320+
"timestamp": 1678403666891816208,
321+
"eventType": "DecisionTaskCompleted",
322+
"version": 0,
323+
"taskId": 2097203,
324+
"decisionTaskCompletedEventAttributes": {
325+
"scheduledEventId": 20,
326+
"startedEventId": 21,
327+
"identity": "8950@agautam-NV709R969P@greetingsGroup@4e847c85-7deb-45f3-96e6-2fbd3655a224",
328+
"binaryChecksum": "4c71e1c8cb815b51ff74bc0dbbb86cfa"
329+
}
330+
},
331+
{
332+
"eventId": 23,
333+
"timestamp": 1678403666891938750,
334+
"eventType": "WorkflowExecutionCompleted",
335+
"version": 0,
336+
"taskId": 2097204,
337+
"workflowExecutionCompletedEventAttributes": {
338+
"decisionTaskCompletedEventId": 22
339+
}
340+
}
341+
]

test/replaytests/replay_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"testing"
2626

2727
"github.com/stretchr/testify/require"
28+
"go.uber.org/cadence/activity"
2829
"go.uber.org/cadence/worker"
2930
"go.uber.org/cadence/workflow"
3031
"go.uber.org/zap/zaptest"
@@ -51,3 +52,39 @@ func TestReplayChildWorkflowBugBackport(t *testing.T) {
5152
err := replayer.ReplayWorkflowHistoryFromJSONFile(zaptest.NewLogger(t), "child_bug.json")
5253
require.NoError(t, err)
5354
}
55+
56+
func TestGreetingsWorkflow(t *testing.T) {
57+
replayer := worker.NewWorkflowReplayer()
58+
replayer.RegisterWorkflowWithOptions(greetingsWorkflow, workflow.RegisterOptions{Name: "greetings"})
59+
err := replayer.ReplayWorkflowHistoryFromJSONFile(zaptest.NewLogger(t), "greetings.json")
60+
require.NoError(t, err)
61+
}
62+
63+
// Should have failed but passed. Maybe, because the result recorded in history still matches the return type of the workflow.
64+
func TestGreetingsWorkflow3(t *testing.T) {
65+
replayer := worker.NewWorkflowReplayer()
66+
activity.RegisterWithOptions(getNameActivity3, activity.RegisterOptions{Name: "main.getNameActivity", DisableAlreadyRegisteredCheck: true})
67+
replayer.RegisterWorkflowWithOptions(greetingsWorkflow3, workflow.RegisterOptions{Name: "greetings"})
68+
err := replayer.ReplayWorkflowHistoryFromJSONFile(zaptest.NewLogger(t), "greetings.json")
69+
require.NoError(t, err)
70+
}
71+
72+
// Fails because the expected signature was different from history.
73+
func TestGreetingsWorkflow4(t *testing.T) {
74+
replayer := worker.NewWorkflowReplayer()
75+
activity.RegisterWithOptions(getNameActivity4, activity.RegisterOptions{Name: "main.getNameActivity", DisableAlreadyRegisteredCheck: true})
76+
replayer.RegisterWorkflowWithOptions(greetingsWorkflow4, workflow.RegisterOptions{Name: "greetings"})
77+
err := replayer.ReplayWorkflowHistoryFromJSONFile(zaptest.NewLogger(t), "greetings.json")
78+
require.NoError(t, err)
79+
}
80+
81+
// Fails with a non deterministic error. This passes in cadence_samples because it's registered in Helper.
82+
// To test it on cadence_samples change the https://github.com/uber-common/cadence-samples/blob/master/cmd/samples/recipes/greetings/greetings_workflow.go
83+
// to include the extra return types in getNameActivity.
84+
func TestGreetingsWorkflow2(t *testing.T) {
85+
replayer := worker.NewWorkflowReplayer()
86+
activity.RegisterWithOptions(getNameActivity2, activity.RegisterOptions{Name: "main.getNameActivity", DisableAlreadyRegisteredCheck: true})
87+
replayer.RegisterWorkflowWithOptions(greetingsWorkflow2, workflow.RegisterOptions{Name: "greetings"})
88+
err := replayer.ReplayWorkflowHistoryFromJSONFile(zaptest.NewLogger(t), "greetings.json")
89+
require.NoError(t, err)
90+
}

0 commit comments

Comments
 (0)