| // Copyright 2013 The Flutter Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "flutter/runtime/dart_isolate.h" | 
 |  | 
 | #include "flutter/fml/paths.h" | 
 | #include "flutter/runtime/dart_vm.h" | 
 | #include "flutter/runtime/dart_vm_lifecycle.h" | 
 | #include "flutter/testing/dart_isolate_runner.h" | 
 | #include "flutter/testing/fixture_test.h" | 
 | #include "flutter/testing/testing.h" | 
 |  | 
 | // CREATE_NATIVE_ENTRY is leaky by design | 
 | // NOLINTBEGIN(clang-analyzer-core.StackAddressEscape) | 
 |  | 
 | namespace flutter { | 
 | namespace testing { | 
 |  | 
 | const std::string kKernelFileName = "no_plugin_registrant_kernel_blob.bin"; | 
 | const std::string kElfFileName = "no_plugin_registrant_app_elf_snapshot.so"; | 
 |  | 
 | class DartIsolateTest : public FixtureTest { | 
 |  public: | 
 |   DartIsolateTest() : FixtureTest(kKernelFileName, kElfFileName, "") {} | 
 | }; | 
 |  | 
 | TEST_F(DartIsolateTest, DartPluginRegistrantIsNotPresent) { | 
 |   ASSERT_FALSE(DartVMRef::IsInstanceRunning()); | 
 |  | 
 |   std::vector<std::string> messages; | 
 |   fml::AutoResetWaitableEvent latch; | 
 |  | 
 |   AddNativeCallback( | 
 |       "PassMessage", | 
 |       CREATE_NATIVE_ENTRY(([&latch, &messages](Dart_NativeArguments args) { | 
 |         auto message = tonic::DartConverter<std::string>::FromDart( | 
 |             Dart_GetNativeArgument(args, 0)); | 
 |         messages.push_back(message); | 
 |         latch.Signal(); | 
 |       }))); | 
 |  | 
 |   auto settings = CreateSettingsForFixture(); | 
 |   auto did_throw_exception = false; | 
 |   settings.unhandled_exception_callback = [&](const std::string& error, | 
 |                                               const std::string& stack_trace) { | 
 |     did_throw_exception = true; | 
 |     return true; | 
 |   }; | 
 |  | 
 |   auto vm_ref = DartVMRef::Create(settings); | 
 |   auto thread = CreateNewThread(); | 
 |   TaskRunners task_runners(GetCurrentTestName(),  // | 
 |                            thread,                // | 
 |                            thread,                // | 
 |                            thread,                // | 
 |                            thread                 // | 
 |   ); | 
 |  | 
 |   auto kernel_path = | 
 |       fml::paths::JoinPaths({GetFixturesPath(), kKernelFileName}); | 
 |   auto isolate = RunDartCodeInIsolate(vm_ref, settings, task_runners, "main", | 
 |                                       {}, kernel_path); | 
 |  | 
 |   ASSERT_TRUE(isolate); | 
 |   ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running); | 
 |  | 
 |   latch.Wait(); | 
 |  | 
 |   ASSERT_EQ(messages.size(), 1u); | 
 |   ASSERT_EQ(messages[0], "main() was called"); | 
 |   ASSERT_FALSE(did_throw_exception); | 
 | } | 
 |  | 
 | }  // namespace testing | 
 | }  // namespace flutter | 
 |  | 
 | // NOLINTEND(clang-analyzer-core.StackAddressEscape) |