Trigger display_cutout_rotation flutter driver test in ci. (#162641)

Fixes https://github.com/flutter/flutter/issues/162615

Can test 2 different ways. 
On a mac (or linux machine) with adb on the path (or android sdk set in
ANDROID_HOME) and an emulator running (or physical device attached) that
is api 30 or higher.
```
cd dev/devicelab
dart bin/test_runner.dart test -t android_display_cutout
```
OR 
```
dev/integration_tests/display_cutout_rotation
flutter drive integration_test/display_cutout_test.dart
```

Proof the test ran successfully
```
[2025-02-12 08:08:22.069817] [STDOUT] Removing Synthetic notch...
[2025-02-12 08:08:22.071147] [STDOUT] Executing "/b/s/w/ir/cache/android/sdk/platform-tools/adb -s emulator-5554 shell cmd overlay disable com.android.internal.display.cutout.emulation.tall" in "/b/s/w/ir/x/w/rc/tmpk3k3yhhp/flutter sdk/dev/integration_tests/display_cutout_rotation/" with environment {BOT: true, LANG: en_US.UTF-8}
[2025-02-12 08:08:22.862219] [STDOUT] Checking for reboot
[android_defines_test] Process terminated with exit code 0.
Task result:
{
  "success": true,
  "data": null,
  "detailFiles": [],
  "benchmarkScoreKeys": [],
  "reason": "success"
}
```

https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8723125792202374961/+/u/run_android_defines_test/stdout
All checks passed
https://github.com/flutter/flutter/pull/162641/checks?check_run_id=36991537539


## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
This commit is contained in:
Reid Baker
2025-02-12 14:42:39 -05:00
committed by GitHub
parent c3fc69d18d
commit 0f5d669acb
7 changed files with 73 additions and 107 deletions

View File

@@ -0,0 +1,12 @@
// 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:flutter_devicelab/framework/devices.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/tasks/integration_tests.dart';
Future<void> main() async {
deviceOperatingSystem = DeviceOperatingSystem.android;
await task(createDisplayCutoutTest());
}

View File

@@ -139,6 +139,44 @@ TaskFunction createSolidColorTest({required bool enableImpeller}) {
).call;
}
// Can run on emulator or physical android device.
// Device must have developer settings enabled.
// Device must be android api 30 or higher.
TaskFunction createDisplayCutoutTest() {
return IntegrationTest(
'${flutterDirectory.path}/dev/integration_tests/display_cutout_rotation/',
'integration_test/display_cutout_test.dart',
setup: (Device device) async {
if (device is! AndroidDevice) {
// Only android devices support this cutoutTest.
throw TaskResult.failure('This test should only target android');
}
// Test requires developer settings added in 28 and behavior added in 30.
final String sdkResult = await device.shellEval('getprop', <String>['ro.build.version.sdk']);
if (sdkResult.startsWith('2') || sdkResult.startsWith('1') || sdkResult.length == 1) {
throw TaskResult.failure('This test should only target android 30+.');
}
print('Adding Synthetic notch...');
// This command will cause any running android activity to be recreated.
await device.shellExec('cmd', <String>[
'overlay',
'enable',
'com.android.internal.display.cutout.emulation.tall',
]);
},
tearDown: (Device device) async {
if (device is AndroidDevice) {
print('Removing Synthetic notch...');
await device.shellExec('cmd', <String>[
'overlay',
'disable',
'com.android.internal.display.cutout.emulation.tall',
]);
}
},
).call;
}
TaskFunction dartDefinesTask() {
return DriverTest(
'${flutterDirectory.path}/dev/integration_tests/ui',
@@ -217,7 +255,6 @@ class DriverTest {
...extraOptions,
];
await flutter('drive', options: options, environment: environment);
return TaskResult.success(null);
});
}
@@ -231,6 +268,8 @@ class IntegrationTest {
this.createPlatforms = const <String>[],
this.withTalkBack = false,
this.environment,
this.setup,
this.tearDown,
});
final String testDirectory;
@@ -240,12 +279,19 @@ class IntegrationTest {
final bool withTalkBack;
final Map<String, String>? environment;
/// Run before flutter drive with the result from devices.workingDevice.
final Future<void> Function(Device device)? setup;
/// Run after flutter drive with the result from devices.workingDevice.
final Future<void> Function(Device device)? tearDown;
Future<TaskResult> call() {
return inDirectory<TaskResult>(testDirectory, () async {
final Device device = await devices.workingDevice;
await device.unlock();
final String deviceId = device.deviceId;
await flutter('packages', options: <String>['get']);
await setup?.call(await devices.workingDevice);
if (createPlatforms.isNotEmpty) {
await flutter(
@@ -265,6 +311,7 @@ class IntegrationTest {
final List<String> options = <String>['-v', '-d', deviceId, testTarget, ...extraOptions];
await flutter('test', options: options, environment: environment);
await tearDown?.call(await devices.workingDevice);
if (withTalkBack) {
await disableTalkBack();