[vm/transferable] Refactor oom transferable test out of other throwing tests.

Issue dartbug.com/37188.

Change-Id: Iba8f3bb2f9d8e399f75bd3c63e4542effa6eeb57
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105347
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
diff --git a/runtime/tests/vm/dart/transferable_throws_oom_test.dart b/runtime/tests/vm/dart/transferable_throws_oom_test.dart
new file mode 100644
index 0000000..c1b21f0
--- /dev/null
+++ b/runtime/tests/vm/dart/transferable_throws_oom_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that ensures correct exception when running out of memory for
+// really large transferable.
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:core';
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:typed_data';
+import 'dart:math';
+
+import "package:expect/expect.dart";
+
+main() {
+  // Attempt to create total 1tb uint8list which should fail on 32 and 64-bit
+  // platforms.
+  final bytes100MB = Uint8List(100 * 1024 * 1024);
+  final total1TB = List<Uint8List>.filled(10000, bytes100MB);
+  // Try to make a 1 TB transferable.
+  Expect.throws(() => TransferableTypedData.fromList(total1TB));
+}
diff --git a/runtime/tests/vm/dart/transferable_throws_test.dart b/runtime/tests/vm/dart/transferable_throws_test.dart
index 538916e..860965a 100644
--- a/runtime/tests/vm/dart/transferable_throws_test.dart
+++ b/runtime/tests/vm/dart/transferable_throws_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Test that ensures correct exception is thrown when attempting to use
-// transferred transferables.
+// Test that ensures correct exceptions are thrown when misusing
+// [TransferableTypedData].
 
 import 'dart:async';
 import 'dart:collection';
@@ -15,20 +15,30 @@
 
 import "package:expect/expect.dart";
 
-throwsIfMaterializeAfterSend() {
-  final rp = ReceivePort();
+throwsIfMaterializeAfterSend() async {
+  final completer = Completer<bool>();
+  final rp = ReceivePort()
+    ..listen((e) {
+      completer.complete(true);
+    });
   final transferable = TransferableTypedData.fromList([Uint8List(1024)]);
   rp.sendPort.send(transferable);
   Expect.throwsArgumentError(() => transferable.materialize());
+  await completer.future;
   rp.close();
 }
 
-throwsIfSendMoreThanOnce() {
-  final rp = ReceivePort();
+throwsIfSendMoreThanOnce() async {
+  final completer = Completer<bool>();
+  final rp = ReceivePort()
+    ..listen((e) {
+      completer.complete(true);
+    });
   final bytes = Uint8List(1024);
   final transferable = TransferableTypedData.fromList([bytes]);
   rp.sendPort.send(transferable);
   Expect.throwsArgumentError(() => rp.sendPort.send(transferable));
+  await completer.future;
   rp.close();
 }
 
@@ -39,7 +49,6 @@
 }
 
 throwsIfReceiverMaterializesMoreThanOnce() async {
-  final rp = ReceivePort();
   final completer = Completer<List>();
   final isolateErrors = ReceivePort()..listen((e) => completer.complete(e));
   await Isolate.spawn(
@@ -51,7 +60,6 @@
       "Invalid argument(s): Attempt to materialize object that was"
       " transferred already.");
   isolateErrors.close();
-  rp.close();
 }
 
 void receiver(final transferable) {
@@ -74,15 +82,6 @@
       () => TransferableTypedData.fromList([halfmax, halfmax, Uint8List(2)]));
 }
 
-throwsIfCummulativeListCantBeAllocated() {
-  // Attempt to create total 1tb uint8list which should fail on 32 and 64-bit
-  // platforms.
-  final bytes100MB = Uint8List(100 * 1024 * 1024);
-  final total1TB = List<Uint8List>.filled(10000, bytes100MB);
-  // Try to make a 1 TB transferable.
-  Expect.throws(() => TransferableTypedData.fromList(total1TB));
-}
-
 class MyList<T> extends ListBase<T> {
   @override
   int length;
@@ -97,16 +96,12 @@
   noSuchMethod(_) {}
 }
 
-main() {
-  throwsIfMaterializeAfterSend();
-  throwsIfSendMoreThanOnce();
+main() async {
+  await throwsIfMaterializeAfterSend();
+  await throwsIfSendMoreThanOnce();
   throwsIfMaterializeMoreThanOnce();
-  throwsIfReceiverMaterializesMoreThanOnce();
+  await throwsIfReceiverMaterializesMoreThanOnce();
   throwsIfCummulativeListIsTooLargeOn32bitPlatform();
-  if (!Platform.isMacOS) {
-    // this test crashes the process on mac.
-    throwsIfCummulativeListCantBeAllocated();
-  }
 
   Expect.throwsArgumentError(() => TransferableTypedData.fromList(null));
   Expect.throwsArgumentError(() => TransferableTypedData.fromList([null]));
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 96a27f4..5f5e6d3 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -56,7 +56,7 @@
 dart/catch_entry_state: SkipByDesign
 
 [ $builder_tag == asan ]
-dart/transferable_throws_test: SkipByDesign # This test tries to allocate too much memory on purpose. Still dartbug.com/37188
+dart/transferable_throws_oom_test: SkipByDesign # This test tries to allocate too much memory on purpose. Still dartbug.com/37188
 
 [ $compiler != dartk && $compiler != dartkb ]
 cc/IsolateReload_KernelIncrementalCompile: SkipByDesign