Index: runtime/vm/isolate_test.cc |
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc |
index 2af007ea2285a4036d98158a5e9a793b6e970199..ee39fb019044533cba4e8f5c4022b37b72da6e2d 100644 |
--- a/runtime/vm/isolate_test.cc |
+++ b/runtime/vm/isolate_test.cc |
@@ -23,17 +23,56 @@ UNIT_TEST_CASE(IsolateCurrent) { |
TEST_CASE(IsolateSpawn) { |
const char* kScriptChars = |
"import 'dart:isolate';\n" |
+ // Ignores printed lines. |
+ "var _nullPrintClosure = (String line) {};\n" |
"void entry(message) {}\n" |
"int testMain() {\n" |
- " try {\n" |
- " Isolate.spawn(entry, null);\n" |
- " } catch (e) {\n" |
- " rethrow;\n" |
- " }\n" |
- " return 0;\n" |
+ " Isolate.spawn(entry, null);\n" |
+ // TODO(floitsch): the following code is only to bump the event loop |
+ // so it executes asynchronous microtasks. |
+ " var rp = new RawReceivePort();\n" |
+ " rp.sendPort.send(null);\n" |
+ " rp.handler = (_) { rp.close(); };\n" |
"}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
- Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); |
+ |
+ Dart_Handle test_lib = TestCase::LoadTestScript(kScriptChars, NULL); |
+ |
+ // Setup the internal library's 'internalPrint' function. |
+ // Necessary because asynchronous errors use "print" to print their |
+ // stack trace. |
+ Dart_Handle url = NewString("dart:_collection-dev"); |
+ DART_CHECK_VALID(url); |
+ Dart_Handle internal_lib = Dart_LookupLibrary(url); |
+ DART_CHECK_VALID(internal_lib); |
+ Dart_Handle print = Dart_GetField(test_lib, NewString("_nullPrintClosure")); |
+ Dart_Handle result = Dart_SetField(internal_lib, |
+ NewString("_printClosure"), |
+ print); |
+ |
+ DART_CHECK_VALID(result); |
+ |
+ // Setup the 'scheduleImmediate' closure. |
+ url = NewString("dart:isolate"); |
+ DART_CHECK_VALID(url); |
+ Dart_Handle isolate_lib = Dart_LookupLibrary(url); |
+ DART_CHECK_VALID(isolate_lib); |
+ Dart_Handle schedule_immediate_closure = |
+ Dart_Invoke(isolate_lib, NewString("_getIsolateScheduleImmediateClosure"), |
+ 0, NULL); |
+ Dart_Handle args[1]; |
+ args[0] = schedule_immediate_closure; |
+ url = NewString("dart:async"); |
+ DART_CHECK_VALID(url); |
+ Dart_Handle async_lib = Dart_LookupLibrary(url); |
+ DART_CHECK_VALID(async_lib); |
+ DART_CHECK_VALID(Dart_Invoke( |
+ async_lib, NewString("_setScheduleImmediateClosure"), 1, args)); |
+ |
+ |
+ result = Dart_Invoke(test_lib, NewString("testMain"), 0, NULL); |
+ EXPECT(!Dart_IsError(result)); |
+ // Run until all ports to isolate are closed. |
+ result = Dart_RunLoop(); |
EXPECT_ERROR(result, "Null callback specified for isolate creation"); |
EXPECT(Dart_ErrorHasException(result)); |
Dart_Handle exception_result = Dart_ErrorGetException(result); |