[flutter_tools] make local engine integration testing easier (#65802)
diff --git a/packages/flutter_tools/README.md b/packages/flutter_tools/README.md
index bccbfe5..bd644ff 100644
--- a/packages/flutter_tools/README.md
+++ b/packages/flutter_tools/README.md
@@ -22,7 +22,7 @@
To run Flutter Tools from source, in this directory run:
```shell
-$ ../../bin/cache/dart-sdk/bin/dart bin/flutter_tools.dart
+$ ../../bin/dart bin/flutter_tools.dart
```
followed by command-line arguments, as usual.
@@ -56,24 +56,38 @@
of the diff should be close to the average coverage, and should ideally be
better.
+#### Using local engine builds in integration tests
+
+The integration tests can be configured to use a specific local engine
+variant by setting the `FLUTTER_LOCAL_ENGINE` environment variable to the
+name of the local engine (e.g. "android_debug_unopt"). If the local engine build
+requires a source path, this can be provided by setting the `FLUTTER_LOCAL_ENGINE_SRC_PATH`
+environment variable. This second variable is not necessary if the `flutter` and
+`engine` checkouts are in adjacent directories.
+
+```shell
+export FLUTTER_LOCAL_ENGINE=android_debug_unopt
+../../bin/dart test test/integration.shard/some_test_case
+```
+
### Running the tests
To run the tests in the `test/` directory, first ensure that there are no
connected devices. Then, in this directory run:
```shell
-$ ../../bin/cache/dart-sdk/bin/pub run test
+$ ../../bin/dart pub run test
```
The tests in `test/integration.shard` are slower to run than the tests in
`test/general.shard`. To run only the tests in `test/general.shard`, in this
directory run:
```shell
-$ ../../bin/cache/dart-sdk/bin/pub run test test/general.shard
+$ ../../bin/dart pub run test test/general.shard
```
To run the tests in a specific file, run:
```shell
-$ ../../bin/cache/dart-sdk/bin/pub run test test/general.shard/utils_test.dart
+$ ../../bin/dart pub run test test/general.shard/utils_test.dart
```
### Forcing snapshot regeneration
diff --git a/packages/flutter_tools/test/integration.shard/analyze_size_test.dart b/packages/flutter_tools/test/integration.shard/analyze_size_test.dart
index db284c7..888de26 100644
--- a/packages/flutter_tools/test/integration.shard/analyze_size_test.dart
+++ b/packages/flutter_tools/test/integration.shard/analyze_size_test.dart
@@ -18,6 +18,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'build',
'apk',
'--analyze-size',
@@ -42,6 +43,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'build',
'ios',
'--analyze-size',
@@ -65,6 +67,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'build',
'apk',
'--analyze-size',
diff --git a/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart b/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart
index 494cd71..d3da2aa 100644
--- a/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart
+++ b/packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart
@@ -5,23 +5,23 @@
import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
-import 'package:flutter_tools/src/base/platform.dart';
-import 'package:process/process.dart';
-import 'package:flutter_tools/src/globals.dart' as globals;
import '../src/common.dart';
+import 'test_utils.dart';
void main() {
test('flutter build ios --config only updates generated xcconfig file without performing build', () async {
- final String woringDirectory = globals.fs.path.join(getFlutterRoot(), 'examples', 'hello_world');
- final String flutterBin = globals.fs.path.join(getFlutterRoot(), 'bin', 'flutter');
+ final String woringDirectory = fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world');
+ final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
- await const LocalProcessManager().run(<String>[
+ await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'clean',
], workingDirectory: woringDirectory);
- final ProcessResult result = await const LocalProcessManager().run(<String>[
+ final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'build',
'ios',
'--config-only',
@@ -36,20 +36,20 @@
expect(result.exitCode, 0);
- final File generatedConfig = globals.fs.file(
- globals.fs.path.join(woringDirectory, 'ios', 'Flutter', 'Generated.xcconfig'));
+ final File generatedConfig = fileSystem.file(
+ fileSystem.path.join(woringDirectory, 'ios', 'Flutter', 'Generated.xcconfig'));
// Config is updated if command succeeded.
expect(generatedConfig, exists);
expect(generatedConfig.readAsStringSync(), allOf(
contains('DART_OBFUSCATION=true'),
- contains('FLUTTER_FRAMEWORK_DIR=${globals.fs.path.absolute(getFlutterRoot(), 'bin', 'cache', 'artifacts', 'engine')}'),
+ contains('FLUTTER_FRAMEWORK_DIR=${fileSystem.path.absolute(getFlutterRoot(), 'bin', 'cache', 'artifacts', 'engine')}'),
));
// file that only exists if app was fully built.
- final File frameworkPlist = globals.fs.file(
- globals.fs.path.join(woringDirectory, 'build', 'ios', 'iphoneos', 'Runner.app', 'AppFrameworkInfo.plist'));
+ final File frameworkPlist = fileSystem.file(
+ fileSystem.path.join(woringDirectory, 'build', 'ios', 'iphoneos', 'Runner.app', 'AppFrameworkInfo.plist'));
expect(frameworkPlist, isNot(exists));
- },skip: !const LocalPlatform().isMacOS);
+ }, skip: !platform.isMacOS);
}
diff --git a/packages/flutter_tools/test/integration.shard/command_output_test.dart b/packages/flutter_tools/test/integration.shard/command_output_test.dart
index 698b13b..af49bb0 100644
--- a/packages/flutter_tools/test/integration.shard/command_output_test.dart
+++ b/packages/flutter_tools/test/integration.shard/command_output_test.dart
@@ -16,6 +16,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'-h',
'-v',
]);
@@ -36,6 +37,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'doctor',
'-v',
]);
@@ -48,6 +50,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'doctor',
'-vv',
]);
@@ -60,6 +63,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'config',
]);
@@ -89,6 +93,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'run',
'--show-test-device', // ensure command can fail to run and hit injection of correct logger.
'--machine',
@@ -105,6 +110,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'attach',
'--machine',
'-v',
@@ -117,6 +123,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'build',
'-h',
'-v',
@@ -133,6 +140,7 @@
final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
final ProcessResult result = await processManager.run(<String>[
flutterBin,
+ ...getLocalEngineArguments(),
'--version',
'--machine',
]);
diff --git a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart
index 6932d46..c8c0154 100644
--- a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart
+++ b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart
@@ -27,7 +27,7 @@
const ProcessManager processManager = LocalProcessManager();
final Process process = await processManager.start(
- <String>[flutterBin, '--show-test-device', 'daemon'],
+ <String>[flutterBin, ...getLocalEngineArguments(), '--show-test-device', 'daemon'],
workingDirectory: tempDir.path,
);
diff --git a/packages/flutter_tools/test/integration.shard/test_driver.dart b/packages/flutter_tools/test/integration.shard/test_driver.dart
index 1154ff5..8c57063 100644
--- a/packages/flutter_tools/test/integration.shard/test_driver.dart
+++ b/packages/flutter_tools/test/integration.shard/test_driver.dart
@@ -452,6 +452,7 @@
'--disable-service-auth-codes',
if (machine) '--machine',
if (!spawnDdsInstance) '--disable-dds',
+ ...getLocalEngineArguments(),
'-d',
if (chrome)
...<String>[
@@ -482,6 +483,7 @@
await _setupProcess(
<String>[
'attach',
+ ...getLocalEngineArguments(),
'--machine',
if (!spawnDdsInstance)
'--disable-dds',
@@ -705,6 +707,7 @@
}) async {
await _setupProcess(<String>[
'test',
+ ...getLocalEngineArguments(),
'--disable-service-auth-codes',
'--machine',
if (coverage)
diff --git a/packages/flutter_tools/test/integration.shard/test_utils.dart b/packages/flutter_tools/test/integration.shard/test_utils.dart
index 50459cf..f6d3997 100644
--- a/packages/flutter_tools/test/integration.shard/test_utils.dart
+++ b/packages/flutter_tools/test/integration.shard/test_utils.dart
@@ -63,3 +63,15 @@
throw Exception('flutter pub get failed: ${result.stderr}\n${result.stdout}');
}
}
+
+const String kLocalEngineEnvironment = 'FLUTTER_LOCAL_ENGINE';
+const String kLocalEngineLocation = 'FLUTTER_LOCAL_ENGINE_SRC_PATH';
+
+List<String> getLocalEngineArguments() {
+ return <String>[
+ if (platform.environment.containsKey(kLocalEngineEnvironment))
+ '--local-engine=${platform.environment[kLocalEngineEnvironment]}',
+ if (platform.environment.containsKey(kLocalEngineLocation))
+ '--local-engine-src-path=${platform.environment[kLocalEngineLocation]}',
+ ];
+}