@@ -189,6 +189,33 @@ void main() {
189
189
);
190
190
});
191
191
192
+ test ('Refreshes isolate if it is not started for long time' , () async {
193
+ fakeIsolate.pauseEvent = vms.Event (kind: vms.EventKind .kNone, timestamp: 0 );
194
+ fakeClient.onGetIsolate = changeIsolateEventAfter (
195
+ 5 ,
196
+ vms.Event (kind: vms.EventKind .kPauseStart, timestamp: 1 ),
197
+ );
198
+
199
+ final FlutterDriver driver = await FlutterDriver .connect (dartVmServiceUrl: '' );
200
+ expect (driver, isNotNull);
201
+ expect (
202
+ fakeClient.connectionLog,
203
+ < String > [
204
+ 'getIsolate' ,
205
+ 'getIsolate' ,
206
+ 'getIsolate' ,
207
+ 'getIsolate' ,
208
+ 'getIsolate' ,
209
+ 'setFlag pause_isolates_on_start false' ,
210
+ 'resume' ,
211
+ 'streamListen Isolate' ,
212
+ 'getIsolate' ,
213
+ 'onIsolateEvent' ,
214
+ 'streamCancel Isolate' ,
215
+ ],
216
+ );
217
+ });
218
+
192
219
test ('Connects to isolate number' , () async {
193
220
fakeIsolate.pauseEvent = vms.Event (kind: vms.EventKind .kPauseStart, timestamp: 0 );
194
221
final FlutterDriver driver = await FlutterDriver .connect (dartVmServiceUrl: '' , isolateNumber: int .parse (fakeIsolate.number! ));
@@ -246,6 +273,14 @@ void main() {
246
273
expectLogContains ('Isolate is paused mid-flight' );
247
274
});
248
275
276
+ test ('connects to isolate paused mid-flight after request' , () async {
277
+ fakeIsolate.pauseEvent = vms.Event (kind: vms.EventKind .kPausePostRequest, timestamp: 0 );
278
+
279
+ final FlutterDriver driver = await FlutterDriver .connect (dartVmServiceUrl: '' );
280
+ expect (driver, isNotNull);
281
+ expectLogContains ('Isolate is paused mid-flight' );
282
+ });
283
+
249
284
// This test simulates a situation when we believe that the isolate is
250
285
// currently paused, but something else (e.g. a debugger) resumes it before
251
286
// we do. There's no need to fail as we should be able to drive the app
@@ -1055,6 +1090,15 @@ vms.Response? makeFakeResponse(
1055
1090
});
1056
1091
}
1057
1092
1093
+ void Function (vms.Isolate ) changeIsolateEventAfter (int gets, vms.Event nextEvent) {
1094
+ return (vms.Isolate i) {
1095
+ gets -= 1 ;
1096
+ if (gets == 0 ) {
1097
+ i.pauseEvent = nextEvent;
1098
+ }
1099
+ };
1100
+ }
1101
+
1058
1102
class FakeFlutterWebConnection extends Fake implements FlutterWebConnection {
1059
1103
@override
1060
1104
bool supportsTimelineAction = false ;
@@ -1082,6 +1126,7 @@ class FakeVmService extends Fake implements vms.VmService {
1082
1126
FakeVM ? vm;
1083
1127
bool failOnSetFlag = false ;
1084
1128
bool failOnResumeWith101 = false ;
1129
+ void Function (vms.Isolate )? onGetIsolate;
1085
1130
1086
1131
final List <String > connectionLog = < String > [];
1087
1132
@@ -1092,6 +1137,7 @@ class FakeVmService extends Fake implements vms.VmService {
1092
1137
Future <vms.Isolate > getIsolate (String isolateId) async {
1093
1138
connectionLog.add ('getIsolate' );
1094
1139
if (isolateId == vm! .isolate! .id) {
1140
+ onGetIsolate? .call (vm! .isolate! );
1095
1141
return vm! .isolate! ;
1096
1142
}
1097
1143
throw UnimplementedError ('getIsolate called with unrecognized $isolateId ' );
0 commit comments