@@ -430,5 +430,102 @@ TEST_F(DartIsolateTest,
430
430
ASSERT_EQ (create_callback_count, 1u );
431
431
}
432
432
433
+ TEST_F (DartIsolateTest, InvalidLoadingUnitFails) {
434
+ if (!DartVM::IsRunningPrecompiledCode ()) {
435
+ FML_LOG (INFO) << " Split AOT does not work in JIT mode" ;
436
+ return ;
437
+ }
438
+ ASSERT_FALSE (DartVMRef::IsInstanceRunning ());
439
+ auto settings = CreateSettingsForFixture ();
440
+ auto vm_ref = DartVMRef::Create (settings);
441
+ ASSERT_TRUE (vm_ref);
442
+ auto vm_data = vm_ref.GetVMData ();
443
+ ASSERT_TRUE (vm_data);
444
+ TaskRunners task_runners (GetCurrentTestName (), //
445
+ GetCurrentTaskRunner (), //
446
+ GetCurrentTaskRunner (), //
447
+ GetCurrentTaskRunner (), //
448
+ GetCurrentTaskRunner () //
449
+ );
450
+ auto isolate_configuration =
451
+ IsolateConfiguration::InferFromSettings (settings);
452
+ auto weak_isolate = DartIsolate::CreateRunningRootIsolate (
453
+ vm_data->GetSettings (), // settings
454
+ vm_data->GetIsolateSnapshot (), // isolate snapshot
455
+ std::move (task_runners), // task runners
456
+ nullptr , // window
457
+ {}, // snapshot delegate
458
+ {}, // hint freed delegate
459
+ {}, // io manager
460
+ {}, // unref queue
461
+ {}, // image decoder
462
+ " main.dart" , // advisory uri
463
+ " main" , // advisory entrypoint
464
+ DartIsolate::Flags{}, // flags
465
+ settings.isolate_create_callback , // isolate create callback
466
+ settings.isolate_shutdown_callback , // isolate shutdown callback
467
+ " main" , // dart entrypoint
468
+ std::nullopt, // dart entrypoint library
469
+ std::move (isolate_configuration) // isolate configuration
470
+ );
471
+ auto root_isolate = weak_isolate.lock ();
472
+ ASSERT_TRUE (root_isolate);
473
+ ASSERT_EQ (root_isolate->GetPhase (), DartIsolate::Phase::Running);
474
+
475
+ auto isolate_data = std::make_unique<const fml::NonOwnedMapping>(
476
+ split_aot_symbols_.vm_isolate_data , 0 );
477
+ auto isolate_instructions = std::make_unique<const fml::NonOwnedMapping>(
478
+ split_aot_symbols_.vm_isolate_instrs , 0 );
479
+
480
+ // Invalid loading unit should fail gracefully with error message.
481
+ ASSERT_FALSE (root_isolate->LoadLoadingUnit (3 , std::move (isolate_data),
482
+ std::move (isolate_instructions)));
483
+ ASSERT_TRUE (root_isolate->Shutdown ());
484
+ }
485
+
486
+ TEST_F (DartIsolateTest, ValidLoadingUnitSucceeds) {
487
+ if (!DartVM::IsRunningPrecompiledCode ()) {
488
+ FML_LOG (INFO) << " Split AOT does not work in JIT mode" ;
489
+ return ;
490
+ }
491
+
492
+ ASSERT_FALSE (DartVMRef::IsInstanceRunning ());
493
+ AddNativeCallback (" NotifyNative" ,
494
+ CREATE_NATIVE_ENTRY (([this ](Dart_NativeArguments args) {
495
+ FML_LOG (ERROR) << " Hello from Dart!" ;
496
+ Signal ();
497
+ })));
498
+ AddNativeCallback (
499
+ " NotifySuccess" , CREATE_NATIVE_ENTRY ([this ](Dart_NativeArguments args) {
500
+ auto bool_handle = Dart_GetNativeArgument (args, 0 );
501
+ ASSERT_FALSE (tonic::LogIfError (bool_handle));
502
+ ASSERT_TRUE (tonic::DartConverter<bool >::FromDart (bool_handle));
503
+ Signal ();
504
+ }));
505
+ const auto settings = CreateSettingsForFixture ();
506
+ auto vm_ref = DartVMRef::Create (settings);
507
+ auto thread = CreateNewThread ();
508
+ TaskRunners task_runners (GetCurrentTestName (), //
509
+ thread, //
510
+ thread, //
511
+ thread, //
512
+ thread //
513
+ );
514
+ auto isolate =
515
+ RunDartCodeInIsolate (vm_ref, settings, task_runners,
516
+ " canCallDeferredLibrary" , {}, GetFixturesPath ());
517
+ ASSERT_TRUE (isolate);
518
+ ASSERT_EQ (isolate->get ()->GetPhase (), DartIsolate::Phase::Running);
519
+ Wait ();
520
+
521
+ auto isolate_data = std::make_unique<const fml::NonOwnedMapping>(
522
+ split_aot_symbols_.vm_isolate_data , 0 );
523
+ auto isolate_instructions = std::make_unique<const fml::NonOwnedMapping>(
524
+ split_aot_symbols_.vm_isolate_instrs , 0 );
525
+
526
+ ASSERT_TRUE (isolate->get ()->LoadLoadingUnit (2 , std::move (isolate_data),
527
+ std::move (isolate_instructions)));
528
+ }
529
+
433
530
} // namespace testing
434
531
} // namespace flutter
0 commit comments