[test] Makes spawn_function_custom_class_test more robust.

Adds exit port to spawned isolate to force main isolate and runtime
to wait until spawned isolate has completed.
This should improve potential flakiness stemming from racing.

Similar to:
- https://dart-review.googlesource.com/c/sdk/+/110913
- https://dart-review.googlesource.com/c/sdk/+/108410

Change-Id: I1055ca0e23f38bcfa67f485c5b810c39ef302dde
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/113820
Commit-Queue: Clement Skau <cskau@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
diff --git a/tests/lib_2/isolate/spawn_function_custom_class_test.dart b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
index 515c973..d3ccfc1 100644
--- a/tests/lib_2/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
@@ -14,26 +14,38 @@
 import "remote_unittest_helper.dart";
 
 class MyClass {
-  var myVar = 'there';
+  final myVar = 'there';
   myFunc(msg) {
     return '$msg $myVar';
   }
 }
 
-child(args) {
-  var reply = args[1];
-  var msg = args[0];
+isolateEntryPoint(args) {
+  final reply = args[1];
+  final msg = args[0];
   reply.send('re: ${new MyClass().myFunc(msg)}');
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test('message - reply chain', () {
-    ReceivePort port = new ReceivePort();
-    Isolate.spawn(child, ['hi', port.sendPort]);
-    port.listen((msg) {
-      port.close();
+  if (testRemote(main, port)) {
+    return;
+  }
+
+  test('message - reply chain', () async {
+    final exitPort = ReceivePort();
+    final replyPort = ReceivePort();
+
+    final isolate = Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
+        onExit: exitPort.sendPort);
+
+    replyPort.listen((msg) {
+      replyPort.close();
       expect(msg, equals('re: hi there'));
     });
+
+    // Explicitly await spawned isolate exit to enforce main isolate not
+    // completing (and the stand-alone runtime exiting) before the spawned
+    // isolate is done.
+    await exitPort.first;
   });
 }