@@ -485,6 +485,7 @@ void main() {
485
485
late Future <void > allIsolatesExited;
486
486
487
487
late List <String > received;
488
+ Future <void > Function (String )? delayTheOnPauseCallback;
488
489
late bool stopped;
489
490
490
491
void startEvent (String id, String groupId, [String ? name]) =>
@@ -522,6 +523,7 @@ void main() {
522
523
when (service.getVM ()).thenAnswer ((_) async => VM ());
523
524
524
525
received = < String > [];
526
+ delayTheOnPauseCallback = null ;
525
527
when (service.resume (any)).thenAnswer ((invocation) async {
526
528
final id = invocation.positionalArguments[0 ];
527
529
received.add ('Resume $id ' );
@@ -535,6 +537,10 @@ void main() {
535
537
expect (stopped, isFalse);
536
538
received.add ('Pause ${iso .id }. Collect group ${iso .isolateGroupId }? '
537
539
'${isLastIsolateInGroup ? 'Yes' : 'No' }' );
540
+ if (delayTheOnPauseCallback != null ) {
541
+ await delayTheOnPauseCallback !(iso.id! );
542
+ received.add ('Pause done ${iso .id }' );
543
+ }
538
544
},
539
545
(message) => received.add (message),
540
546
).waitUntilAllExited ();
@@ -849,5 +855,39 @@ void main() {
849
855
'Resume C' ,
850
856
]);
851
857
});
858
+
859
+ test ('main isolate paused during other isolate pause callback' , () async {
860
+ final delayingB = Completer <void >();
861
+ delayTheOnPauseCallback = (String isoId) async {
862
+ if (isoId == 'B' ) await delayingB.future;
863
+ };
864
+
865
+ startEvent ('A' , '1' , 'main' );
866
+ startEvent ('B' , '2' );
867
+ pauseEvent ('B' , '2' );
868
+ pauseEvent ('A' , '1' , 'main' );
869
+
870
+ while (received.length < 4 ) {
871
+ await Future <void >.delayed (Duration .zero);
872
+ }
873
+
874
+ expect (received, [
875
+ 'Pause B. Collect group 2? Yes' ,
876
+ 'Pause A. Collect group 1? Yes' ,
877
+ 'Pause done A' ,
878
+ 'Resume A' ,
879
+ ]);
880
+
881
+ delayingB.complete ();
882
+ await endTest ();
883
+ expect (received, [
884
+ 'Pause B. Collect group 2? Yes' ,
885
+ 'Pause A. Collect group 1? Yes' ,
886
+ 'Pause done A' ,
887
+ 'Resume A' ,
888
+ 'Pause done B' ,
889
+ // Don't try to resume B, because the VM service is already shut down.
890
+ ]);
891
+ });
852
892
});
853
893
}
0 commit comments