Index: runtime/vm/snapshot_test.cc |
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
index 39450e441dd1469e6a5e86764acfe44d4b38b507..07dcf106e8045b9bb18b32b2dd85de0be5afca1d 100644 |
--- a/runtime/vm/snapshot_test.cc |
+++ b/runtime/vm/snapshot_test.cc |
@@ -1662,6 +1662,89 @@ UNIT_TEST_CASE(ScriptSnapshot2) { |
} |
+UNIT_TEST_CASE(MismatchedSnapshotKinds) { |
+ const char* kScriptChars = |
+ "main() { print('Hello, world!'); }"; |
+ Dart_Handle result; |
+ |
+ uint8_t* buffer; |
+ intptr_t size; |
+ intptr_t vm_isolate_snapshot_size; |
+ uint8_t* isolate_snapshot = NULL; |
+ intptr_t isolate_snapshot_size; |
+ uint8_t* full_snapshot = NULL; |
+ uint8_t* script_snapshot = NULL; |
+ |
+ bool saved_load_deferred_eagerly_mode = FLAG_load_deferred_eagerly; |
+ FLAG_load_deferred_eagerly = true; |
+ bool saved_concurrent_sweep_mode = FLAG_concurrent_sweep; |
+ FLAG_concurrent_sweep = false; |
+ { |
+ // Start an Isolate, and create a full snapshot of it. |
+ TestIsolateScope __test_isolate__; |
+ Dart_EnterScope(); // Start a Dart API scope for invoking API functions. |
+ |
+ // Write out the script snapshot. |
+ result = Dart_CreateSnapshot(NULL, |
+ &vm_isolate_snapshot_size, |
+ &isolate_snapshot, |
+ &isolate_snapshot_size); |
+ EXPECT_VALID(result); |
+ full_snapshot = reinterpret_cast<uint8_t*>(malloc(isolate_snapshot_size)); |
+ memmove(full_snapshot, isolate_snapshot, isolate_snapshot_size); |
+ Dart_ExitScope(); |
+ } |
+ FLAG_concurrent_sweep = saved_concurrent_sweep_mode; |
+ FLAG_load_deferred_eagerly = saved_load_deferred_eagerly_mode; |
+ |
+ { |
+ // Create an Isolate using the full snapshot, load a script and create |
+ // a script snapshot of the script. |
+ TestCase::CreateTestIsolateFromSnapshot(full_snapshot); |
+ Dart_EnterScope(); // Start a Dart API scope for invoking API functions. |
+ |
+ // Create a test library and Load up a test script in it. |
+ TestCase::LoadTestScript(kScriptChars, NULL); |
+ |
+ EXPECT_VALID(Api::CheckAndFinalizePendingClasses(Thread::Current())); |
+ |
+ // Write out the script snapshot. |
+ result = Dart_CreateScriptSnapshot(&buffer, &size); |
+ EXPECT_VALID(result); |
+ script_snapshot = reinterpret_cast<uint8_t*>(malloc(size)); |
+ memmove(script_snapshot, buffer, size); |
+ Dart_ExitScope(); |
+ Dart_ShutdownIsolate(); |
+ } |
+ |
+ { |
+ // Use a script snapshot where a full snapshot is expected. |
+ char* error = NULL; |
+ Dart_Isolate isolate = Dart_CreateIsolate("script-uri", "main", |
+ script_snapshot, NULL, NULL, |
+ &error); |
+ EXPECT(isolate == NULL); |
+ EXPECT(error != NULL); |
+ EXPECT_SUBSTRING("got 'script', expected 'core'", error); |
+ } |
+ |
+ { |
+ TestCase::CreateTestIsolateFromSnapshot(full_snapshot); |
+ Dart_EnterScope(); // Start a Dart API scope for invoking API functions. |
+ |
+ // Use a full snapshot where a script snapshot is expected. |
+ Dart_Handle result = Dart_LoadScriptFromSnapshot(full_snapshot, size); |
+ EXPECT_ERROR(result, "Dart_LoadScriptFromSnapshot expects parameter" |
+ " 'buffer' to be a script type snapshot."); |
+ |
+ Dart_ExitScope(); |
+ } |
+ Dart_ShutdownIsolate(); |
+ free(full_snapshot); |
+ free(script_snapshot); |
+} |
+ |
+ |
#endif // !PRODUCT |