1212import java .util .concurrent .atomic .AtomicInteger ;
1313import org .junit .jupiter .api .BeforeAll ;
1414import org .junit .jupiter .api .Test ;
15+ import org .junit .jupiter .api .condition .EnabledForJreRange ;
1516import org .junit .jupiter .api .condition .EnabledIf ;
17+ import org .junit .jupiter .api .condition .JRE ;
1618import org .junit .jupiter .params .ParameterizedTest ;
1719import org .junit .jupiter .params .provider .CsvSource ;
1820import software .amazon .awssdk .auth .credentials .DefaultCredentialsProvider ;
2224import software .amazon .awssdk .services .lambda .model .OperationStatus ;
2325import software .amazon .awssdk .services .sts .StsClient ;
2426import software .amazon .lambda .durable .TypeToken ;
25- import software .amazon .lambda .durable .examples .child .ManyAsyncChildContextExample ;
2627import software .amazon .lambda .durable .examples .general .GenericTypesExample ;
27- import software .amazon .lambda .durable .examples .step .ManyAsyncStepsExample ;
2828import software .amazon .lambda .durable .examples .types .ApprovalRequest ;
2929import software .amazon .lambda .durable .examples .types .GreetingRequest ;
30+ import software .amazon .lambda .durable .examples .types .ManyAsyncStepsInput ;
31+ import software .amazon .lambda .durable .examples .types .ManyAsyncStepsOutput ;
3032import software .amazon .lambda .durable .examples .wait .ConcurrentWaitForConditionExample ;
3133import software .amazon .lambda .durable .model .ExecutionStatus ;
3234import software .amazon .lambda .durable .serde .JacksonSerDes ;
@@ -536,10 +538,10 @@ void testManyAsyncStepsExample(int steps, long maxExecutionTime, long maxReplayT
536538 for (var i = 0 ; i < PERFORMANCE_TEST_REPEAT ; i ++) {
537539 var runner = CloudDurableTestRunner .create (
538540 arn ("many-async-steps-example" ),
539- ManyAsyncStepsExample . Input .class ,
540- ManyAsyncStepsExample . Output .class ,
541+ ManyAsyncStepsInput .class ,
542+ ManyAsyncStepsOutput .class ,
541543 lambdaClient );
542- var result = runner .run (new ManyAsyncStepsExample . Input (2 , steps ));
544+ var result = runner .run (new ManyAsyncStepsInput (2 , steps ));
543545
544546 assertEquals (ExecutionStatus .SUCCEEDED , result .getStatus ());
545547
@@ -565,6 +567,44 @@ void testManyAsyncStepsExample(int steps, long maxExecutionTime, long maxReplayT
565567 assertTrue (minimalExecutionTimeMs < maxExecutionTime );
566568 }
567569
570+ @ EnabledForJreRange (min = JRE .JAVA_21 )
571+ @ ParameterizedTest
572+ @ CsvSource ({"100, 1000, 20" , "500, 2000, 30" , "1000, 3000, 50" })
573+ void testManyAsyncStepsVirtualThreadExample (int steps , long maxExecutionTime , long maxReplayTime ) {
574+ long minimalExecutionTimeMs = Long .MAX_VALUE ;
575+ long minimalReplayTimeMs = Long .MAX_VALUE ;
576+ for (var i = 0 ; i < PERFORMANCE_TEST_REPEAT ; i ++) {
577+ var runner = CloudDurableTestRunner .create (
578+ arn ("many-async-steps-virtual-thread-pool-example" ),
579+ ManyAsyncStepsInput .class ,
580+ ManyAsyncStepsOutput .class ,
581+ lambdaClient );
582+ var result = runner .run (new ManyAsyncStepsInput (2 , steps ));
583+
584+ assertEquals (ExecutionStatus .SUCCEEDED , result .getStatus ());
585+
586+ var finalResult = result .getResult ();
587+ System .out .printf ("ManyAsyncStepsVirtualThreadPoolExample result (%d steps): %s\n " , steps , finalResult );
588+ assertNotNull (finalResult );
589+ assertEquals ((long ) steps * (steps - 1 ), finalResult .result ()); // Sum of 0..steps * 2
590+
591+ // Verify some operations are tracked
592+ assertNotNull (runner .getOperation ("compute-0" ));
593+ assertNotNull (runner .getOperation ("compute-" + (steps - 1 )));
594+
595+ if (finalResult .executionTimeMs () < minimalExecutionTimeMs ) {
596+ minimalExecutionTimeMs = finalResult .executionTimeMs ();
597+ }
598+
599+ if (finalResult .replayTimeMs () < minimalReplayTimeMs ) {
600+ minimalReplayTimeMs = finalResult .replayTimeMs ();
601+ }
602+ }
603+
604+ assertTrue (minimalReplayTimeMs < maxReplayTime );
605+ assertTrue (minimalExecutionTimeMs < maxExecutionTime );
606+ }
607+
568608 @ ParameterizedTest
569609 // OOM if it creates 1000 child contexts
570610 @ CsvSource ({"100, 1500, 10" , "500, 3000, 20" })
@@ -574,10 +614,10 @@ void testManyAsyncChildContextExample(int steps, long maxExecutionTime, long max
574614 for (var i = 0 ; i < PERFORMANCE_TEST_REPEAT ; i ++) {
575615 var runner = CloudDurableTestRunner .create (
576616 arn ("many-async-child-context-example" ),
577- ManyAsyncChildContextExample . Input .class ,
578- ManyAsyncChildContextExample . Output .class ,
617+ ManyAsyncStepsInput .class ,
618+ ManyAsyncStepsOutput .class ,
579619 lambdaClient );
580- var result = runner .run (new ManyAsyncChildContextExample . Input (2 , steps ));
620+ var result = runner .run (new ManyAsyncStepsInput (2 , steps ));
581621
582622 assertEquals (ExecutionStatus .SUCCEEDED , result .getStatus ());
583623
0 commit comments