99import org .junit .jupiter .api .BeforeEach ;
1010import org .junit .jupiter .api .Test ;
1111import org .opensearch .dataprepper .model .event .Event ;
12+ import org .opensearch .dataprepper .model .event .DefaultEventHandle ;
1213import org .opensearch .dataprepper .model .event .JacksonEvent ;
1314import org .opensearch .dataprepper .model .record .Record ;
1415import org .opensearch .dataprepper .plugins .InMemorySinkAccessor ;
1516import org .opensearch .dataprepper .plugins .InMemorySourceAccessor ;
1617import org .opensearch .dataprepper .test .framework .DataPrepperTestRunner ;
1718
19+ import java .time .Instant ;
1820import java .util .ArrayList ;
1921import java .util .Collections ;
22+ import java .util .HashMap ;
2023import java .util .List ;
2124import java .util .Map ;
2225import java .util .UUID ;
26+ import java .util .concurrent .atomic .AtomicInteger ;
2327import java .util .concurrent .TimeUnit ;
2428import java .util .stream .Collectors ;
2529import java .util .stream .IntStream ;
2630
31+ import static org .mockito .Mockito .mock ;
32+ import static org .mockito .Mockito .when ;
33+ import static org .mockito .Mockito .doAnswer ;
34+ import static org .mockito .ArgumentMatchers .any ;
2735import static org .awaitility .Awaitility .await ;
2836import static org .hamcrest .CoreMatchers .equalTo ;
2937import static org .hamcrest .CoreMatchers .not ;
3038import static org .hamcrest .MatcherAssert .assertThat ;
3139import static org .hamcrest .Matchers .containsInAnyOrder ;
3240import static org .hamcrest .Matchers .empty ;
41+ import static org .junit .jupiter .api .Assertions .assertNotNull ;
3342
3443class Router_ThreeRoutesDefaultIT {
3544 private static final String TESTING_KEY = "ConditionalRoutingIT" ;
3645 private static final String ALL_SOURCE_KEY = TESTING_KEY + "_all" ;
46+ private static final int NUM_ALPHA_EVENTS = 10 ;
47+ private static final int NUM_BETA_EVENTS = 20 ;
48+ private static final int NUM_GAMMA_EVENTS = 20 ;
49+ private static final int NUM_DEFAULT_EVENTS = 20 ;
3750 private static final String ALPHA_SOURCE_KEY = TESTING_KEY + "_alpha" ;
3851 private static final String BETA_SOURCE_KEY = TESTING_KEY + "_beta" ;
3952 private static final String ALPHA_DEFAULT_SOURCE_KEY = TESTING_KEY + "_alpha_default" ;
@@ -47,9 +60,43 @@ class Router_ThreeRoutesDefaultIT {
4760 private DataPrepperTestRunner dataPrepperTestRunner ;
4861 private InMemorySourceAccessor inMemorySourceAccessor ;
4962 private InMemorySinkAccessor inMemorySinkAccessor ;
63+ private Map <Object , AtomicInteger > numReleases ;
64+ private Map <String , DefaultEventHandle > eventHandles ;
5065
5166 @ BeforeEach
5267 void setUp () {
68+ eventHandles = new HashMap <>();
69+ Map <String , Integer > testEventTypesMap = Map .of (ALPHA_VALUE , NUM_ALPHA_EVENTS , BETA_VALUE , NUM_BETA_EVENTS , GAMMA_VALUE , NUM_GAMMA_EVENTS , DEFAULT_VALUE , NUM_DEFAULT_EVENTS );
70+ // Setup check on event handles such a way that all acquires happen before release
71+ for (Map .Entry <String , Integer > testEventType : testEventTypesMap .entrySet ()) {
72+ for (int i = 0 ; i < testEventType .getValue (); i ++) {
73+ DefaultEventHandle eventHandle = mock (DefaultEventHandle .class );
74+ eventHandles .put (testEventType .getKey ()+i , eventHandle );
75+ when (eventHandle .getInternalOriginationTime ()).thenReturn (Instant .now ());
76+ when (eventHandle .getExternalOriginationTime ()).thenReturn (Instant .now ());
77+ doAnswer (invocation -> {
78+ Object mock = invocation .getMock ();
79+ synchronized (numReleases ) {
80+ AtomicInteger releases = numReleases .computeIfAbsent (mock , k -> new AtomicInteger (0 ));
81+ assertThat (releases .get (), equalTo (0 ));
82+ }
83+ return null ;
84+ }).when (eventHandle ).acquireReference ();
85+
86+ doAnswer (invocation -> {
87+ Object mock = invocation .getMock ();
88+ synchronized (numReleases ) {
89+ AtomicInteger releases = numReleases .get (mock );
90+ if (releases != null ) {
91+ releases .incrementAndGet ();
92+ }
93+ }
94+ return null ;
95+ }).when (eventHandle ).release (any (Boolean .class ));
96+ }
97+ }
98+ numReleases = new HashMap <>();
99+
53100 dataPrepperTestRunner = DataPrepperTestRunner .builder ()
54101 .withPipelinesDirectoryOrFile ("route/three-route-with-default-route.yaml" )
55102 .build ();
@@ -66,10 +113,10 @@ void tearDown() {
66113
67114 @ Test
68115 void test_default_route () {
69- final List <Record <Event >> alphaEvents = createEvents (ALPHA_VALUE , 10 );
70- final List <Record <Event >> betaEvents = createEvents (BETA_VALUE , 20 );
71- final List <Record <Event >> gammaEvents = createEvents (GAMMA_VALUE , 20 );
72- final List <Record <Event >> defaultEvents = createEvents (DEFAULT_VALUE , 20 );
116+ final List <Record <Event >> alphaEvents = createEvents (ALPHA_VALUE , NUM_ALPHA_EVENTS );
117+ final List <Record <Event >> betaEvents = createEvents (BETA_VALUE , NUM_BETA_EVENTS );
118+ final List <Record <Event >> gammaEvents = createEvents (GAMMA_VALUE , NUM_GAMMA_EVENTS );
119+ final List <Record <Event >> defaultEvents = createEvents (DEFAULT_VALUE , NUM_DEFAULT_EVENTS );
73120
74121 final List <Record <Event >> allEvents = new ArrayList <>(alphaEvents );
75122 allEvents .addAll (betaEvents );
@@ -120,8 +167,12 @@ void test_default_route() {
120167
121168 private List <Record <Event >> createEvents (final String value , final int numberToCreate ) {
122169 return IntStream .range (0 , numberToCreate )
123- .mapToObj (i -> Map .of (KNOWN_CONDITIONAL_KEY , value , "arbitrary_field" , UUID .randomUUID ().toString ()))
124- .map (map -> JacksonEvent .builder ().withData (map ).withEventType ("TEST" ).build ())
170+ .mapToObj (i -> Map .of (KNOWN_CONDITIONAL_KEY , value , "id" , i , "arbitrary_field" , UUID .randomUUID ().toString ()))
171+ .map (map -> {
172+ DefaultEventHandle eventHandle = eventHandles .get (value +map .get ("id" ));
173+ assertNotNull (eventHandle );
174+ return JacksonEvent .builder ().withData (map ).withEventType ("TEST" ).withEventHandle (eventHandle ).build ();
175+ })
125176 .map (jacksonEvent -> (Event ) jacksonEvent )
126177 .map (Record ::new )
127178 .collect (Collectors .toList ());
0 commit comments