Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 13e9028

Browse files
committed
added engine unit test
1 parent 81be313 commit 13e9028

File tree

6 files changed

+135
-1
lines changed

6 files changed

+135
-1
lines changed

BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ group("flutter") {
145145
"//flutter/lib/spirv/test/supported_glsl_op_shaders:spirv_compile_supported_glsl_shaders",
146146
"//flutter/lib/spirv/test/supported_op_shaders:spirv_compile_supported_op_shaders",
147147
"//flutter/lib/ui:ui_unittests",
148+
"//flutter/runtime:dart_plugin_registrant_unittests",
148149
"//flutter/runtime:no_dart_plugin_registrant_unittests",
149150
"//flutter/runtime:runtime_unittests",
150151
"//flutter/shell/common:shell_unittests",

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,11 +978,13 @@ FILE: ../../../flutter/runtime/dart_vm_lifecycle.h
978978
FILE: ../../../flutter/runtime/dart_vm_unittests.cc
979979
FILE: ../../../flutter/runtime/embedder_resources.cc
980980
FILE: ../../../flutter/runtime/embedder_resources.h
981+
FILE: ../../../flutter/runtime/fixtures/dart_tool/flutter_build/dart_plugin_registrant.dart
981982
FILE: ../../../flutter/runtime/fixtures/no_dart_plugin_registrant_test.dart
982983
FILE: ../../../flutter/runtime/fixtures/runtime_test.dart
983984
FILE: ../../../flutter/runtime/fixtures/split_lib_test.dart
984985
FILE: ../../../flutter/runtime/isolate_configuration.cc
985986
FILE: ../../../flutter/runtime/isolate_configuration.h
987+
FILE: ../../../flutter/runtime/dart_plugin_registrant_unittests.cc
986988
FILE: ../../../flutter/runtime/no_dart_plugin_registrant_unittests.cc
987989
FILE: ../../../flutter/runtime/platform_data.cc
988990
FILE: ../../../flutter/runtime/platform_data.h

runtime/BUILD.gn

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,4 +158,24 @@ if (enable_unittests) {
158158
"//flutter/testing:fixture_test",
159159
]
160160
}
161+
162+
test_fixtures("plugin_registrant") {
163+
dart_main = "fixtures/dart_tool/flutter_build/dart_plugin_registrant.dart"
164+
use_target_as_artifact_prefix = true
165+
}
166+
167+
executable("dart_plugin_registrant_unittests") {
168+
testonly = true
169+
170+
sources = [ "dart_plugin_registrant_unittests.cc" ]
171+
172+
public_configs = [ "//flutter:export_dynamic_symbols" ]
173+
174+
public_deps = [
175+
":plugin_registrant",
176+
"//flutter/fml",
177+
"//flutter/testing",
178+
"//flutter/testing:fixture_test",
179+
]
180+
}
161181
}

runtime/dart_isolate.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ Dart_Handle FindDartPluginRegistrantLibrary() {
729729
std::string library_name =
730730
tonic::DartConverter<std::string>::FromDart(Dart_ToString(library));
731731
if (EndsWith(library_name,
732-
".dart_tool/flutter_build/dart_plugin_registrant.dart'")) {
732+
"dart_tool/flutter_build/dart_plugin_registrant.dart'")) {
733733
return library;
734734
}
735735
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "flutter/runtime/dart_isolate.h"
6+
7+
#include "flutter/fml/paths.h"
8+
#include "flutter/runtime/dart_vm.h"
9+
#include "flutter/runtime/dart_vm_lifecycle.h"
10+
#include "flutter/testing/dart_isolate_runner.h"
11+
#include "flutter/testing/fixture_test.h"
12+
#include "flutter/testing/testing.h"
13+
14+
// CREATE_NATIVE_ENTRY is leaky by design
15+
// NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
16+
17+
namespace flutter {
18+
namespace testing {
19+
20+
const std::string kernel_file_name = "plugin_registrant_kernel_blob.bin";
21+
const std::string elf_file_name = "plugin_registrant_app_elf_snapshot.so";
22+
23+
class DartIsolateTest : public FixtureTest {
24+
public:
25+
DartIsolateTest() : FixtureTest(kernel_file_name, elf_file_name, "") {}
26+
};
27+
28+
TEST_F(DartIsolateTest, DartPluginRegistrantIsNotPresent) {
29+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
30+
31+
std::vector<std::string> messages;
32+
fml::AutoResetWaitableEvent latch;
33+
34+
AddNativeCallback(
35+
"PassMessage",
36+
CREATE_NATIVE_ENTRY(([&latch, &messages](Dart_NativeArguments args) {
37+
auto message = tonic::DartConverter<std::string>::FromDart(
38+
Dart_GetNativeArgument(args, 0));
39+
messages.push_back(message);
40+
latch.Signal();
41+
})));
42+
43+
auto settings = CreateSettingsForFixture();
44+
auto did_throw_exception = false;
45+
settings.unhandled_exception_callback = [&](const std::string& error,
46+
const std::string& stack_trace) {
47+
did_throw_exception = true;
48+
return true;
49+
};
50+
51+
auto vm_ref = DartVMRef::Create(settings);
52+
auto thread = CreateNewThread();
53+
TaskRunners task_runners(GetCurrentTestName(), //
54+
thread, //
55+
thread, //
56+
thread, //
57+
thread //
58+
);
59+
60+
auto kernel_path =
61+
fml::paths::JoinPaths({GetFixturesPath(), kernel_file_name});
62+
auto isolate =
63+
RunDartCodeInIsolate(vm_ref, settings, task_runners,
64+
"mainForPluginRegistrantTest", {}, kernel_path);
65+
66+
ASSERT_TRUE(isolate);
67+
ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
68+
69+
latch.Wait();
70+
71+
ASSERT_EQ(messages.size(), 1u);
72+
ASSERT_EQ(messages[0], "_PluginRegistrant.register() was called");
73+
}
74+
75+
} // namespace testing
76+
} // namespace flutter
77+
78+
// NOLINTEND(clang-analyzer-core.StackAddressEscape)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
void passMessage(String message) native 'PassMessage';
6+
7+
bool didCallRegistrantBeforeEntrypoint = false;
8+
9+
// Test the Dart plugin registrant.
10+
@pragma('vm:entry-point')
11+
class _PluginRegistrant {
12+
13+
@pragma('vm:entry-point')
14+
static void register() {
15+
if (didCallRegistrantBeforeEntrypoint) {
16+
throw '_registerPlugins is being called twice';
17+
}
18+
didCallRegistrantBeforeEntrypoint = true;
19+
}
20+
21+
}
22+
23+
24+
@pragma('vm:entry-point')
25+
void mainForPluginRegistrantTest() {
26+
if (didCallRegistrantBeforeEntrypoint) {
27+
passMessage('_PluginRegistrant.register() was called');
28+
} else {
29+
passMessage('_PluginRegistrant.register() was not called');
30+
}
31+
}
32+
33+
void main() {}

0 commit comments

Comments
 (0)