// Copyright 2017 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/fml/thread.h" #include "flutter/runtime/dart_isolate.h" #include "flutter/runtime/dart_vm.h" #include "flutter/testing/testing.h" #include "flutter/testing/thread_test.h" #define CURRENT_TEST_NAME \ std::string { \ ::testing::UnitTest::GetInstance()->current_test_info()->name() \ } namespace blink { using DartIsolateTest = ::testing::ThreadTest; TEST_F(DartIsolateTest, RootIsolateCreationAndShutdown) { Settings settings = {}; settings.task_observer_add = [](intptr_t, fml::closure) {}; settings.task_observer_remove = [](intptr_t) {}; auto vm = DartVM::ForProcess(settings); ASSERT_TRUE(vm); TaskRunners task_runners(CURRENT_TEST_NAME, // GetCurrentTaskRunner(), // GetCurrentTaskRunner(), // GetCurrentTaskRunner(), // GetCurrentTaskRunner() // ); auto weak_isolate = DartIsolate::CreateRootIsolate( vm.get(), // vm vm->GetIsolateSnapshot(), // isolate snapshot vm->GetSharedSnapshot(), // shared snapshot std::move(task_runners), // task runners nullptr, // window {}, // resource context nullptr, // unref qeueue "main.dart", // advisory uri "main" // advisory entrypoint ); auto root_isolate = weak_isolate.lock(); ASSERT_TRUE(root_isolate); ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::LibrariesSetup); ASSERT_TRUE(root_isolate->Shutdown()); } TEST_F(DartIsolateTest, IsolateCanAssociateSnapshot) { Settings settings = {}; settings.task_observer_add = [](intptr_t, fml::closure) {}; settings.task_observer_remove = [](intptr_t) {}; auto vm = DartVM::ForProcess(settings); ASSERT_TRUE(vm); TaskRunners task_runners(CURRENT_TEST_NAME, // GetCurrentTaskRunner(), // GetCurrentTaskRunner(), // GetCurrentTaskRunner(), // GetCurrentTaskRunner() // ); auto weak_isolate = DartIsolate::CreateRootIsolate( vm.get(), // vm vm->GetIsolateSnapshot(), // isolate snapshot vm->GetSharedSnapshot(), // shared snapshot std::move(task_runners), // task runners nullptr, // window {}, // resource context nullptr, // unref qeueue "main.dart", // advisory uri "main" // advisory entrypoint ); auto root_isolate = weak_isolate.lock(); ASSERT_TRUE(root_isolate); ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::LibrariesSetup); ASSERT_TRUE(root_isolate->PrepareForRunningFromSource( testing::GetFixturesPath() + std::string{"/simple_main.dart"}, "")); ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Ready); ASSERT_TRUE(root_isolate->Shutdown()); } TEST_F(DartIsolateTest, CanResolveAndInvokeMethod) { Settings settings = {}; settings.task_observer_add = [](intptr_t, fml::closure) {}; settings.task_observer_remove = [](intptr_t) {}; auto vm = DartVM::ForProcess(settings); ASSERT_TRUE(vm); TaskRunners task_runners(CURRENT_TEST_NAME, // GetCurrentTaskRunner(), // GetCurrentTaskRunner(), // GetCurrentTaskRunner(), // GetCurrentTaskRunner() // ); auto weak_isolate = DartIsolate::CreateRootIsolate( vm.get(), // vm vm->GetIsolateSnapshot(), // isolate snapshot vm->GetSharedSnapshot(), // shared snapshot std::move(task_runners), // task runners nullptr, // window {}, // resource context nullptr, // unref qeueue "main.dart", // advisory uri "main" // advisory entrypoint ); auto root_isolate = weak_isolate.lock(); ASSERT_TRUE(root_isolate); ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::LibrariesSetup); ASSERT_TRUE(root_isolate->PrepareForRunningFromSource( testing::GetFixturesPath() + std::string{"/simple_main.dart"}, "")); ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Ready); ASSERT_TRUE(root_isolate->Run("simple_main")); ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running); ASSERT_TRUE(root_isolate->Shutdown()); } } // namespace blink