// Copyright 2014 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. // @dart = 2.8 import 'dart:convert'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/devices.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import '../../src/common.dart'; import '../../src/context.dart'; import '../../src/fake_devices.dart'; import '../../src/test_flutter_command_runner.dart'; void main() { group('devices', () { setUpAll(() { Cache.disableLocking(); }); Cache cache; setUp(() { cache = Cache.test(processManager: FakeProcessManager.any()); }); testUsingContext('returns 0 when called', () async { final DevicesCommand command = DevicesCommand(); await createTestCommandRunner(command).run(['devices']); }, overrides: { Cache: () => cache, Artifacts: () => Artifacts.test(), }); testUsingContext('no error when no connected devices', () async { final DevicesCommand command = DevicesCommand(); await createTestCommandRunner(command).run(['devices']); expect(testLogger.statusText, containsIgnoringWhitespace('No devices detected')); }, overrides: { AndroidSdk: () => null, DeviceManager: () => NoDevicesManager(), ProcessManager: () => FakeProcessManager.any(), Cache: () => cache, Artifacts: () => Artifacts.test(), }); testUsingContext("get devices' platform types", () async { final List platformTypes = Device.devicesPlatformTypes( await globals.deviceManager.getAllConnectedDevices(), ); expect(platformTypes, ['android', 'web']); }, overrides: { DeviceManager: () => _FakeDeviceManager(), ProcessManager: () => FakeProcessManager.any(), Cache: () => cache, Artifacts: () => Artifacts.test(), }); testUsingContext('Outputs parsable JSON with --machine flag', () async { final DevicesCommand command = DevicesCommand(); await createTestCommandRunner(command).run(['devices', '--machine']); expect( json.decode(testLogger.statusText), >[ { 'name': 'ephemeral', 'id': 'ephemeral', 'isSupported': true, 'targetPlatform': 'android-arm', 'emulator': true, 'sdk': 'Test SDK (1.2.3)', 'capabilities': { 'hotReload': true, 'hotRestart': true, 'screenshot': false, 'fastStart': false, 'flutterExit': true, 'hardwareRendering': true, 'startPaused': true } }, { 'name': 'webby', 'id': 'webby', 'isSupported': true, 'targetPlatform': 'web-javascript', 'emulator': true, 'sdk': 'Web SDK (1.2.4)', 'capabilities': { 'hotReload': true, 'hotRestart': true, 'screenshot': false, 'fastStart': false, 'flutterExit': true, 'hardwareRendering': true, 'startPaused': true } } ] ); }, overrides: { DeviceManager: () => _FakeDeviceManager(), ProcessManager: () => FakeProcessManager.any(), Cache: () => cache, Artifacts: () => Artifacts.test(), }); testUsingContext('available devices and diagnostics', () async { final DevicesCommand command = DevicesCommand(); await createTestCommandRunner(command).run(['devices']); expect( testLogger.statusText, ''' 2 connected devices: ephemeral (mobile) • ephemeral • android-arm • Test SDK (1.2.3) (emulator) webby (mobile) • webby • web-javascript • Web SDK (1.2.4) (emulator) • Cannot connect to device ABC ''' ); }, overrides: { DeviceManager: () => _FakeDeviceManager(), ProcessManager: () => FakeProcessManager.any(), }); }); } class _FakeDeviceManager extends DeviceManager { _FakeDeviceManager(); @override Future> getAllConnectedDevices() => Future>.value(fakeDevices.map((FakeDeviceJsonData d) => d.dev).toList()); @override Future> refreshAllConnectedDevices({Duration timeout}) => getAllConnectedDevices(); @override Future> getDeviceDiagnostics() => Future>.value( ['Cannot connect to device ABC'] ); @override List get deviceDiscoverers => []; } class NoDevicesManager extends DeviceManager { @override Future> getAllConnectedDevices() async => []; @override Future> refreshAllConnectedDevices({Duration timeout}) => getAllConnectedDevices(); @override List get deviceDiscoverers => []; }