From 428d7d7f2df1fbdca3ebd74fa7d906c10db5d9c6 Mon Sep 17 00:00:00 2001 From: Christopher Fujino Date: Tue, 15 Oct 2019 12:50:44 -0700 Subject: [PATCH] dispose devices on cleanupAtFinish() for run_cold.dart (#42668) --- packages/flutter_tools/lib/src/run_cold.dart | 4 + .../commands.shard/hermetic/run_test.dart | 1 - .../test/general.shard/cold_test.dart | 75 +++++++++++++++++++ .../test/general.shard/hot_test.dart | 32 ++++++++ 4 files changed, 111 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart index f8e5cd43eb..3bca34a00d 100644 --- a/packages/flutter_tools/lib/src/run_cold.dart +++ b/packages/flutter_tools/lib/src/run_cold.dart @@ -168,6 +168,10 @@ class ColdRunner extends ResidentRunner { @override Future cleanupAtFinish() async { + for (FlutterDevice flutterDevice in flutterDevices) { + flutterDevice.device.dispose(); + } + await stopEchoingDeviceLog(); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart index cb790297b1..fdf649e9c0 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart @@ -43,7 +43,6 @@ void main() { } }); - group('dart-flags option', () { setUpAll(() { when(mockDeviceManager.getDevices()).thenAnswer((Invocation invocation) { diff --git a/packages/flutter_tools/test/general.shard/cold_test.dart b/packages/flutter_tools/test/general.shard/cold_test.dart index c654a79fb4..33bfe60868 100644 --- a/packages/flutter_tools/test/general.shard/cold_test.dart +++ b/packages/flutter_tools/test/general.shard/cold_test.dart @@ -4,6 +4,7 @@ import 'dart:async'; +import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; @@ -84,8 +85,82 @@ void main() { Logger: () => mockLogger, }); }); + + group('cleanupAtFinish()', () { + MockFlutterDevice mockFlutterDeviceFactory(Device device) { + final MockFlutterDevice mockFlutterDevice = MockFlutterDevice(); + when(mockFlutterDevice.stopEchoingDeviceLog()).thenAnswer((Invocation invocation) => Future.value(null)); + when(mockFlutterDevice.device).thenReturn(device); + return mockFlutterDevice; + } + + testUsingContext('disposes each device', () async { + final MockDevice mockDevice1 = MockDevice(); + final MockDevice mockDevice2 = MockDevice(); + final MockFlutterDevice mockFlutterDevice1 = mockFlutterDeviceFactory(mockDevice1); + final MockFlutterDevice mockFlutterDevice2 = mockFlutterDeviceFactory(mockDevice2); + + final List devices = [mockFlutterDevice1, mockFlutterDevice2]; + + await ColdRunner(devices, + debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), + ).cleanupAtFinish(); + + verify(mockDevice1.dispose()); + verify(mockFlutterDevice1.stopEchoingDeviceLog()); + verify(mockDevice2.dispose()); + verify(mockFlutterDevice2.stopEchoingDeviceLog()); + }); + }); + + group('cold run', () { + BufferLogger mockLogger; + + setUp(() { + mockLogger = BufferLogger(); + }); + + testUsingContext('returns 1 if not prebuilt mode & mainPath does not exist', () async { + final MockDevice mockDevice = MockDevice(); + final MockFlutterDevice mockFlutterDevice = MockFlutterDevice(); + when(mockFlutterDevice.device).thenReturn(mockDevice); + final List devices = [mockFlutterDevice]; + final int result = await ColdRunner(devices).run(); + expect(result, 1); + expect(mockLogger.errorText, matches(r'Tried to run .*, but that file does not exist\.')); + expect(mockLogger.errorText, matches(r'Consider using the -t option to specify the Dart file to start\.')); + }, overrides: { + Logger: () => mockLogger, + }); + + testUsingContext('calls runCold on attached device', () async { + final MockDevice mockDevice = MockDevice(); + final MockFlutterDevice mockFlutterDevice = MockFlutterDevice(); + when(mockFlutterDevice.device).thenReturn(mockDevice); + when(mockFlutterDevice.runCold( + coldRunner: anyNamed('coldRunner'), + route: anyNamed('route') + )).thenAnswer((Invocation invocation) => Future.value(1)); + final List devices = [mockFlutterDevice]; + final MockFile applicationBinary = MockFile(); + final int result = await ColdRunner( + devices, + applicationBinary: applicationBinary, + debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), + ).run(); + expect(result, 1); + verify(mockFlutterDevice.runCold( + coldRunner: anyNamed('coldRunner'), + route: anyNamed('route'), + )); + }, overrides: { + Logger: () => mockLogger, + }); + }); } +class MockFile extends Mock implements File {} +class MockFlutterDevice extends Mock implements FlutterDevice {} class MockDevice extends Mock implements Device { MockDevice() { when(isSupported()).thenReturn(true); diff --git a/packages/flutter_tools/test/general.shard/hot_test.dart b/packages/flutter_tools/test/general.shard/hot_test.dart index a5683dbc33..2ccdf73ad3 100644 --- a/packages/flutter_tools/test/general.shard/hot_test.dart +++ b/packages/flutter_tools/test/general.shard/hot_test.dart @@ -337,6 +337,36 @@ void main() { HotRunnerConfig: () => TestHotRunnerConfig(successfulSetup: true), }); }); + + group('hot cleanupAtFinish()', () { + MockFlutterDevice mockFlutterDeviceFactory(Device device) { + final MockFlutterDevice mockFlutterDevice = MockFlutterDevice(); + when(mockFlutterDevice.stopEchoingDeviceLog()).thenAnswer((Invocation invocation) => Future.value(null)); + when(mockFlutterDevice.device).thenReturn(device); + return mockFlutterDevice; + } + + testUsingContext('disposes each device', () async { + final MockDevice mockDevice1 = MockDevice(); + final MockDevice mockDevice2 = MockDevice(); + final MockFlutterDevice mockFlutterDevice1 = mockFlutterDeviceFactory(mockDevice1); + final MockFlutterDevice mockFlutterDevice2 = mockFlutterDeviceFactory(mockDevice2); + + final List devices = [ + mockFlutterDevice1, + mockFlutterDevice2, + ]; + + await HotRunner(devices, + debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), + ).cleanupAtFinish(); + + verify(mockDevice1.dispose()); + verify(mockFlutterDevice1.stopEchoingDeviceLog()); + verify(mockDevice2.dispose()); + verify(mockFlutterDevice2.stopEchoingDeviceLog()); + }); + }); } class MockDevFs extends Mock implements DevFS {} @@ -349,6 +379,8 @@ class MockDevice extends Mock implements Device { } } +class MockFlutterDevice extends Mock implements FlutterDevice {} + class TestFlutterDevice extends FlutterDevice { TestFlutterDevice({ @required Device device,