android_device_discovery_test.dart 8.33 KB
Newer Older
1 2 3 4
// 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.

5 6
// @dart = 2.8

7
import 'package:file/memory.dart';
8 9 10 11
import 'package:flutter_tools/src/android/android_device_discovery.dart';
import 'package:flutter_tools/src/android/android_sdk.dart';
import 'package:flutter_tools/src/android/android_workflow.dart';
import 'package:flutter_tools/src/base/logger.dart';
12
import 'package:flutter_tools/src/base/platform.dart';
13
import 'package:flutter_tools/src/base/user_messages.dart';
14
import 'package:flutter_tools/src/device.dart';
15
import 'package:test/fake.dart';
16 17

import '../../src/common.dart';
18
import '../../src/context.dart';
19
import '../../src/fakes.dart';
20 21

void main() {
22 23 24 25 26 27
  AndroidWorkflow androidWorkflow;

  setUp(() {
    androidWorkflow = AndroidWorkflow(
      androidSdk: FakeAndroidSdk(),
      featureFlags: TestFeatureFlags(),
28
      operatingSystemUtils: FakeOperatingSystemUtils(),
29 30 31
    );
  });

32
  testWithoutContext('AndroidDevices returns empty device list and diagnostics on null adb', () async {
33
    final AndroidDevices androidDevices = AndroidDevices(
34
      androidSdk: FakeAndroidSdk(null),
35
      logger: BufferLogger.test(),
36
      androidWorkflow: AndroidWorkflow(
37
        androidSdk: FakeAndroidSdk(null),
38
        featureFlags: TestFeatureFlags(),
39
        operatingSystemUtils: FakeOperatingSystemUtils(),
40
      ),
41
      processManager: FakeProcessManager.empty(),
42 43
      fileSystem: MemoryFileSystem.test(),
      platform: FakePlatform(),
44
      userMessages: UserMessages(),
45 46 47
    );

    expect(await androidDevices.pollingGetDevices(), isEmpty);
48 49 50
    expect(await androidDevices.getDiagnostics(), isEmpty);
  });

51
  testWithoutContext('AndroidDevices returns empty device list and diagnostics when adb cannot be run', () async {
52
    final FakeProcessManager fakeProcessManager = FakeProcessManager.empty();
53
    fakeProcessManager.excludedExecutables.add('adb');
54
    final AndroidDevices androidDevices = AndroidDevices(
55
      androidSdk: FakeAndroidSdk(),
56 57 58 59
      logger: BufferLogger.test(),
      androidWorkflow: AndroidWorkflow(
        androidSdk: FakeAndroidSdk('adb'),
        featureFlags: TestFeatureFlags(),
60
        operatingSystemUtils: FakeOperatingSystemUtils(),
61
      ),
62
      processManager: fakeProcessManager,
63 64 65 66 67 68 69
      fileSystem: MemoryFileSystem.test(),
      platform: FakePlatform(),
      userMessages: UserMessages(),
    );

    expect(await androidDevices.pollingGetDevices(), isEmpty);
    expect(await androidDevices.getDiagnostics(), isEmpty);
70
    expect(fakeProcessManager.hasRemainingExpectations, isFalse);
71 72
  });

73 74 75 76 77
  testWithoutContext('AndroidDevices returns empty device list and diagnostics on null Android SDK', () async {
    final AndroidDevices androidDevices = AndroidDevices(
      androidSdk: null,
      logger: BufferLogger.test(),
      androidWorkflow: AndroidWorkflow(
78
        androidSdk: FakeAndroidSdk(null),
79
        featureFlags: TestFeatureFlags(),
80
        operatingSystemUtils: FakeOperatingSystemUtils(),
81
      ),
82
      processManager: FakeProcessManager.empty(),
83 84
      fileSystem: MemoryFileSystem.test(),
      platform: FakePlatform(),
85
      userMessages: UserMessages(),
86 87 88 89 90
    );

    expect(await androidDevices.pollingGetDevices(), isEmpty);
    expect(await androidDevices.getDiagnostics(), isEmpty);
  });
91 92 93 94 95 96 97 98 99

  testWithoutContext('AndroidDevices throwsToolExit on failing adb', () {
    final ProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
      const FakeCommand(
        command: <String>['adb', 'devices', '-l'],
        exitCode: 1,
      )
    ]);
    final AndroidDevices androidDevices = AndroidDevices(
100
      androidSdk: FakeAndroidSdk(),
101
      logger: BufferLogger.test(),
102
      androidWorkflow: androidWorkflow,
103
      processManager: processManager,
104 105
      fileSystem: MemoryFileSystem.test(),
      platform: FakePlatform(),
106
      userMessages: UserMessages(),
107 108 109 110 111 112
    );

    expect(androidDevices.pollingGetDevices(),
      throwsToolExit(message: RegExp('Unable to run "adb"')));
  });

113 114
  testWithoutContext('AndroidDevices is disabled if feature is disabled', () {
    final AndroidDevices androidDevices = AndroidDevices(
115
      androidSdk: FakeAndroidSdk(),
116 117
      logger: BufferLogger.test(),
      androidWorkflow: AndroidWorkflow(
118
        androidSdk: FakeAndroidSdk(),
119 120 121
        featureFlags: TestFeatureFlags(
          isAndroidEnabled: false,
        ),
122
        operatingSystemUtils: FakeOperatingSystemUtils(),
123 124
      ),
      processManager: FakeProcessManager.any(),
125 126
      fileSystem: MemoryFileSystem.test(),
      platform: FakePlatform(),
127
      userMessages: UserMessages(),
128 129 130 131 132
    );

    expect(androidDevices.supportsPlatform, false);
  });

133 134 135 136 137 138 139 140 141 142
  testWithoutContext('AndroidDevices can parse output for physical devices', () async {
    final AndroidDevices androidDevices = AndroidDevices(
      userMessages: UserMessages(),
      androidWorkflow: androidWorkflow,
      androidSdk: FakeAndroidSdk(),
      logger: BufferLogger.test(),
      processManager: FakeProcessManager.list(<FakeCommand>[
        const FakeCommand(
          command: <String>['adb', 'devices', '-l'],
          stdout: '''
143 144 145
List of devices attached
05a02bac               device usb:336592896X product:razor model:Nexus_7 device:flo

146 147 148 149 150 151 152 153
  ''',
        )
      ]),
      platform: FakePlatform(),
      fileSystem: MemoryFileSystem.test(),
    );

    final List<Device> devices = await androidDevices.pollingGetDevices();
154 155 156 157 158 159

    expect(devices, hasLength(1));
    expect(devices.first.name, 'Nexus 7');
    expect(devices.first.category, Category.mobile);
  });

160 161 162 163 164 165 166 167 168 169
  testWithoutContext('AndroidDevices can parse output for emulators and short listings', () async {
    final AndroidDevices androidDevices = AndroidDevices(
      userMessages: UserMessages(),
      androidWorkflow: androidWorkflow,
      androidSdk: FakeAndroidSdk(),
      logger: BufferLogger.test(),
      processManager: FakeProcessManager.list(<FakeCommand>[
        const FakeCommand(
          command: <String>['adb', 'devices', '-l'],
          stdout: '''
170 171 172 173 174
List of devices attached
localhost:36790        device
0149947A0D01500C       device usb:340787200X
emulator-5612          host features:shell_2

175 176 177 178 179 180 181 182
  ''',
        )
      ]),
      platform: FakePlatform(),
      fileSystem: MemoryFileSystem.test(),
    );

    final List<Device> devices = await androidDevices.pollingGetDevices();
183 184

    expect(devices, hasLength(3));
185 186 187
    expect(devices[0].name, 'localhost:36790');
    expect(devices[1].name, '0149947A0D01500C');
    expect(devices[2].name, 'emulator-5612');
188 189
  });

190 191 192 193 194 195 196 197 198 199
  testWithoutContext('AndroidDevices can parse output from android n', () async {
    final AndroidDevices androidDevices = AndroidDevices(
      userMessages: UserMessages(),
      androidWorkflow: androidWorkflow,
      androidSdk: FakeAndroidSdk(),
      logger: BufferLogger.test(),
      processManager: FakeProcessManager.list(<FakeCommand>[
        const FakeCommand(
          command: <String>['adb', 'devices', '-l'],
          stdout: '''
200 201
List of devices attached
ZX1G22JJWR             device usb:3-3 product:shamu model:Nexus_6 device:shamu features:cmd,shell_v2
202

203
''',
204 205 206 207 208 209 210
        )
      ]),
      platform: FakePlatform(),
      fileSystem: MemoryFileSystem.test(),
    );

    final List<Device> devices = await androidDevices.pollingGetDevices();
211 212 213 214 215

    expect(devices, hasLength(1));
    expect(devices.first.name, 'Nexus 6');
  });

216 217 218 219 220 221 222 223 224 225
  testWithoutContext('AndroidDevices provides adb error message as diagnostics', () async {
    final AndroidDevices androidDevices = AndroidDevices(
      userMessages: UserMessages(),
      androidWorkflow: androidWorkflow,
      androidSdk: FakeAndroidSdk(),
      logger: BufferLogger.test(),
      processManager: FakeProcessManager.list(<FakeCommand>[
        const FakeCommand(
          command: <String>['adb', 'devices', '-l'],
          stdout: '''
226 227 228
It appears you do not have 'Android SDK Platform-tools' installed.
Use the 'android' tool to install them:
  android update sdk --no-ui --filter 'platform-tools'
229 230 231 232 233
''',
        )
      ]),
      platform: FakePlatform(),
      fileSystem: MemoryFileSystem.test(),
234
    );
235

236 237
    final List<String> diagnostics = await androidDevices.getDiagnostics();

238 239 240 241 242
    expect(diagnostics, hasLength(1));
    expect(diagnostics.first, contains('you do not have'));
  });
}

243 244
class FakeAndroidSdk extends Fake implements AndroidSdk {
  FakeAndroidSdk([this.adbPath = 'adb']);
245 246 247 248

  @override
  final String adbPath;
}