devices_test.dart 5.33 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
import 'dart:convert';

7
import 'package:flutter_tools/src/android/android_sdk.dart';
8
import 'package:flutter_tools/src/artifacts.dart';
9
import 'package:flutter_tools/src/cache.dart';
10
import 'package:flutter_tools/src/commands/devices.dart';
11
import 'package:flutter_tools/src/device.dart';
12
import 'package:flutter_tools/src/globals.dart' as globals;
13

14 15
import '../../src/common.dart';
import '../../src/context.dart';
16
import '../../src/fake_devices.dart';
17
import '../../src/test_flutter_command_runner.dart';
18

19
void main() {
20
  group('devices', () {
21 22 23 24
    setUpAll(() {
      Cache.disableLocking();
    });

25
    late Cache cache;
26 27

    setUp(() {
28
      cache = Cache.test(processManager: FakeProcessManager.any());
29 30
    });

31
    testUsingContext('returns 0 when called', () async {
32
      final DevicesCommand command = DevicesCommand();
33
      await createTestCommandRunner(command).run(<String>['devices']);
34 35 36
    }, overrides: <Type, Generator>{
      Cache: () => cache,
      Artifacts: () => Artifacts.test(),
37
    });
38

39
    testUsingContext('no error when no connected devices', () async {
40
      final DevicesCommand command = DevicesCommand();
41
      await createTestCommandRunner(command).run(<String>['devices']);
42
      expect(testLogger.statusText, containsIgnoringWhitespace('No devices detected'));
43 44
    }, overrides: <Type, Generator>{
      AndroidSdk: () => null,
45
      DeviceManager: () => NoDevicesManager(),
46
      ProcessManager: () => FakeProcessManager.any(),
47 48
      Cache: () => cache,
      Artifacts: () => Artifacts.test(),
49
    });
50

51
    testUsingContext("get devices' platform types", () async {
52
      final List<String> platformTypes = Device.devicesPlatformTypes(
53
        await globals.deviceManager!.getAllConnectedDevices(),
54 55 56 57
      );
      expect(platformTypes, <String>['android', 'web']);
    }, overrides: <Type, Generator>{
      DeviceManager: () => _FakeDeviceManager(),
58
      ProcessManager: () => FakeProcessManager.any(),
59 60
      Cache: () => cache,
      Artifacts: () => Artifacts.test(),
61 62
    });

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    testUsingContext('Outputs parsable JSON with --machine flag', () async {
      final DevicesCommand command = DevicesCommand();
      await createTestCommandRunner(command).run(<String>['devices', '--machine']);
      expect(
        json.decode(testLogger.statusText),
        <Map<String,Object>>[
          <String, Object>{
            'name': 'ephemeral',
            'id': 'ephemeral',
            'isSupported': true,
            'targetPlatform': 'android-arm',
            'emulator': true,
            'sdk': 'Test SDK (1.2.3)',
            'capabilities': <String, Object>{
              'hotReload': true,
              'hotRestart': true,
              'screenshot': false,
              'fastStart': false,
              'flutterExit': true,
              'hardwareRendering': true,
83 84
              'startPaused': true,
            },
85 86 87 88 89 90 91 92 93 94 95 96 97 98
          },
          <String,Object>{
            'name': 'webby',
            'id': 'webby',
            'isSupported': true,
            'targetPlatform': 'web-javascript',
            'emulator': true,
            'sdk': 'Web SDK (1.2.4)',
            'capabilities': <String, Object>{
              'hotReload': true,
              'hotRestart': true,
              'screenshot': false,
              'fastStart': false,
              'flutterExit': true,
99
              'hardwareRendering': true,
100 101 102 103
              'startPaused': true,
            },
          },
        ],
104 105 106
      );
    }, overrides: <Type, Generator>{
      DeviceManager: () => _FakeDeviceManager(),
107
      ProcessManager: () => FakeProcessManager.any(),
108 109
      Cache: () => cache,
      Artifacts: () => Artifacts.test(),
110
    });
111 112 113 114 115 116 117 118 119

    testUsingContext('available devices and diagnostics', () async {
      final DevicesCommand command = DevicesCommand();
      await createTestCommandRunner(command).run(<String>['devices']);
      expect(
        testLogger.statusText,
        '''
2 connected devices:

120 121
ephemeral (mobile) • ephemeral • android-arm    • Test SDK (1.2.3) (emulator)
webby (mobile)     • webby     • web-javascript • Web SDK (1.2.4) (emulator)
122 123 124 125 126 127

• Cannot connect to device ABC
'''
      );
    }, overrides: <Type, Generator>{
      DeviceManager: () => _FakeDeviceManager(),
128
      ProcessManager: () => FakeProcessManager.any(),
129
    });
130 131
  });
}
132

133
class _FakeDeviceManager extends DeviceManager {
134
  _FakeDeviceManager() : super(logger: testLogger);
135 136 137 138 139 140

  @override
  Future<List<Device>> getAllConnectedDevices() =>
    Future<List<Device>>.value(fakeDevices.map((FakeDeviceJsonData d) => d.dev).toList());

  @override
141
  Future<List<Device>> refreshAllConnectedDevices({Duration? timeout}) =>
142 143
    getAllConnectedDevices();

144 145 146 147
  @override
  Future<List<String>> getDeviceDiagnostics() => Future<List<String>>.value(
    <String>['Cannot connect to device ABC']
  );
148 149 150

  @override
  List<DeviceDiscovery> get deviceDiscoverers => <DeviceDiscovery>[];
151
}
152 153

class NoDevicesManager extends DeviceManager {
154
  NoDevicesManager() : super(logger: testLogger);
155

156 157 158 159
  @override
  Future<List<Device>> getAllConnectedDevices() async => <Device>[];

  @override
160
  Future<List<Device>> refreshAllConnectedDevices({Duration? timeout}) =>
161
    getAllConnectedDevices();
162

163
  @override
164
  List<DeviceDiscovery> get deviceDiscoverers => <DeviceDiscovery>[];
165
}