adb_test.dart 7.1 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
import 'package:collection/collection.dart' show ListEquality, MapEquality;
6

7
import 'package:flutter_devicelab/framework/devices.dart';
8
import 'package:meta/meta.dart';
9

10 11
import 'common.dart';

12
void main() {
13
  group('device', () {
14
    late Device device;
15 16

    setUp(() {
17
      FakeDevice.resetLog();
18
      device = FakeDevice(deviceId: 'fakeDeviceId');
19 20 21 22 23
    });

    tearDown(() {
    });

24 25 26 27 28 29
    group('cpu check', () {
      test('arm64', () async {
        FakeDevice.pretendArm64();
        final AndroidDevice androidDevice = device as AndroidDevice;
        expect(await androidDevice.isArm64(), isTrue);
        expectLog(<CommandArgs>[
30 31
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
          cmd(command: 'getprop', arguments: <String>['ro.product.cpu.abi']),
32 33 34 35
        ]);
      });
    });

36 37
    group('isAwake/isAsleep', () {
      test('reads Awake', () async {
38
        FakeDevice.pretendAwake();
39 40 41 42
        expect(await device.isAwake(), isTrue);
        expect(await device.isAsleep(), isFalse);
      });

43 44 45 46 47 48
      test('reads Awake - samsung devices', () async {
        FakeDevice.pretendAwakeSamsung();
        expect(await device.isAwake(), isTrue);
        expect(await device.isAsleep(), isFalse);
      });

49
      test('reads Asleep', () async {
50
        FakeDevice.pretendAsleep();
51 52 53 54 55 56 57 58 59
        expect(await device.isAwake(), isFalse);
        expect(await device.isAsleep(), isTrue);
      });
    });

    group('togglePower', () {
      test('sends power event', () async {
        await device.togglePower();
        expectLog(<CommandArgs>[
60
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
61 62 63 64 65 66 67
          cmd(command: 'input', arguments: <String>['keyevent', '26']),
        ]);
      });
    });

    group('wakeUp', () {
      test('when awake', () async {
68
        FakeDevice.pretendAwake();
69 70
        await device.wakeUp();
        expectLog(<CommandArgs>[
71
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
72 73 74 75 76
          cmd(command: 'dumpsys', arguments: <String>['power']),
        ]);
      });

      test('when asleep', () async {
77
        FakeDevice.pretendAsleep();
78 79
        await device.wakeUp();
        expectLog(<CommandArgs>[
80
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
81 82 83 84 85 86 87 88
          cmd(command: 'dumpsys', arguments: <String>['power']),
          cmd(command: 'input', arguments: <String>['keyevent', '26']),
        ]);
      });
    });

    group('sendToSleep', () {
      test('when asleep', () async {
89
        FakeDevice.pretendAsleep();
90 91
        await device.sendToSleep();
        expectLog(<CommandArgs>[
92
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
93 94 95 96 97
          cmd(command: 'dumpsys', arguments: <String>['power']),
        ]);
      });

      test('when awake', () async {
98
        FakeDevice.pretendAwake();
99 100
        await device.sendToSleep();
        expectLog(<CommandArgs>[
101
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
102 103 104 105 106 107 108 109
          cmd(command: 'dumpsys', arguments: <String>['power']),
          cmd(command: 'input', arguments: <String>['keyevent', '26']),
        ]);
      });
    });

    group('unlock', () {
      test('sends unlock event', () async {
110
        FakeDevice.pretendAwake();
111 112
        await device.unlock();
        expectLog(<CommandArgs>[
113
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
114 115 116 117 118
          cmd(command: 'dumpsys', arguments: <String>['power']),
          cmd(command: 'input', arguments: <String>['keyevent', '82']),
        ]);
      });
    });
119 120 121 122 123

    group('adb', () {
      test('tap', () async {
        await device.tap(100, 200);
        expectLog(<CommandArgs>[
124
          cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
125 126 127 128
          cmd(command: 'input', arguments: <String>['tap', '100', '200']),
        ]);
      });
    });
129 130 131 132
  });
}

void expectLog(List<CommandArgs> log) {
133
  expect(FakeDevice.commandLog, log);
134 135
}

136
CommandArgs cmd({
137 138 139
  required String command,
  List<String>? arguments,
  Map<String, String>? environment,
140
}) {
141
  return CommandArgs(
142 143 144 145 146
    command: command,
    arguments: arguments,
    environment: environment,
  );
}
147

148
@immutable
149
class CommandArgs {
150
  const CommandArgs({ required this.command, this.arguments, this.environment });
151 152

  final String command;
153 154
  final List<String>? arguments;
  final Map<String, String>? environment;
155 156

  @override
157
  String toString() => 'CommandArgs(command: $command, arguments: $arguments, environment: $environment)';
158 159 160

  @override
  bool operator==(Object other) {
161
    if (other.runtimeType != CommandArgs) {
162
      return false;
163
    }
164 165 166 167
    return other is CommandArgs
        && other.command == command
        && const ListEquality<String>().equals(other.arguments, arguments)
        && const MapEquality<String, String>().equals(other.environment, environment);
168 169 170
  }

  @override
171 172 173 174 175 176 177 178
  int get hashCode {
    return Object.hash(
      command,
      Object.hashAll(arguments ?? const <String>[]),
      Object.hashAllUnordered(environment?.keys ?? const <String>[]),
      Object.hashAllUnordered(environment?.values ?? const <String>[]),
    );
  }
179 180
}

181
class FakeDevice extends AndroidDevice {
182
  FakeDevice({required super.deviceId});
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

  static String output = '';

  static List<CommandArgs> commandLog = <CommandArgs>[];

  static void resetLog() {
    commandLog.clear();
  }

  static void pretendAwake() {
    output = '''
      mWakefulness=Awake
    ''';
  }

198 199 200 201 202 203
  static void pretendAwakeSamsung() {
    output = '''
      getWakefulnessLocked()=Awake
    ''';
  }

204 205 206 207 208 209
  static void pretendAsleep() {
    output = '''
      mWakefulness=Asleep
    ''';
  }

210 211 212 213 214 215
  static void pretendArm64() {
    output = '''
      arm64
    ''';
  }

216
  @override
217
  Future<String> shellEval(String command, List<String> arguments, { Map<String, String>? environment, bool silent = false }) async {
218
    commandLog.add(CommandArgs(
219 220
      command: command,
      arguments: arguments,
221
      environment: environment,
222 223 224 225 226
    ));
    return output;
  }

  @override
227
  Future<void> shellExec(String command, List<String> arguments, { Map<String, String>? environment, bool silent = false }) async {
228
    commandLog.add(CommandArgs(
229 230
      command: command,
      arguments: arguments,
231
      environment: environment,
232 233 234
    ));
  }
}