[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