Skip to content

Commit 515c90d

Browse files
committed
Add test replaying history with VERSION_WAIT_FOR_MARKER set in
`sdkMetadata.langUsedFlags`
1 parent 908aa38 commit 515c90d

File tree

2 files changed

+305
-0
lines changed

2 files changed

+305
-0
lines changed

temporal-sdk/src/test/java/io/temporal/workflow/versionTests/GetVersionInterleavedUpdateReplayTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.temporal.internal.history.VersionMarkerUtils;
2020
import io.temporal.internal.statemachines.WorkflowStateMachines;
2121
import io.temporal.testing.TestWorkflowEnvironment;
22+
import io.temporal.testing.WorkflowHistoryLoader;
2223
import io.temporal.testing.WorkflowReplayer;
2324
import io.temporal.testing.internal.SDKTestWorkflowRule;
2425
import io.temporal.worker.Worker;
@@ -44,6 +45,8 @@
4445
public class GetVersionInterleavedUpdateReplayTest {
4546
private static final String HISTORY_RESOURCE =
4647
"testGetVersionInterleavedUpdateReplayHistory.json";
48+
private static final String WAIT_FOR_MARKER_HISTORY_RESOURCE =
49+
"testGetVersionInterleavedUpdateReplayWaitForMarkerHistory.json";
4750
public static final String TASK_QUEUE = "get-version-interleaved-update-replay";
4851
private static final String EXPECTED_FIRST_CHANGE_ID = "ChangeId1";
4952
private static final String EXPECTED_SECOND_CHANGE_ID = "ChangeId2";
@@ -91,6 +94,25 @@ public void testReproducedHistoryReplays() throws Exception {
9194
WorkflowReplayer.replayWorkflowExecution(history, GreetingWorkflowImpl.class);
9295
}
9396

97+
@Test
98+
public void testReplayHistoryWithWaitForMarkerFlagReplaysWithoutDefaultEnable() throws Exception {
99+
WorkflowExecutionHistory history =
100+
WorkflowHistoryLoader.readHistoryFromResource(WAIT_FOR_MARKER_HISTORY_RESOURCE);
101+
assertTrue(
102+
"The recorded history must advertise VERSION_WAIT_FOR_MARKER.",
103+
hasSdkFlag(history, SdkFlag.VERSION_WAIT_FOR_MARKER));
104+
105+
List<SdkFlag> savedInitialFlags = WorkflowStateMachines.initialFlags;
106+
List<SdkFlag> replayFlags = new ArrayList<>(savedInitialFlags);
107+
replayFlags.remove(SdkFlag.VERSION_WAIT_FOR_MARKER);
108+
WorkflowStateMachines.initialFlags = Collections.unmodifiableList(replayFlags);
109+
try {
110+
WorkflowReplayer.replayWorkflowExecution(history, GreetingWorkflowImpl.class);
111+
} finally {
112+
WorkflowStateMachines.initialFlags = savedInitialFlags;
113+
}
114+
}
115+
94116
public static WorkflowExecutionHistory captureReplayableHistory() {
95117
List<SdkFlag> savedInitialFlags = WorkflowStateMachines.initialFlags;
96118
List<SdkFlag> replayableFlags = new ArrayList<>(savedInitialFlags);
Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
{
2+
"events": [
3+
{
4+
"eventId": "1",
5+
"eventTime": "2026-04-01T20:02:55.362Z",
6+
"eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED",
7+
"workflowExecutionStartedEventAttributes": {
8+
"workflowType": {
9+
"name": "GreetingWorkflow"
10+
},
11+
"taskQueue": {
12+
"name": "get-version-interleaved-update-replay"
13+
},
14+
"input": {
15+
"payloads": [
16+
{
17+
"metadata": {
18+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
19+
},
20+
"data": "IlRlbXBvcmFsIg\u003d\u003d"
21+
}
22+
]
23+
},
24+
"workflowExecutionTimeout": "315360000s",
25+
"workflowRunTimeout": "315360000s",
26+
"workflowTaskTimeout": "10s",
27+
"originalExecutionRunId": "f9105a8c-5934-4674-a3bf-b537ade1ef06",
28+
"identity": "46549@ambrose.local",
29+
"firstExecutionRunId": "f9105a8c-5934-4674-a3bf-b537ade1ef06",
30+
"attempt": 1,
31+
"firstWorkflowTaskBackoff": "0s",
32+
"header": {}
33+
}
34+
},
35+
{
36+
"eventId": "2",
37+
"eventTime": "2026-04-01T20:02:55.362Z",
38+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED",
39+
"workflowTaskScheduledEventAttributes": {
40+
"taskQueue": {
41+
"name": "get-version-interleaved-update-replay"
42+
},
43+
"startToCloseTimeout": "10s",
44+
"attempt": 1
45+
}
46+
},
47+
{
48+
"eventId": "3",
49+
"eventTime": "2026-04-01T20:02:55.368Z",
50+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED",
51+
"workflowTaskStartedEventAttributes": {
52+
"scheduledEventId": "2",
53+
"identity": "46549@ambrose.local"
54+
}
55+
},
56+
{
57+
"eventId": "4",
58+
"eventTime": "2026-04-01T20:02:55.423Z",
59+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED",
60+
"workflowTaskCompletedEventAttributes": {
61+
"scheduledEventId": "2",
62+
"identity": "46549@ambrose.local",
63+
"sdkMetadata": {
64+
"langUsedFlags": [
65+
1,
66+
2,
67+
3,
68+
5
69+
],
70+
"sdkName": "temporal-java",
71+
"sdkVersion": "1.34.0"
72+
},
73+
"meteringMetadata": {}
74+
}
75+
},
76+
{
77+
"eventId": "5",
78+
"eventTime": "2026-04-01T20:02:55.423Z",
79+
"eventType": "EVENT_TYPE_MARKER_RECORDED",
80+
"markerRecordedEventAttributes": {
81+
"markerName": "Version",
82+
"details": {
83+
"changeId": {
84+
"payloads": [
85+
{
86+
"metadata": {
87+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
88+
},
89+
"data": "IkNoYW5nZUlkMSI\u003d"
90+
}
91+
]
92+
},
93+
"version": {
94+
"payloads": [
95+
{
96+
"metadata": {
97+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
98+
},
99+
"data": "MQ\u003d\u003d"
100+
}
101+
]
102+
}
103+
},
104+
"workflowTaskCompletedEventId": "3"
105+
}
106+
},
107+
{
108+
"eventId": "6",
109+
"eventTime": "2026-04-01T20:02:55.423Z",
110+
"eventType": "EVENT_TYPE_MARKER_RECORDED",
111+
"markerRecordedEventAttributes": {
112+
"markerName": "Version",
113+
"details": {
114+
"changeId": {
115+
"payloads": [
116+
{
117+
"metadata": {
118+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
119+
},
120+
"data": "IkNoYW5nZUlkMiI\u003d"
121+
}
122+
]
123+
},
124+
"version": {
125+
"payloads": [
126+
{
127+
"metadata": {
128+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
129+
},
130+
"data": "MQ\u003d\u003d"
131+
}
132+
]
133+
}
134+
},
135+
"workflowTaskCompletedEventId": "3"
136+
}
137+
},
138+
{
139+
"eventId": "7",
140+
"eventTime": "2026-04-01T20:02:55.423Z",
141+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED",
142+
"workflowTaskScheduledEventAttributes": {
143+
"taskQueue": {
144+
"name": "get-version-interleaved-update-replay"
145+
},
146+
"startToCloseTimeout": "10s",
147+
"attempt": 2
148+
}
149+
},
150+
{
151+
"eventId": "8",
152+
"eventTime": "2026-04-01T20:02:55.423Z",
153+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED",
154+
"workflowTaskStartedEventAttributes": {
155+
"scheduledEventId": "7",
156+
"identity": "46549@ambrose.local"
157+
}
158+
},
159+
{
160+
"eventId": "9",
161+
"eventTime": "2026-04-01T20:02:55.425Z",
162+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED",
163+
"workflowTaskCompletedEventAttributes": {
164+
"scheduledEventId": "7",
165+
"identity": "46549@ambrose.local",
166+
"sdkMetadata": {
167+
"sdkName": "temporal-java",
168+
"sdkVersion": "1.34.0"
169+
},
170+
"meteringMetadata": {}
171+
}
172+
},
173+
{
174+
"eventId": "10",
175+
"eventTime": "2026-04-01T20:02:55.428Z",
176+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED",
177+
"workflowTaskScheduledEventAttributes": {
178+
"taskQueue": {
179+
"name": "get-version-interleaved-update-replay"
180+
},
181+
"startToCloseTimeout": "10s",
182+
"attempt": 1
183+
}
184+
},
185+
{
186+
"eventId": "11",
187+
"eventTime": "2026-04-01T20:02:55.428Z",
188+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED",
189+
"workflowTaskStartedEventAttributes": {
190+
"scheduledEventId": "10",
191+
"identity": "46549@ambrose.local"
192+
}
193+
},
194+
{
195+
"eventId": "12",
196+
"eventTime": "2026-04-01T20:02:55.443Z",
197+
"eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED",
198+
"workflowTaskCompletedEventAttributes": {
199+
"scheduledEventId": "10",
200+
"identity": "46549@ambrose.local",
201+
"sdkMetadata": {
202+
"sdkName": "temporal-java",
203+
"sdkVersion": "1.34.0"
204+
},
205+
"meteringMetadata": {}
206+
}
207+
},
208+
{
209+
"eventId": "13",
210+
"eventTime": "2026-04-01T20:02:55.443Z",
211+
"eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED",
212+
"workflowExecutionUpdateAcceptedEventAttributes": {
213+
"protocolInstanceId": "4d85fa45-8cae-466a-b92e-196ceca2fd77",
214+
"acceptedRequestMessageId": "4d85fa45-8cae-466a-b92e-196ceca2fd77/request",
215+
"acceptedRequestSequencingEventId": "10",
216+
"acceptedRequest": {
217+
"meta": {
218+
"updateId": "4d85fa45-8cae-466a-b92e-196ceca2fd77",
219+
"identity": "46549@ambrose.local"
220+
},
221+
"input": {
222+
"header": {},
223+
"name": "notify",
224+
"args": {
225+
"payloads": [
226+
{
227+
"metadata": {
228+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
229+
},
230+
"data": "InVwZGF0ZSI\u003d"
231+
}
232+
]
233+
}
234+
}
235+
}
236+
}
237+
},
238+
{
239+
"eventId": "14",
240+
"eventTime": "2026-04-01T20:02:55.443Z",
241+
"eventType": "EVENT_TYPE_MARKER_RECORDED",
242+
"markerRecordedEventAttributes": {
243+
"markerName": "SideEffect",
244+
"details": {
245+
"data": {
246+
"payloads": [
247+
{
248+
"metadata": {
249+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
250+
},
251+
"data": "IjRjN2JhZDI5LWVkMmYtNDZjNS1hZTY5LTUwOWJhMmFmOWIzYSI\u003d"
252+
}
253+
]
254+
}
255+
},
256+
"workflowTaskCompletedEventId": "11"
257+
}
258+
},
259+
{
260+
"eventId": "15",
261+
"eventTime": "2026-04-01T20:02:55.443Z",
262+
"eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED",
263+
"workflowExecutionUpdateCompletedEventAttributes": {
264+
"meta": {
265+
"updateId": "4d85fa45-8cae-466a-b92e-196ceca2fd77",
266+
"identity": "46549@ambrose.local"
267+
},
268+
"outcome": {
269+
"success": {
270+
"payloads": [
271+
{
272+
"metadata": {
273+
"encoding": "anNvbi9wbGFpbg\u003d\u003d"
274+
},
275+
"data": "IndvcmtzIg\u003d\u003d"
276+
}
277+
]
278+
}
279+
}
280+
}
281+
}
282+
]
283+
}

0 commit comments

Comments
 (0)