Clean up flutter driver device detection. (#36434)
diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart
index 76332c0..ab23856 100644
--- a/packages/flutter_tools/lib/src/commands/drive.dart
+++ b/packages/flutter_tools/lib/src/commands/drive.dart
@@ -13,6 +13,7 @@
import '../dart/sdk.dart';
import '../device.dart';
import '../globals.dart';
+import '../project.dart';
import '../resident_runner.dart';
import '../runner/flutter_command.dart' show FlutterCommandResult;
import 'run.dart';
@@ -94,7 +95,7 @@
if (testFile == null)
throwToolExit(null);
- _device = await targetDeviceFinder();
+ _device = await findTargetDevice();
if (device == null)
throwToolExit(null);
@@ -187,15 +188,8 @@
}
}
-/// Finds a device to test on. May launch a simulator, if necessary.
-typedef TargetDeviceFinder = Future<Device> Function();
-TargetDeviceFinder targetDeviceFinder = findTargetDevice;
-void restoreTargetDeviceFinder() {
- targetDeviceFinder = findTargetDevice;
-}
-
Future<Device> findTargetDevice() async {
- final List<Device> devices = await deviceManager.getDevices().toList();
+ final List<Device> devices = await deviceManager.findTargetDevices(FlutterProject.current());
if (deviceManager.hasSpecifiedDeviceId) {
if (devices.isEmpty) {
diff --git a/packages/flutter_tools/test/general.shard/commands/config_test.dart b/packages/flutter_tools/test/general.shard/commands/config_test.dart
index eaaa831..e7c87e8 100644
--- a/packages/flutter_tools/test/general.shard/commands/config_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/config_test.dart
@@ -12,7 +12,9 @@
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/config.dart';
+import 'package:flutter_tools/src/desktop.dart';
import 'package:flutter_tools/src/version.dart';
+import 'package:flutter_tools/src/web/workflow.dart';
import 'package:mockito/mockito.dart';
import '../../src/common.dart';
@@ -24,6 +26,9 @@
MockFlutterVersion mockFlutterVersion;
setUpAll(() {
+ // TODO(jonahwilliams): remove once features are landed.
+ debugDisableDesktop = true;
+ debugDisableWeb = true;
Cache.disableLocking();
});
@@ -136,4 +141,4 @@
String get directory => 'path/to/android/sdk';
}
-class MockFlutterVersion extends Mock implements FlutterVersion {}
\ No newline at end of file
+class MockFlutterVersion extends Mock implements FlutterVersion {}
diff --git a/packages/flutter_tools/test/general.shard/commands/drive_test.dart b/packages/flutter_tools/test/general.shard/commands/drive_test.dart
index f6e39ed..aad0228 100644
--- a/packages/flutter_tools/test/general.shard/commands/drive_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/drive_test.dart
@@ -23,15 +23,10 @@
group('drive', () {
DriveCommand command;
Device mockDevice;
+ Device mockUnsupportedDevice;
MemoryFileSystem fs;
Directory tempDir;
- void withMockDevice([ Device mock ]) {
- mockDevice = mock ?? MockDevice();
- targetDeviceFinder = () async => mockDevice;
- testDeviceManager.addDevice(mockDevice);
- }
-
setUpAll(() {
Cache.disableLocking();
});
@@ -47,9 +42,6 @@
fs.file('pubspec.yaml')..createSync();
fs.file('.packages').createSync();
setExitFunctionForTests();
- targetDeviceFinder = () {
- throw 'Unexpected call to targetDeviceFinder';
- };
appStarter = (DriveCommand command) {
throw 'Unexpected call to appStarter';
};
@@ -67,12 +59,11 @@
restoreAppStarter();
restoreAppStopper();
restoreTestRunner();
- restoreTargetDeviceFinder();
tryToDelete(tempDir);
});
testUsingContext('returns 1 when test file is not found', () async {
- withMockDevice();
+ testDeviceManager.addDevice(MockDevice());
final String testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
final String testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
@@ -94,7 +85,7 @@
});
testUsingContext('returns 1 when app fails to run', () async {
- withMockDevice();
+ testDeviceManager.addDevice(MockDevice());
appStarter = expectAsync1((DriveCommand command) async => null);
final String testApp = fs.path.join(tempDir.path, 'test_driver', 'e2e.dart');
@@ -163,7 +154,7 @@
});
testUsingContext('returns 0 when test ends successfully', () async {
- withMockDevice();
+ testDeviceManager.addDevice(MockDevice());
final String testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
final String testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
@@ -194,7 +185,7 @@
});
testUsingContext('returns exitCode set by test runner', () async {
- withMockDevice();
+ testDeviceManager.addDevice(MockDevice());
final String testApp = fs.path.join(tempDir.path, 'test', 'e2e.dart');
final String testFile = fs.path.join(tempDir.path, 'test_driver', 'e2e_test.dart');
@@ -231,7 +222,8 @@
group('findTargetDevice', () {
testUsingContext('uses specified device', () async {
testDeviceManager.specifiedDeviceId = '123';
- withMockDevice();
+ mockDevice = MockDevice();
+ testDeviceManager.addDevice(mockDevice);
when(mockDevice.name).thenReturn('specified-device');
when(mockDevice.id).thenReturn('123');
@@ -255,7 +247,25 @@
testUsingContext('uses existing Android device', () async {
mockDevice = MockAndroidDevice();
when(mockDevice.name).thenReturn('mock-android-device');
- withMockDevice(mockDevice);
+ testDeviceManager.addDevice(mockDevice);
+
+ final Device device = await findTargetDevice();
+ expect(device.name, 'mock-android-device');
+ }, overrides: <Type, Generator>{
+ FileSystem: () => fs,
+ Platform: platform,
+ });
+
+ testUsingContext('skips unsupported device', () async {
+ mockDevice = MockAndroidDevice();
+ mockUnsupportedDevice = MockDevice();
+ when(mockUnsupportedDevice.isSupportedForProject(any))
+ .thenReturn(false);
+ when(mockDevice.isSupportedForProject(any))
+ .thenReturn(true);
+ when(mockDevice.name).thenReturn('mock-android-device');
+ testDeviceManager.addDevice(mockDevice);
+ testDeviceManager.addDevice(mockUnsupportedDevice);
final Device device = await findTargetDevice();
expect(device.name, 'mock-android-device');
@@ -279,7 +289,7 @@
Platform macOsPlatform() => FakePlatform(operatingSystem: 'macos');
testUsingContext('uses existing simulator', () async {
- withMockDevice();
+ testDeviceManager.addDevice(mockDevice);
when(mockDevice.name).thenReturn('mock-simulator');
when(mockDevice.isLocalEmulator)
.thenAnswer((Invocation invocation) => Future<bool>.value(true));
@@ -300,7 +310,7 @@
});
Future<void> appStarterSetup() async {
- withMockDevice();
+ testDeviceManager.addDevice(mockDevice);
final MockDeviceLogReader mockDeviceLogReader = MockDeviceLogReader();
when(mockDevice.getLogReader()).thenReturn(mockDeviceLogReader);
diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index eb1ed6e..688fe51 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -188,13 +188,13 @@
List<DeviceDiscovery> get deviceDiscoverers => <DeviceDiscovery>[];
@override
- Future<List<Device>> findTargetDevices(FlutterProject flutterProject) {
- return getDevices().toList();
+ bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) {
+ return device.isSupportedForProject(flutterProject);
}
@override
- bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) {
- return device.isSupportedForProject(flutterProject);
+ Future<List<Device>> findTargetDevices(FlutterProject flutterProject) async {
+ return devices;
}
}