Skip to content

Commit 7d3caf8

Browse files
authored
Avoid leaking the VM in runtime_unittests and update failing tests. (flutter#8626)
The failing tests were depending on the old assumption that the VM would never shutdown.
1 parent 91b7107 commit 7d3caf8

File tree

3 files changed

+38
-22
lines changed

3 files changed

+38
-22
lines changed

runtime/dart_isolate_unittests.cc

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace testing {
2121
using DartIsolateTest = RuntimeTest;
2222

2323
TEST_F(DartIsolateTest, RootIsolateCreationAndShutdown) {
24+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
2425
auto settings = CreateSettingsForFixture();
2526
auto vm_ref = DartVMRef::Create(settings);
2627
ASSERT_TRUE(vm_ref);
@@ -50,6 +51,7 @@ TEST_F(DartIsolateTest, RootIsolateCreationAndShutdown) {
5051
}
5152

5253
TEST_F(DartIsolateTest, IsolateShutdownCallbackIsInIsolateScope) {
54+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
5355
auto settings = CreateSettingsForFixture();
5456
auto vm_ref = DartVMRef::Create(settings);
5557
ASSERT_TRUE(vm_ref);
@@ -143,12 +145,12 @@ class AutoIsolateShutdown {
143145
FML_DISALLOW_COPY_AND_ASSIGN(AutoIsolateShutdown);
144146
};
145147

146-
static void RunDartCodeInIsolate(std::unique_ptr<AutoIsolateShutdown>& result,
148+
static void RunDartCodeInIsolate(DartVMRef& vm_ref,
149+
std::unique_ptr<AutoIsolateShutdown>& result,
147150
const Settings& settings,
148151
fml::RefPtr<fml::TaskRunner> task_runner,
149152
std::string entrypoint) {
150153
FML_CHECK(task_runner->RunsTasksOnCurrentThread());
151-
auto vm_ref = DartVMRef::Create(settings);
152154

153155
if (!vm_ref) {
154156
return;
@@ -249,36 +251,46 @@ static void RunDartCodeInIsolate(std::unique_ptr<AutoIsolateShutdown>& result,
249251
}
250252

251253
static std::unique_ptr<AutoIsolateShutdown> RunDartCodeInIsolate(
254+
DartVMRef& vm_ref,
252255
const Settings& settings,
253256
fml::RefPtr<fml::TaskRunner> task_runner,
254257
std::string entrypoint) {
255258
std::unique_ptr<AutoIsolateShutdown> result;
256259
fml::AutoResetWaitableEvent latch;
257260
fml::TaskRunner::RunNowOrPostTask(
258261
task_runner, fml::MakeCopyable([&]() mutable {
259-
RunDartCodeInIsolate(result, settings, task_runner, entrypoint);
262+
RunDartCodeInIsolate(vm_ref, result, settings, task_runner, entrypoint);
260263
latch.Signal();
261264
}));
262265
latch.Wait();
263266
return result;
264267
}
265268

266269
TEST_F(DartIsolateTest, IsolateCanLoadAndRunDartCode) {
267-
auto isolate = RunDartCodeInIsolate(CreateSettingsForFixture(),
268-
GetCurrentTaskRunner(), "main");
270+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
271+
const auto settings = CreateSettingsForFixture();
272+
auto vm_ref = DartVMRef::Create(settings);
273+
auto isolate =
274+
RunDartCodeInIsolate(vm_ref, settings, GetCurrentTaskRunner(), "main");
269275
ASSERT_TRUE(isolate);
270276
ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
271277
}
272278

273279
TEST_F(DartIsolateTest, IsolateCannotLoadAndRunUnknownDartEntrypoint) {
274-
auto isolate = RunDartCodeInIsolate(
275-
CreateSettingsForFixture(), GetCurrentTaskRunner(), "thisShouldNotExist");
280+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
281+
const auto settings = CreateSettingsForFixture();
282+
auto vm_ref = DartVMRef::Create(settings);
283+
auto isolate = RunDartCodeInIsolate(vm_ref, settings, GetCurrentTaskRunner(),
284+
"thisShouldNotExist");
276285
ASSERT_FALSE(isolate);
277286
}
278287

279288
TEST_F(DartIsolateTest, CanRunDartCodeCodeSynchronously) {
280-
auto isolate = RunDartCodeInIsolate(CreateSettingsForFixture(),
281-
GetCurrentTaskRunner(), "main");
289+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
290+
const auto settings = CreateSettingsForFixture();
291+
auto vm_ref = DartVMRef::Create(settings);
292+
auto isolate =
293+
RunDartCodeInIsolate(vm_ref, settings, GetCurrentTaskRunner(), "main");
282294

283295
ASSERT_TRUE(isolate);
284296
ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
@@ -292,15 +304,17 @@ TEST_F(DartIsolateTest, CanRunDartCodeCodeSynchronously) {
292304
}
293305

294306
TEST_F(DartIsolateTest, CanRegisterNativeCallback) {
307+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
295308
fml::AutoResetWaitableEvent latch;
296309
AddNativeCallback("NotifyNative",
297310
CREATE_NATIVE_ENTRY(([&latch](Dart_NativeArguments args) {
298311
FML_LOG(ERROR) << "Hello from Dart!";
299312
latch.Signal();
300313
})));
301-
auto isolate =
302-
RunDartCodeInIsolate(CreateSettingsForFixture(), GetThreadTaskRunner(),
303-
"canRegisterNativeCallback");
314+
const auto settings = CreateSettingsForFixture();
315+
auto vm_ref = DartVMRef::Create(settings);
316+
auto isolate = RunDartCodeInIsolate(vm_ref, settings, GetThreadTaskRunner(),
317+
"canRegisterNativeCallback");
304318
ASSERT_TRUE(isolate);
305319
ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
306320
latch.Wait();

runtime/dart_vm_unittests.cc

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,23 @@
44

55
#include "flutter/runtime/dart_vm.h"
66
#include "flutter/runtime/dart_vm_lifecycle.h"
7+
#include "flutter/runtime/runtime_test.h"
78
#include "gtest/gtest.h"
89

910
namespace flutter {
11+
namespace testing {
1012

11-
TEST(DartVM, SimpleInitialization) {
12-
Settings settings = {};
13-
settings.task_observer_add = [](intptr_t, fml::closure) {};
14-
settings.task_observer_remove = [](intptr_t) {};
15-
auto vm = DartVMRef::Create(settings);
13+
using DartVMTest = RuntimeTest;
14+
15+
TEST_F(DartVMTest, SimpleInitialization) {
16+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
17+
auto vm = DartVMRef::Create(CreateSettingsForFixture());
1618
ASSERT_TRUE(vm);
1719
}
1820

19-
TEST(DartVM, SimpleIsolateNameServer) {
20-
Settings settings = {};
21-
settings.task_observer_add = [](intptr_t, fml::closure) {};
22-
settings.task_observer_remove = [](intptr_t) {};
23-
auto vm = DartVMRef::Create(settings);
21+
TEST_F(DartVMTest, SimpleIsolateNameServer) {
22+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
23+
auto vm = DartVMRef::Create(CreateSettingsForFixture());
2424
ASSERT_TRUE(vm);
2525
ASSERT_TRUE(vm.GetVMData());
2626
auto ns = vm->GetIsolateNameServer();
@@ -32,4 +32,5 @@ TEST(DartVM, SimpleIsolateNameServer) {
3232
ASSERT_TRUE(ns->RemoveIsolateNameMapping("foobar"));
3333
}
3434

35+
} // namespace testing
3536
} // namespace flutter

runtime/runtime_test.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ void RuntimeTest::SetSnapshotsAndAssets(Settings& settings) {
8080

8181
Settings RuntimeTest::CreateSettingsForFixture() {
8282
Settings settings;
83+
settings.leak_vm = false;
8384
settings.task_observer_add = [](intptr_t, fml::closure) {};
8485
settings.task_observer_remove = [](intptr_t) {};
8586
settings.root_isolate_create_callback = [this]() {

0 commit comments

Comments
 (0)