mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Force Impeller backend for android_engine_test
, and test both OpenGLES and Vulkan (#162089)
A few changes in this PR (could have been split up, but that would take an extra 4 hours - 2 days in CI time): - Removed the old `flutter_driver_android_test` shards and references - Override `AndroidManifest.xml` per backend, forcing that backend to be used (no fallbacks) or it fails - Bumps the Android emulator to 35 due to the use of magic strings, I think The check for the Impeller backend actually being used is the honor system right now, as a bug in `flutter drive` (https://github.com/flutter/flutter/issues/162087) prevents me from seeing error output, meaning that it's impossible to be sure a particular Impeller backend is used (or understand why a crash happens), so I guess I'll work on that next. Due to https://github.com/flutter/flutter/issues/162088, we were accidentally running our Vulkan tests as OpenGLES 🤦🏼 .
This commit is contained in:
parent
e057941ee7
commit
9cc132d4c2
30
.ci.yaml
30
.ci.yaml
@ -1526,7 +1526,7 @@ targets:
|
|||||||
- engine/**
|
- engine/**
|
||||||
- DEPS
|
- DEPS
|
||||||
|
|
||||||
- name: Linux_android_emu_34 android_engine_vulkan_tests
|
- name: Linux_android_emu android_engine_vulkan_tests
|
||||||
recipe: flutter/flutter_drone
|
recipe: flutter/flutter_drone
|
||||||
bringup: true
|
bringup: true
|
||||||
timeout: 60
|
timeout: 60
|
||||||
@ -1539,7 +1539,7 @@ targets:
|
|||||||
{"dependency": "goldctl", "version": "git_revision:2387d6fff449587eecbb7e45b2692ca0710b63b9"}
|
{"dependency": "goldctl", "version": "git_revision:2387d6fff449587eecbb7e45b2692ca0710b63b9"}
|
||||||
]
|
]
|
||||||
|
|
||||||
- name: Linux_android_emu_34 android_engine_opengles_tests
|
- name: Linux_android_emu android_engine_opengles_tests
|
||||||
recipe: flutter/flutter_drone
|
recipe: flutter/flutter_drone
|
||||||
bringup: true
|
bringup: true
|
||||||
timeout: 60
|
timeout: 60
|
||||||
@ -1552,32 +1552,6 @@ targets:
|
|||||||
{"dependency": "goldctl", "version": "git_revision:2387d6fff449587eecbb7e45b2692ca0710b63b9"}
|
{"dependency": "goldctl", "version": "git_revision:2387d6fff449587eecbb7e45b2692ca0710b63b9"}
|
||||||
]
|
]
|
||||||
|
|
||||||
- name: Linux_android_emu flutter_driver_android_test
|
|
||||||
recipe: flutter/flutter_drone
|
|
||||||
bringup: true
|
|
||||||
timeout: 60
|
|
||||||
properties:
|
|
||||||
shard: android_engine_tests
|
|
||||||
tags: >
|
|
||||||
["framework", "hostonly", "shard", "linux"]
|
|
||||||
dependencies: >-
|
|
||||||
[
|
|
||||||
{"dependency": "goldctl", "version": "git_revision:2387d6fff449587eecbb7e45b2692ca0710b63b9"}
|
|
||||||
]
|
|
||||||
presubmit_max_attempts: "2"
|
|
||||||
|
|
||||||
- name: Linux_android_emu_34 flutter_driver_android_test
|
|
||||||
recipe: flutter/flutter_drone
|
|
||||||
timeout: 60
|
|
||||||
properties:
|
|
||||||
shard: android_engine_tests
|
|
||||||
tags: >
|
|
||||||
["framework", "hostonly", "shard", "linux"]
|
|
||||||
dependencies: >-
|
|
||||||
[
|
|
||||||
{"dependency": "goldctl", "version": "git_revision:2387d6fff449587eecbb7e45b2692ca0710b63b9"}
|
|
||||||
]
|
|
||||||
|
|
||||||
- name: Linux web_benchmarks_canvaskit
|
- name: Linux web_benchmarks_canvaskit
|
||||||
recipe: devicelab/devicelab_drone
|
recipe: devicelab/devicelab_drone
|
||||||
presubmit: false
|
presubmit: false
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
import 'package:file/file.dart';
|
import 'package:file/file.dart';
|
||||||
|
import 'package:file/local.dart';
|
||||||
import 'package:glob/glob.dart';
|
import 'package:glob/glob.dart';
|
||||||
import 'package:glob/list_local_fs.dart';
|
import 'package:glob/list_local_fs.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
@ -32,12 +33,32 @@ import '../utils.dart';
|
|||||||
/// to determine flakiness in the *same* state, or want better debugging, see
|
/// to determine flakiness in the *same* state, or want better debugging, see
|
||||||
/// `dev/integration_tests/android_engine_test/README.md`.
|
/// `dev/integration_tests/android_engine_test/README.md`.
|
||||||
Future<void> runAndroidEngineTests({required ImpellerBackend impellerBackend}) async {
|
Future<void> runAndroidEngineTests({required ImpellerBackend impellerBackend}) async {
|
||||||
print('Running Flutter Driver Android tests...');
|
print('Running Flutter Driver Android tests (backend=$impellerBackend)');
|
||||||
|
|
||||||
final String androidEngineTestPath = path.join('dev', 'integration_tests', 'android_engine_test');
|
final String androidEngineTestPath = path.join('dev', 'integration_tests', 'android_engine_test');
|
||||||
final List<FileSystemEntity> mains = Glob('$androidEngineTestPath/lib/**_main.dart').listSync();
|
final List<FileSystemEntity> mains = Glob('$androidEngineTestPath/lib/**_main.dart').listSync();
|
||||||
|
|
||||||
|
final File androidManifestXml = const LocalFileSystem().file(
|
||||||
|
path.join(androidEngineTestPath, 'android', 'app', 'src', 'main', 'AndroidManifest.xml'),
|
||||||
|
);
|
||||||
|
final String androidManifestContents = androidManifestXml.readAsStringSync();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Replace whatever the current backend is with the specified backend.
|
||||||
|
final RegExp impellerBackendMetadata = RegExp(_impellerBackendMetadata(value: '.*'));
|
||||||
|
androidManifestXml.writeAsStringSync(
|
||||||
|
androidManifestContents.replaceFirst(
|
||||||
|
impellerBackendMetadata,
|
||||||
|
_impellerBackendMetadata(value: impellerBackend.name),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Stdout will produce: "Using the Impeller rendering backend (.*)"
|
||||||
|
// TODO(matanlurey): Enable once `flutter drive` retains error logs.
|
||||||
|
// final RegExp impellerStdoutPattern = RegExp('Using the Imepller rendering backend (.*)');
|
||||||
|
|
||||||
for (final FileSystemEntity file in mains) {
|
for (final FileSystemEntity file in mains) {
|
||||||
await runCommand(
|
final CommandResult result = await runCommand(
|
||||||
'flutter',
|
'flutter',
|
||||||
<String>[
|
<String>[
|
||||||
'drive',
|
'drive',
|
||||||
@ -53,7 +74,37 @@ Future<void> runAndroidEngineTests({required ImpellerBackend impellerBackend}) a
|
|||||||
workingDirectory: androidEngineTestPath,
|
workingDirectory: androidEngineTestPath,
|
||||||
environment: <String, String>{'ANDROID_ENGINE_TEST_GOLDEN_VARIANT': impellerBackend.name},
|
environment: <String, String>{'ANDROID_ENGINE_TEST_GOLDEN_VARIANT': impellerBackend.name},
|
||||||
);
|
);
|
||||||
|
final String? stdout = result.flattenedStdout;
|
||||||
|
if (stdout == null) {
|
||||||
|
foundError(<String>['No stdout produced.']);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(matanlurey): Enable once `flutter drive` retains error logs.
|
||||||
|
// https://github.com/flutter/flutter/issues/162087.
|
||||||
|
//
|
||||||
|
// final Match? stdoutMatch = impellerStdoutPattern.firstMatch(stdout);
|
||||||
|
// if (stdoutMatch == null) {
|
||||||
|
// foundError(<String>['Could not find pattern ${impellerStdoutPattern.pattern}.', stdout]);
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// final String reportedBackend = stdoutMatch.group(1)!.toLowerCase();
|
||||||
|
// if (reportedBackend != impellerBackend.name) {
|
||||||
|
// foundError(<String>[
|
||||||
|
// 'Reported Imepller backend was $reportedBackend, expected ${impellerBackend.name}',
|
||||||
|
// ]);
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
// Restore original contents.
|
||||||
|
androidManifestXml.writeAsStringSync(androidManifestContents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String _impellerBackendMetadata({required String value}) {
|
||||||
|
return '<meta-data android:name="io.flutter.embedding.android.ImpellerBackend" android:value="$value" />';
|
||||||
|
}
|
||||||
|
|
||||||
enum ImpellerBackend { vulkan, opengles }
|
enum ImpellerBackend { vulkan, opengles }
|
||||||
|
@ -137,9 +137,6 @@ Future<void> main(List<String> args) async {
|
|||||||
'web_skwasm_tests': webTestsSuite.runWebSkwasmUnitTests,
|
'web_skwasm_tests': webTestsSuite.runWebSkwasmUnitTests,
|
||||||
// All web integration tests
|
// All web integration tests
|
||||||
'web_long_running_tests': webTestsSuite.webLongRunningTestsRunner,
|
'web_long_running_tests': webTestsSuite.webLongRunningTestsRunner,
|
||||||
// TODO(matanlurey): Remove once a post-submit runs with the new shards.
|
|
||||||
// (Part of https://github.com/flutter/flutter/issues/161333)
|
|
||||||
'android_engine_tests': () => runAndroidEngineTests(impellerBackend: ImpellerBackend.vulkan),
|
|
||||||
'android_engine_vulkan_tests':
|
'android_engine_vulkan_tests':
|
||||||
() => runAndroidEngineTests(impellerBackend: ImpellerBackend.vulkan),
|
() => runAndroidEngineTests(impellerBackend: ImpellerBackend.vulkan),
|
||||||
'android_engine_opengles_tests':
|
'android_engine_opengles_tests':
|
||||||
|
@ -19,7 +19,8 @@ See [`dev/bots/suite_runners/run_android_engine_tests.dart`](../../bots/suite_ru
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
# TIP: If golden-files do not exist locally, this command will fail locally.
|
# TIP: If golden-files do not exist locally, this command will fail locally.
|
||||||
SHARD=android_engine_tests bin/cache/dart-sdk/bin/dart dev/bots/test.dart
|
SHARD=android_engine_vulkan_tests bin/cache/dart-sdk/bin/dart dev/bots/test.dart
|
||||||
|
SHARD=android_engine_opengles_tests bin/cache/dart-sdk/bin/dart dev/bots/test.dart
|
||||||
```
|
```
|
||||||
|
|
||||||
## Running the apps and tests
|
## Running the apps and tests
|
||||||
|
@ -31,9 +31,9 @@ found in the LICENSE file. -->
|
|||||||
</activity>
|
</activity>
|
||||||
<!-- Don't delete the meta-data below.
|
<!-- Don't delete the meta-data below.
|
||||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
<meta-data
|
<meta-data android:name="flutterEmbedding" android:value="2" />
|
||||||
android:name="flutterEmbedding"
|
<meta-data android:name="io.flutter.embedding.android.EnableImpeller" android:value="true" />
|
||||||
android:value="2" />
|
<meta-data android:name="io.flutter.embedding.android.ImpellerBackend" android:value="vulkan" />
|
||||||
</application>
|
</application>
|
||||||
<!-- Required to query activities that can process text, see:
|
<!-- Required to query activities that can process text, see:
|
||||||
https://developer.android.com/training/package-visibility and
|
https://developer.android.com/training/package-visibility and
|
||||||
|
Loading…
Reference in New Issue
Block a user