Skip to content

Commit b457361

Browse files
authored
chore(worker): add unit test for decision iterator (#1035)
* chore(worker): add unit test for decision iterator Signed-off-by: Shijie Sheng <[email protected]> * lint Signed-off-by: Shijie Sheng <[email protected]> --------- Signed-off-by: Shijie Sheng <[email protected]>
1 parent b496a49 commit b457361

File tree

1 file changed

+309
-0
lines changed

1 file changed

+309
-0
lines changed
Lines changed: 309 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,309 @@
1+
/*
2+
* Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Modifications copyright (C) 2017 Uber Technologies, Inc.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not
7+
* use this file except in compliance with the License. A copy of the License is
8+
* located at
9+
*
10+
* http://aws.amazon.com/apache2.0
11+
*
12+
* or in the "license" file accompanying this file. This file is distributed on
13+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
14+
* express or implied. See the License for the specific language governing
15+
* permissions and limitations under the License.
16+
*/
17+
18+
package com.uber.cadence.internal.replay;
19+
20+
import static org.junit.Assert.*;
21+
import static org.mockito.Mockito.*;
22+
23+
import com.uber.cadence.EventType;
24+
import com.uber.cadence.HistoryEvent;
25+
import com.uber.cadence.MarkerRecordedEventAttributes;
26+
import com.uber.cadence.internal.worker.DecisionTaskWithHistoryIterator;
27+
import java.util.Arrays;
28+
import java.util.Collections;
29+
import java.util.List;
30+
import java.util.concurrent.TimeUnit;
31+
import org.junit.Before;
32+
import org.junit.Test;
33+
import org.junit.runner.RunWith;
34+
import org.mockito.Mock;
35+
import org.mockito.junit.MockitoJUnitRunner;
36+
37+
@RunWith(MockitoJUnitRunner.class)
38+
public class DecisionEventsIteratorTest {
39+
40+
@Mock private DecisionTaskWithHistoryIterator mockDecisionTaskWithHistoryIterator;
41+
42+
private static final long REPLAY_TIME_MILLIS = 1000L;
43+
private static final long EVENT_TIMESTAMP_NANOS =
44+
TimeUnit.MILLISECONDS.toNanos(REPLAY_TIME_MILLIS);
45+
46+
@Before
47+
public void setUp() {
48+
// Default setup - can be overridden in individual tests
49+
}
50+
51+
@Test
52+
public void testConstructor() {
53+
// Arrange
54+
List<HistoryEvent> events = Collections.emptyList();
55+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
56+
57+
// Act
58+
HistoryHelper.DecisionEventsIterator iterator =
59+
new HistoryHelper.DecisionEventsIterator(
60+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
61+
62+
// Assert
63+
assertNotNull(iterator);
64+
assertFalse(iterator.hasNext());
65+
}
66+
67+
@Test
68+
public void testHasNextWithEmptyHistory() {
69+
// Arrange
70+
List<HistoryEvent> events = Collections.emptyList();
71+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
72+
73+
// Act
74+
HistoryHelper.DecisionEventsIterator iterator =
75+
new HistoryHelper.DecisionEventsIterator(
76+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
77+
78+
// Assert
79+
assertFalse(iterator.hasNext());
80+
}
81+
82+
@Test
83+
public void testWorkflowStartedOnly() {
84+
// Arrange
85+
List<HistoryEvent> events =
86+
Arrays.asList(
87+
createHistoryEvent(1, EventType.WorkflowExecutionStarted, EVENT_TIMESTAMP_NANOS),
88+
createHistoryEvent(2, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
89+
createHistoryEvent(3, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS));
90+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
91+
92+
// Act
93+
HistoryHelper.DecisionEventsIterator iterator =
94+
new HistoryHelper.DecisionEventsIterator(
95+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
96+
97+
// Assert
98+
assertTrue(iterator.hasNext());
99+
100+
HistoryHelper.DecisionEvents decisionEvents = iterator.next();
101+
assertNotNull(decisionEvents);
102+
assertEquals(2, decisionEvents.getEvents().size());
103+
assertEquals(0, decisionEvents.getDecisionEvents().size());
104+
assertFalse(decisionEvents.isReplay());
105+
assertEquals(REPLAY_TIME_MILLIS, decisionEvents.getReplayCurrentTimeMilliseconds());
106+
assertEquals(5, decisionEvents.getNextDecisionEventId());
107+
}
108+
109+
@Test
110+
public void testWorkflowWithActivityScheduled() {
111+
// Arrange
112+
List<HistoryEvent> events =
113+
Arrays.asList(
114+
createHistoryEvent(1, EventType.WorkflowExecutionStarted, EVENT_TIMESTAMP_NANOS),
115+
createHistoryEvent(2, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
116+
createHistoryEvent(3, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
117+
createHistoryEvent(4, EventType.DecisionTaskCompleted, EVENT_TIMESTAMP_NANOS),
118+
createHistoryEvent(5, EventType.ActivityTaskScheduled, EVENT_TIMESTAMP_NANOS));
119+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
120+
121+
// Act
122+
HistoryHelper.DecisionEventsIterator iterator =
123+
new HistoryHelper.DecisionEventsIterator(
124+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
125+
HistoryHelper.DecisionEvents decisionEvents = iterator.next();
126+
127+
// Assert
128+
assertNotNull(decisionEvents);
129+
assertEquals(
130+
2, decisionEvents.getEvents().size()); // WorkflowExecutionStarted and DecisionTaskScheduled
131+
assertEquals(1, decisionEvents.getDecisionEvents().size()); // ActivityTaskScheduled
132+
assertTrue(decisionEvents.isReplay());
133+
assertEquals(REPLAY_TIME_MILLIS, decisionEvents.getReplayCurrentTimeMilliseconds());
134+
assertEquals(5, decisionEvents.getNextDecisionEventId());
135+
}
136+
137+
@Test
138+
public void testWorkflowWithActivityCompleted() {
139+
// Arrange - Sticky workers scenario
140+
List<HistoryEvent> events =
141+
Arrays.asList(
142+
createHistoryEvent(1, EventType.WorkflowExecutionStarted, EVENT_TIMESTAMP_NANOS),
143+
createHistoryEvent(2, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
144+
createHistoryEvent(3, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
145+
createHistoryEvent(4, EventType.DecisionTaskCompleted, EVENT_TIMESTAMP_NANOS),
146+
createHistoryEvent(5, EventType.ActivityTaskScheduled, EVENT_TIMESTAMP_NANOS),
147+
createHistoryEvent(6, EventType.ActivityTaskStarted, EVENT_TIMESTAMP_NANOS),
148+
createHistoryEvent(7, EventType.ActivityTaskCompleted, EVENT_TIMESTAMP_NANOS),
149+
createHistoryEvent(8, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
150+
createHistoryEvent(9, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS));
151+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
152+
153+
// Act
154+
HistoryHelper.DecisionEventsIterator iterator =
155+
new HistoryHelper.DecisionEventsIterator(
156+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
157+
158+
// first decision batch
159+
HistoryHelper.DecisionEvents decisionEvents = iterator.next();
160+
assertNotNull(decisionEvents);
161+
assertEquals(2, decisionEvents.getEvents().size());
162+
assertEquals(1, decisionEvents.getDecisionEvents().size());
163+
assertTrue(decisionEvents.isReplay());
164+
assertEquals(5, decisionEvents.getNextDecisionEventId());
165+
166+
// second decision batch
167+
decisionEvents = iterator.next();
168+
assertFalse(iterator.hasNext());
169+
assertEquals(3, decisionEvents.getEvents().size());
170+
assertEquals(0, decisionEvents.getDecisionEvents().size());
171+
assertFalse(decisionEvents.isReplay());
172+
assertEquals(REPLAY_TIME_MILLIS, decisionEvents.getReplayCurrentTimeMilliseconds());
173+
assertEquals(11, decisionEvents.getNextDecisionEventId());
174+
}
175+
176+
@Test
177+
public void testCompletedWorkflow() {
178+
// Arrange - Non-replay scenario
179+
List<HistoryEvent> events =
180+
Arrays.asList(
181+
createHistoryEvent(1, EventType.WorkflowExecutionStarted, EVENT_TIMESTAMP_NANOS),
182+
createHistoryEvent(2, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
183+
createHistoryEvent(3, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
184+
createHistoryEvent(4, EventType.DecisionTaskCompleted, EVENT_TIMESTAMP_NANOS),
185+
createHistoryEvent(5, EventType.ActivityTaskScheduled, EVENT_TIMESTAMP_NANOS),
186+
createHistoryEvent(6, EventType.ActivityTaskStarted, EVENT_TIMESTAMP_NANOS),
187+
createHistoryEvent(7, EventType.ActivityTaskCompleted, EVENT_TIMESTAMP_NANOS),
188+
createHistoryEvent(8, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
189+
createHistoryEvent(9, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
190+
createHistoryEvent(10, EventType.DecisionTaskCompleted, EVENT_TIMESTAMP_NANOS),
191+
createHistoryEvent(11, EventType.WorkflowExecutionCompleted, EVENT_TIMESTAMP_NANOS));
192+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
193+
194+
// Act
195+
HistoryHelper.DecisionEventsIterator iterator =
196+
new HistoryHelper.DecisionEventsIterator(
197+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
198+
199+
// first decision batch
200+
HistoryHelper.DecisionEvents decisionEvents = iterator.next();
201+
assertNotNull(decisionEvents);
202+
assertEquals(2, decisionEvents.getEvents().size());
203+
assertEquals(1, decisionEvents.getDecisionEvents().size());
204+
assertTrue(decisionEvents.isReplay());
205+
assertEquals(5, decisionEvents.getNextDecisionEventId());
206+
207+
// second decision batch
208+
decisionEvents = iterator.next();
209+
assertFalse(iterator.hasNext());
210+
assertEquals(3, decisionEvents.getEvents().size());
211+
assertEquals(1, decisionEvents.getDecisionEvents().size());
212+
assertTrue(decisionEvents.isReplay());
213+
assertEquals(REPLAY_TIME_MILLIS, decisionEvents.getReplayCurrentTimeMilliseconds());
214+
assertEquals(11, decisionEvents.getNextDecisionEventId());
215+
}
216+
217+
@Test
218+
public void testNextWithDecisionTaskTimedOut() {
219+
// Arrange
220+
List<HistoryEvent> events =
221+
Arrays.asList(
222+
createHistoryEvent(1, EventType.WorkflowExecutionStarted, EVENT_TIMESTAMP_NANOS),
223+
createHistoryEvent(2, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
224+
createHistoryEvent(3, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
225+
createHistoryEvent(4, EventType.DecisionTaskTimedOut, EVENT_TIMESTAMP_NANOS),
226+
createHistoryEvent(5, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
227+
createHistoryEvent(6, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
228+
createHistoryEvent(7, EventType.DecisionTaskCompleted, EVENT_TIMESTAMP_NANOS));
229+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
230+
231+
// Act
232+
HistoryHelper.DecisionEventsIterator iterator =
233+
new HistoryHelper.DecisionEventsIterator(
234+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
235+
HistoryHelper.DecisionEvents decisionEvents = iterator.next();
236+
237+
// Assert
238+
assertNotNull(decisionEvents);
239+
assertEquals(
240+
4, decisionEvents.getEvents().size()); // All events before the second DecisionTaskStarted
241+
assertEquals(0, decisionEvents.getDecisionEvents().size());
242+
assertTrue(decisionEvents.isReplay());
243+
assertEquals(8, decisionEvents.getNextDecisionEventId());
244+
}
245+
246+
@Test
247+
public void testNextWithDecisionTaskFailed() {
248+
// Arrange
249+
List<HistoryEvent> events =
250+
Arrays.asList(
251+
createHistoryEvent(1, EventType.WorkflowExecutionStarted, EVENT_TIMESTAMP_NANOS),
252+
createHistoryEvent(2, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
253+
createHistoryEvent(3, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
254+
createHistoryEvent(4, EventType.DecisionTaskFailed, EVENT_TIMESTAMP_NANOS),
255+
createHistoryEvent(5, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
256+
createHistoryEvent(6, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
257+
createHistoryEvent(7, EventType.DecisionTaskCompleted, EVENT_TIMESTAMP_NANOS));
258+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
259+
260+
// Act
261+
HistoryHelper.DecisionEventsIterator iterator =
262+
new HistoryHelper.DecisionEventsIterator(
263+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
264+
HistoryHelper.DecisionEvents decisionEvents = iterator.next();
265+
266+
// Assert
267+
assertNotNull(decisionEvents);
268+
assertEquals(4, decisionEvents.getEvents().size());
269+
assertEquals(0, decisionEvents.getDecisionEvents().size());
270+
assertTrue(decisionEvents.isReplay());
271+
assertEquals(8, decisionEvents.getNextDecisionEventId());
272+
}
273+
274+
@Test
275+
public void testNextWithMarkerRecordedEvents() {
276+
// Arrange
277+
HistoryEvent markerEvent =
278+
createHistoryEvent(5, EventType.MarkerRecorded, EVENT_TIMESTAMP_NANOS);
279+
markerEvent.setMarkerRecordedEventAttributes(new MarkerRecordedEventAttributes());
280+
281+
List<HistoryEvent> events =
282+
Arrays.asList(
283+
createHistoryEvent(1, EventType.WorkflowExecutionStarted, EVENT_TIMESTAMP_NANOS),
284+
createHistoryEvent(2, EventType.DecisionTaskScheduled, EVENT_TIMESTAMP_NANOS),
285+
createHistoryEvent(3, EventType.DecisionTaskStarted, EVENT_TIMESTAMP_NANOS),
286+
createHistoryEvent(4, EventType.DecisionTaskCompleted, EVENT_TIMESTAMP_NANOS),
287+
markerEvent);
288+
when(mockDecisionTaskWithHistoryIterator.getHistory()).thenReturn(events.iterator());
289+
290+
// Act
291+
HistoryHelper.DecisionEventsIterator iterator =
292+
new HistoryHelper.DecisionEventsIterator(
293+
mockDecisionTaskWithHistoryIterator, REPLAY_TIME_MILLIS);
294+
HistoryHelper.DecisionEvents decisionEvents = iterator.next();
295+
296+
// Assert
297+
assertNotNull(decisionEvents);
298+
assertEquals(1, decisionEvents.getMarkers().size());
299+
assertEquals(markerEvent, decisionEvents.getMarkers().get(0));
300+
}
301+
302+
private HistoryEvent createHistoryEvent(long eventId, EventType eventType, long timestamp) {
303+
HistoryEvent event = new HistoryEvent();
304+
event.setEventId(eventId);
305+
event.setEventType(eventType);
306+
event.setTimestamp(timestamp);
307+
return event;
308+
}
309+
}

0 commit comments

Comments
 (0)