[flutter_tools] write test to convince self of lack of timing issue (#58011)

In #55864 a race condition was described where a done event is received before we finish connecting. This cannot happen, since async functions begin synchronously and the flag isWaitingForVm is tripped immediately, keeping onDone from exiting.
diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
index 319df1a..040ed0e 100644
--- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -1198,6 +1198,48 @@
     }) async => mockVMService,
   }));
 
+  group('Timing test', () {
+    Completer<MockVMService> completer;
+
+    test('Can connect to observatory stream after receiving done event.', () => testbed.run(() async {
+      completer = Completer<MockVMService>();
+      fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
+      final MockDevice mockDevice = MockDevice();
+      final MockDeviceLogReader mockLogReader = MockDeviceLogReader();
+      when(mockDevice.getLogReader(app: anyNamed('app'))).thenReturn(mockLogReader);
+      final StreamController<Uri> controller = StreamController<Uri>();
+
+      final TestFlutterDevice flutterDevice = TestFlutterDevice(
+        mockDevice,
+        observatoryUris: controller.stream,
+      );
+
+      final Future<void> connectResult = flutterDevice.connect();
+
+      // First add the observatory URI to connect to.
+      controller.add(testUri);
+
+      // Then close the stream.
+      await controller.close();
+
+      // Then complete the VM service connection.
+      completer.complete(mockVMService);
+
+      await connectResult;
+
+      verify(mockLogReader.connectedVMService = mockVMService);
+    }, overrides: <Type, Generator>{
+      VMServiceConnector: () => (Uri httpUri, {
+        ReloadSources reloadSources,
+        Restart restart,
+        CompileExpression compileExpression,
+        ReloadMethod reloadMethod,
+        io.CompressionOptions compression,
+        Device device,
+      }) async => completer.future,
+    }));
+  });
+
   test('nextPlatform moves through expected platforms', () {
     expect(nextPlatform('android', TestFeatureFlags()), 'iOS');
     expect(nextPlatform('iOS', TestFeatureFlags()), 'fuchsia');