55package org .opensearch .dataprepper .integration ;
66
77import org .junit .jupiter .api .AfterEach ;
8- import org .junit .jupiter .api .BeforeAll ;
98import org .junit .jupiter .api .BeforeEach ;
9+ import org .junit .jupiter .api .extension .ExtensionContext ;
1010import org .junit .jupiter .params .ParameterizedTest ;
1111import org .junit .jupiter .params .provider .Arguments ;
12- import org .junit .jupiter .params .provider .MethodSource ;
12+ import org .junit .jupiter .params .provider .ArgumentsProvider ;
13+ import org .junit .jupiter .params .provider .ArgumentsSource ;
1314import org .opensearch .dataprepper .model .event .Event ;
1415import org .opensearch .dataprepper .model .event .JacksonEvent ;
1516import org .opensearch .dataprepper .model .record .Record ;
3435import static org .hamcrest .CoreMatchers .equalTo ;
3536import static org .hamcrest .MatcherAssert .assertThat ;
3637import static org .hamcrest .Matchers .greaterThanOrEqualTo ;
38+ import static org .junit .jupiter .api .Assertions .assertAll ;
39+ import static org .junit .jupiter .params .provider .Arguments .arguments ;
3740
3841/**
3942 * Integration tests for validating processor behavior in pipelines and to verify that
@@ -44,28 +47,17 @@ class ProcessorValidationIT {
4447 private static final int BATCH_SIZE = 5 ;
4548 private static final int TOTAL_EVENTS = 100 ;
4649 private static final int WAIT_TIMEOUT_SECONDS = 10 ;
47- private static Map <String , List <BaseEventsTrackingProcessor >> PIPELINE_TO_PROCESSORS_MAP ;
4850
4951 private DataPrepperTestRunner testRunner ;
5052 private InMemorySourceAccessor sourceAccessor ;
5153 private InMemorySinkAccessor sinkAccessor ;
5254 private String pipelineType ;
5355
54- @ BeforeAll
55- static void setupProcessors () {
56- BaseEventsTrackingProcessor singleThreadEventsTrackingProcessor = new SingleThreadEventsTrackingTestProcessor ();
57- BaseEventsTrackingProcessor basicEventsTrackingProcessor = new BasicEventsTrackingTestProcessor ();
58- PIPELINE_TO_PROCESSORS_MAP = Map .of (
59- "single-thread-processor-pipeline" , List .of (singleThreadEventsTrackingProcessor ),
60- "basic-processor-pipeline" , List .of (basicEventsTrackingProcessor ),
61- "multi-processor-pipeline" , List .of (singleThreadEventsTrackingProcessor , basicEventsTrackingProcessor )
62- );
63- }
64-
6556 @ BeforeEach
6657 void setUp () {
67- PIPELINE_TO_PROCESSORS_MAP .values ().forEach (processorsList ->
68- processorsList .forEach (BaseEventsTrackingProcessor ::reset ));
58+ new BasicEventsTrackingTestProcessor ().reset ();
59+ new SingleThreadEventsTrackingTestProcessor ().reset ();
60+ SingleThreadEventsTrackingTestProcessor .getProcessors ().clear ();
6961 }
7062
7163 @ AfterEach
@@ -85,28 +77,85 @@ void tearDown() {
8577 * @param expectedTotalEvents Total number of events expected to be processed
8678 */
8779 @ ParameterizedTest (name = "{index} - {0} - {1}" )
88- @ MethodSource ( "provideTestParameters" )
89- void test_events_processed_validation (String pipelineType , String testName , int numberOfBatches , int eventsPerBatch , int expectedTotalEvents ) {
80+ @ ArgumentsSource ( WithoutSingleThreadParametersArgumentsProvider . class )
81+ void test_events_processed_when_no_SingleThread_processors (String pipelineType , String testName , List < BaseEventsTrackingProcessor > processorEventStores , int numberOfBatches , int eventsPerBatch , int expectedTotalEvents ) {
9082 this .pipelineType = pipelineType ;
9183 initializeTestRunner ();
9284 List <List <Record <Event >>> batches = createBatches (numberOfBatches , eventsPerBatch );
9385 batches .forEach (batch -> sourceAccessor .submit (IN_MEMORY_IDENTIFIER , batch ));
9486
95- verifyProcessingResults (pipelineType , expectedTotalEvents , eventsPerBatch );
87+ verifyProcessingResults (pipelineType , expectedTotalEvents , eventsPerBatch , processorEventStores );
9688 }
9789
98- /**
99- * Provides test parameters for the parameterized test.
100- * Creates test scenarios for each pipeline type with both single batch and multiple batch configurations.
101- * @return Stream of test parameters
102- */
103- private static Stream <Arguments > provideTestParameters () {
104- List <Arguments > arguments = new ArrayList <>();
105- for (String pipelineType : PIPELINE_TO_PROCESSORS_MAP .keySet ()) {
106- arguments .add (Arguments .of (pipelineType , "SingleBatch" , 1 , TOTAL_EVENTS , TOTAL_EVENTS ));
107- arguments .add (Arguments .of (pipelineType , "MultipleBatches" , BATCH_SIZE , TOTAL_EVENTS , BATCH_SIZE * TOTAL_EVENTS ));
90+ @ ParameterizedTest (name = "{index} - {0} - {1}" )
91+ @ ArgumentsSource (WithSingleThreadParametersArgumentsProvider .class )
92+ void test_events_processed_when_SingleThread_processor (String pipelineType , String testName , List <BaseEventsTrackingProcessor > processorEventStores , int numberOfBatches , int eventsPerBatch , int expectedTotalEvents ) {
93+ this .pipelineType = pipelineType ;
94+ initializeTestRunner ();
95+ List <List <Record <Event >>> batches = createBatches (numberOfBatches , eventsPerBatch );
96+ batches .forEach (batch -> sourceAccessor .submit (IN_MEMORY_IDENTIFIER , batch ));
97+
98+ verifyProcessingResults (pipelineType , expectedTotalEvents , eventsPerBatch , processorEventStores );
99+
100+ verifySingleThreadUsage ();
101+ }
102+
103+ static class WithSingleThreadParametersArgumentsProvider implements ArgumentsProvider {
104+ @ Override
105+ public Stream <? extends Arguments > provideArguments (final ExtensionContext extensionContext ) throws Exception {
106+ return Stream .of (
107+ arguments ("single-thread-processor-pipeline" ,
108+ "SingleBatch" ,
109+ List .of (new SingleThreadEventsTrackingTestProcessor ()),
110+ 1 ,
111+ TOTAL_EVENTS ,
112+ TOTAL_EVENTS
113+ ),
114+ arguments ("single-thread-processor-pipeline" ,
115+ "MultipleBatches" ,
116+ List .of (new SingleThreadEventsTrackingTestProcessor ()),
117+ BATCH_SIZE ,
118+ TOTAL_EVENTS ,
119+ BATCH_SIZE * TOTAL_EVENTS
120+ ),
121+ arguments ("multi-processor-pipeline" ,
122+ "SingleBatch" ,
123+ List .of (new SingleThreadEventsTrackingTestProcessor (), new BasicEventsTrackingTestProcessor ()),
124+ 1 ,
125+ TOTAL_EVENTS ,
126+ TOTAL_EVENTS
127+ ),
128+ arguments ("multi-processor-pipeline" ,
129+ "MultipleBatches" ,
130+ List .of (new SingleThreadEventsTrackingTestProcessor (), new BasicEventsTrackingTestProcessor ()),
131+ BATCH_SIZE ,
132+ TOTAL_EVENTS ,
133+ BATCH_SIZE * TOTAL_EVENTS
134+ )
135+ );
136+ }
137+ }
138+
139+ static class WithoutSingleThreadParametersArgumentsProvider implements ArgumentsProvider {
140+ @ Override
141+ public Stream <? extends Arguments > provideArguments (final ExtensionContext extensionContext ) throws Exception {
142+ return Stream .of (
143+ arguments ("basic-processor-pipeline" ,
144+ "SingleBatch" ,
145+ List .of (new BasicEventsTrackingTestProcessor ()),
146+ 1 ,
147+ TOTAL_EVENTS ,
148+ TOTAL_EVENTS
149+ ),
150+ arguments ("basic-processor-pipeline" ,
151+ "MultipleBatches" ,
152+ List .of (new BasicEventsTrackingTestProcessor ()),
153+ BATCH_SIZE ,
154+ TOTAL_EVENTS ,
155+ BATCH_SIZE * TOTAL_EVENTS
156+ )
157+ );
108158 }
109- return arguments .stream ();
110159 }
111160
112161 /**
@@ -125,11 +174,13 @@ private void initializeTestRunner() {
125174
126175 /**
127176 * Verifies that events were processed correctly by the pipeline.
128- * @param pipelineType The type of pipeline being tested
129- * @param expectedTotalEvents Total number of events expected to be processed
130- * @param eventsPerBatch Number of events in each batch
177+ *
178+ * @param pipelineType The type of pipeline being tested
179+ * @param expectedTotalEvents Total number of events expected to be processed
180+ * @param eventsPerBatch Number of events in each batch
181+ * @param processorEventStores
131182 */
132- private void verifyProcessingResults (String pipelineType , int expectedTotalEvents , int eventsPerBatch ) {
183+ private void verifyProcessingResults (String pipelineType , int expectedTotalEvents , int eventsPerBatch , List < BaseEventsTrackingProcessor > processorEventStores ) {
133184 // Wait for all events to be processed
134185 await ().atMost (WAIT_TIMEOUT_SECONDS , TimeUnit .SECONDS )
135186 .untilAsserted (() -> assertThat (
@@ -140,15 +191,14 @@ private void verifyProcessingResults(String pipelineType, int expectedTotalEvent
140191 assertThat (outputRecords .size (), equalTo (expectedTotalEvents ));
141192
142193 // Verify each processor in the pipeline processed events
143- List <BaseEventsTrackingProcessor > processors = PIPELINE_TO_PROCESSORS_MAP .get (pipelineType );
144- for (BaseEventsTrackingProcessor processor : processors ) {
194+ for (BaseEventsTrackingProcessor processor : processorEventStores ) {
145195 String processorName = processor .getName ();
146196 Map <String , AtomicInteger > processedEventsMap = processor .getEventsMap ();
147197
148198 verifyEventProcessing (processedEventsMap , outputRecords , expectedTotalEvents , processorName );
149199 }
150200
151- verifyWorkerThreads (outputRecords , processors );
201+ verifyWorkerThreads (outputRecords , processorEventStores );
152202
153203 int numberOfBatches = expectedTotalEvents / eventsPerBatch ;
154204 for (int batch = 0 ; batch < numberOfBatches ; batch ++) {
@@ -160,6 +210,24 @@ private void verifyProcessingResults(String pipelineType, int expectedTotalEvent
160210 }
161211 }
162212
213+ private static void verifySingleThreadUsage () {
214+ List <SingleThreadEventsTrackingTestProcessor > singleThreadProcessors = SingleThreadEventsTrackingTestProcessor .getProcessors ();
215+ assertThat (singleThreadProcessors .size (), equalTo (4 ));
216+ assertAll (
217+ () -> assertThat (singleThreadProcessors .get (0 ).getThreadsUsing ().size (), equalTo (1 )),
218+ () -> assertThat (singleThreadProcessors .get (1 ).getThreadsUsing ().size (), equalTo (1 )),
219+ () -> assertThat (singleThreadProcessors .get (2 ).getThreadsUsing ().size (), equalTo (1 )),
220+ () -> assertThat (singleThreadProcessors .get (3 ).getThreadsUsing ().size (), equalTo (1 ))
221+ );
222+
223+ assertAll (
224+ () -> assertThat (singleThreadProcessors .get (0 ).getNumberOfProcessWorkersFromPipelineDescription (), equalTo (4 )),
225+ () -> assertThat (singleThreadProcessors .get (1 ).getNumberOfProcessWorkersFromPipelineDescription (), equalTo (4 )),
226+ () -> assertThat (singleThreadProcessors .get (2 ).getNumberOfProcessWorkersFromPipelineDescription (), equalTo (4 )),
227+ () -> assertThat (singleThreadProcessors .get (3 ).getNumberOfProcessWorkersFromPipelineDescription (), equalTo (4 ))
228+ );
229+ }
230+
163231 /**
164232 * Verifies that each event was processed exactly once by the specified processor.
165233 * Checks both the processor's internal tracking map and the event metadata.
0 commit comments