mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
236 lines
7.1 KiB
Dart
236 lines
7.1 KiB
Dart
// 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.
|
|
|
|
import 'package:collection/collection.dart' show ListEquality, MapEquality;
|
|
|
|
import 'package:flutter_devicelab/framework/devices.dart';
|
|
import 'package:meta/meta.dart';
|
|
|
|
import 'common.dart';
|
|
|
|
void main() {
|
|
group('device', () {
|
|
late Device device;
|
|
|
|
setUp(() {
|
|
FakeDevice.resetLog();
|
|
device = FakeDevice(deviceId: 'fakeDeviceId');
|
|
});
|
|
|
|
tearDown(() {
|
|
});
|
|
|
|
group('cpu check', () {
|
|
test('arm64', () async {
|
|
FakeDevice.pretendArm64();
|
|
final AndroidDevice androidDevice = device as AndroidDevice;
|
|
expect(await androidDevice.isArm64(), isTrue);
|
|
expectLog(<CommandArgs>[
|
|
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']),
|
|
]);
|
|
});
|
|
});
|
|
|
|
group('isAwake/isAsleep', () {
|
|
test('reads Awake', () async {
|
|
FakeDevice.pretendAwake();
|
|
expect(await device.isAwake(), isTrue);
|
|
expect(await device.isAsleep(), isFalse);
|
|
});
|
|
|
|
test('reads Awake - samsung devices', () async {
|
|
FakeDevice.pretendAwakeSamsung();
|
|
expect(await device.isAwake(), isTrue);
|
|
expect(await device.isAsleep(), isFalse);
|
|
});
|
|
|
|
test('reads Asleep', () async {
|
|
FakeDevice.pretendAsleep();
|
|
expect(await device.isAwake(), isFalse);
|
|
expect(await device.isAsleep(), isTrue);
|
|
});
|
|
});
|
|
|
|
group('togglePower', () {
|
|
test('sends power event', () async {
|
|
await device.togglePower();
|
|
expectLog(<CommandArgs>[
|
|
cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
|
|
cmd(command: 'input', arguments: <String>['keyevent', '26']),
|
|
]);
|
|
});
|
|
});
|
|
|
|
group('wakeUp', () {
|
|
test('when awake', () async {
|
|
FakeDevice.pretendAwake();
|
|
await device.wakeUp();
|
|
expectLog(<CommandArgs>[
|
|
cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
|
|
cmd(command: 'dumpsys', arguments: <String>['power']),
|
|
]);
|
|
});
|
|
|
|
test('when asleep', () async {
|
|
FakeDevice.pretendAsleep();
|
|
await device.wakeUp();
|
|
expectLog(<CommandArgs>[
|
|
cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
|
|
cmd(command: 'dumpsys', arguments: <String>['power']),
|
|
cmd(command: 'input', arguments: <String>['keyevent', '26']),
|
|
]);
|
|
});
|
|
});
|
|
|
|
group('sendToSleep', () {
|
|
test('when asleep', () async {
|
|
FakeDevice.pretendAsleep();
|
|
await device.sendToSleep();
|
|
expectLog(<CommandArgs>[
|
|
cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
|
|
cmd(command: 'dumpsys', arguments: <String>['power']),
|
|
]);
|
|
});
|
|
|
|
test('when awake', () async {
|
|
FakeDevice.pretendAwake();
|
|
await device.sendToSleep();
|
|
expectLog(<CommandArgs>[
|
|
cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
|
|
cmd(command: 'dumpsys', arguments: <String>['power']),
|
|
cmd(command: 'input', arguments: <String>['keyevent', '26']),
|
|
]);
|
|
});
|
|
});
|
|
|
|
group('unlock', () {
|
|
test('sends unlock event', () async {
|
|
FakeDevice.pretendAwake();
|
|
await device.unlock();
|
|
expectLog(<CommandArgs>[
|
|
cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
|
|
cmd(command: 'dumpsys', arguments: <String>['power']),
|
|
cmd(command: 'input', arguments: <String>['keyevent', '82']),
|
|
]);
|
|
});
|
|
});
|
|
|
|
group('adb', () {
|
|
test('tap', () async {
|
|
await device.tap(100, 200);
|
|
expectLog(<CommandArgs>[
|
|
cmd(command: 'getprop', arguments: <String>['ro.bootimage.build.fingerprint', ';', 'getprop', 'ro.build.version.release', ';', 'getprop', 'ro.build.version.sdk']),
|
|
cmd(command: 'input', arguments: <String>['tap', '100', '200']),
|
|
]);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
void expectLog(List<CommandArgs> log) {
|
|
expect(FakeDevice.commandLog, log);
|
|
}
|
|
|
|
CommandArgs cmd({
|
|
required String command,
|
|
List<String>? arguments,
|
|
Map<String, String>? environment,
|
|
}) {
|
|
return CommandArgs(
|
|
command: command,
|
|
arguments: arguments,
|
|
environment: environment,
|
|
);
|
|
}
|
|
|
|
typedef ExitErrorFactory = dynamic Function();
|
|
|
|
@immutable
|
|
class CommandArgs {
|
|
const CommandArgs({ required this.command, this.arguments, this.environment });
|
|
|
|
final String command;
|
|
final List<String>? arguments;
|
|
final Map<String, String>? environment;
|
|
|
|
@override
|
|
String toString() => 'CommandArgs(command: $command, arguments: $arguments, environment: $environment)';
|
|
|
|
@override
|
|
bool operator==(Object other) {
|
|
if (other.runtimeType != CommandArgs)
|
|
return false;
|
|
return other is CommandArgs
|
|
&& other.command == command
|
|
&& const ListEquality<String>().equals(other.arguments, arguments)
|
|
&& const MapEquality<String, String>().equals(other.environment, environment);
|
|
}
|
|
|
|
@override
|
|
int get hashCode {
|
|
return Object.hash(
|
|
command,
|
|
Object.hashAll(arguments ?? const <String>[]),
|
|
Object.hashAllUnordered(environment?.keys ?? const <String>[]),
|
|
Object.hashAllUnordered(environment?.values ?? const <String>[]),
|
|
);
|
|
}
|
|
}
|
|
|
|
class FakeDevice extends AndroidDevice {
|
|
FakeDevice({required super.deviceId});
|
|
|
|
static String output = '';
|
|
|
|
static List<CommandArgs> commandLog = <CommandArgs>[];
|
|
|
|
static void resetLog() {
|
|
commandLog.clear();
|
|
}
|
|
|
|
static void pretendAwake() {
|
|
output = '''
|
|
mWakefulness=Awake
|
|
''';
|
|
}
|
|
|
|
static void pretendAwakeSamsung() {
|
|
output = '''
|
|
getWakefulnessLocked()=Awake
|
|
''';
|
|
}
|
|
|
|
static void pretendAsleep() {
|
|
output = '''
|
|
mWakefulness=Asleep
|
|
''';
|
|
}
|
|
|
|
static void pretendArm64() {
|
|
output = '''
|
|
arm64
|
|
''';
|
|
}
|
|
|
|
@override
|
|
Future<String> shellEval(String command, List<String> arguments, { Map<String, String>? environment, bool silent = false }) async {
|
|
commandLog.add(CommandArgs(
|
|
command: command,
|
|
arguments: arguments,
|
|
environment: environment,
|
|
));
|
|
return output;
|
|
}
|
|
|
|
@override
|
|
Future<void> shellExec(String command, List<String> arguments, { Map<String, String>? environment, bool silent = false }) async {
|
|
commandLog.add(CommandArgs(
|
|
command: command,
|
|
arguments: arguments,
|
|
environment: environment,
|
|
));
|
|
}
|
|
}
|