Unverified Commit a16e620e authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Funnel devicelab tests through utils process methods (#122161)

Funnel devicelab tests through utils process methods
parent 244372b3
...@@ -58,10 +58,9 @@ Future<TaskResult> _doTest() async { ...@@ -58,10 +58,9 @@ Future<TaskResult> _doTest() async {
final String gradlew = Platform.isWindows ? 'gradlew.bat' : 'gradlew'; final String gradlew = Platform.isWindows ? 'gradlew.bat' : 'gradlew';
final String gradlewExecutable = final String gradlewExecutable =
Platform.isWindows ? '.\\$gradlew' : './$gradlew'; Platform.isWindows ? '.\\$gradlew' : './$gradlew';
final String flutterPath = path.join(flutterDirectory, 'bin', 'flutter'); await utils.flutter('precache', options: <String>['--android'],
await utils.eval(flutterPath, <String>['precache', '--android'],
workingDirectory: modulePath); workingDirectory: modulePath);
await utils.eval(flutterPath, <String>['pub', 'get'], await utils.flutter('pub', options: <String>['get'],
workingDirectory: modulePath); workingDirectory: modulePath);
_copyGradleFromModule(modulePath, androidPath); _copyGradleFromModule(modulePath, androidPath);
......
...@@ -53,9 +53,9 @@ class NewGalleryChromeRunTest { ...@@ -53,9 +53,9 @@ class NewGalleryChromeRunTest {
]); ]);
final List<String> options = <String>['-d', 'chrome', '--verbose', '--resident']; final List<String> options = <String>['-d', 'chrome', '--verbose', '--resident'];
final Process process = await startProcess( final Process process = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
flutterCommandArgs('run', options), options: options,
); );
final Completer<void> stdoutDone = Completer<void>(); final Completer<void> stdoutDone = Completer<void>();
......
...@@ -38,14 +38,13 @@ enum TestStep { ...@@ -38,14 +38,13 @@ enum TestStep {
Future<int> runTest({bool coverage = false, bool noPub = false}) async { Future<int> runTest({bool coverage = false, bool noPub = false}) async {
final Stopwatch clock = Stopwatch()..start(); final Stopwatch clock = Stopwatch()..start();
final List<String> arguments = flutterCommandArgs('test', <String>[ final Process analysis = await startFlutter(
if (coverage) '--coverage', 'test',
if (noPub) '--no-pub', options: <String>[
path.join('flutter_test', 'trivial_widget_test.dart'), if (coverage) '--coverage',
]); if (noPub) '--no-pub',
final Process analysis = await startProcess( path.join('flutter_test', 'trivial_widget_test.dart'),
path.join(flutterDirectory.path, 'bin', 'flutter'), ],
arguments,
workingDirectory: path.join(flutterDirectory.path, 'dev', 'automated_tests'), workingDirectory: path.join(flutterDirectory.path, 'dev', 'automated_tests'),
); );
int badLines = 0; int badLines = 0;
......
...@@ -38,10 +38,10 @@ void main() { ...@@ -38,10 +38,10 @@ void main() {
final Completer<void> ready = Completer<void>(); final Completer<void> ready = Completer<void>();
late bool ok; late bool ok;
print('run: starting...'); print('run: starting...');
final Process run = await startProcess( final Process run = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
// --fast-start does not support routes. // --fast-start does not support routes.
<String>['run', '--verbose', '--disable-service-auth-codes', '--no-fast-start', '--no-publish-port', '-d', device.deviceId, '--route', '/smuggle-it', 'lib/route.dart'], options: <String>['--verbose', '--disable-service-auth-codes', '--no-fast-start', '--no-publish-port', '-d', device.deviceId, '--route', '/smuggle-it', 'lib/route.dart'],
); );
run.stdout run.stdout
.transform<String>(utf8.decoder) .transform<String>(utf8.decoder)
...@@ -70,9 +70,9 @@ void main() { ...@@ -70,9 +70,9 @@ void main() {
throw 'Failed to run test app.'; throw 'Failed to run test app.';
} }
print('drive: starting...'); print('drive: starting...');
final Process drive = await startProcess( final Process drive = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'drive',
<String>['drive', '--use-existing-app', 'http://127.0.0.1:$vmServicePort/', '--no-keep-app-running', 'lib/route.dart'], options: <String>['--use-existing-app', 'http://127.0.0.1:$vmServicePort/', '--no-keep-app-running', 'lib/route.dart'],
); );
drive.stdout drive.stdout
.transform<String>(utf8.decoder) .transform<String>(utf8.decoder)
......
...@@ -25,9 +25,9 @@ void main() { ...@@ -25,9 +25,9 @@ void main() {
final Completer<void> ready = Completer<void>(); final Completer<void> ready = Completer<void>();
late bool ok; late bool ok;
print('run: starting...'); print('run: starting...');
final Process run = await startProcess( final Process run = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
<String>['run', '--verbose', '--no-fast-start', '--no-publish-port', '--disable-service-auth-codes', '-d', device.deviceId, 'lib/main.dart'], options: <String>['--verbose', '--no-fast-start', '--no-publish-port', '--disable-service-auth-codes', '-d', device.deviceId, 'lib/main.dart'],
); );
run.stdout run.stdout
.transform<String>(utf8.decoder) .transform<String>(utf8.decoder)
......
...@@ -433,7 +433,7 @@ Future<String> eval( ...@@ -433,7 +433,7 @@ Future<String> eval(
return output.toString().trimRight(); return output.toString().trimRight();
} }
List<String> flutterCommandArgs(String command, List<String> options) { List<String> _flutterCommandArgs(String command, List<String> options) {
// Commands support the --device-timeout flag. // Commands support the --device-timeout flag.
final Set<String> supportedDeviceTimeoutCommands = <String>{ final Set<String> supportedDeviceTimeoutCommands = <String>{
'attach', 'attach',
...@@ -470,10 +470,11 @@ Future<int> flutter(String command, { ...@@ -470,10 +470,11 @@ Future<int> flutter(String command, {
List<String> options = const <String>[], List<String> options = const <String>[],
bool canFail = false, // as in, whether failures are ok. False means that they are fatal. bool canFail = false, // as in, whether failures are ok. False means that they are fatal.
Map<String, String>? environment, Map<String, String>? environment,
String? workingDirectory,
}) { }) {
final List<String> args = flutterCommandArgs(command, options); final List<String> args = _flutterCommandArgs(command, options);
return exec(path.join(flutterDirectory.path, 'bin', 'flutter'), args, return exec(path.join(flutterDirectory.path, 'bin', 'flutter'), args,
canFail: canFail, environment: environment); canFail: canFail, environment: environment, workingDirectory: workingDirectory);
} }
/// Starts a Flutter subprocess. /// Starts a Flutter subprocess.
...@@ -502,13 +503,15 @@ Future<Process> startFlutter(String command, { ...@@ -502,13 +503,15 @@ Future<Process> startFlutter(String command, {
List<String> options = const <String>[], List<String> options = const <String>[],
Map<String, String> environment = const <String, String>{}, Map<String, String> environment = const <String, String>{},
bool isBot = true, // set to false to pretend not to be on a bot (e.g. to test user-facing outputs) bool isBot = true, // set to false to pretend not to be on a bot (e.g. to test user-facing outputs)
}) { String? workingDirectory,
final List<String> args = flutterCommandArgs(command, options); }) async {
final List<String> args = _flutterCommandArgs(command, options);
return startProcess( return startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'), path.join(flutterDirectory.path, 'bin', 'flutter'),
args, args,
environment: environment, environment: environment,
isBot: isBot, isBot: isBot,
workingDirectory: workingDirectory,
); );
} }
...@@ -518,16 +521,17 @@ Future<String> evalFlutter(String command, { ...@@ -518,16 +521,17 @@ Future<String> evalFlutter(String command, {
bool canFail = false, // as in, whether failures are ok. False means that they are fatal. bool canFail = false, // as in, whether failures are ok. False means that they are fatal.
Map<String, String>? environment, Map<String, String>? environment,
StringBuffer? stderr, // if not null, the stderr will be written here. StringBuffer? stderr, // if not null, the stderr will be written here.
String? workingDirectory,
}) { }) {
final List<String> args = flutterCommandArgs(command, options); final List<String> args = _flutterCommandArgs(command, options);
return eval(path.join(flutterDirectory.path, 'bin', 'flutter'), args, return eval(path.join(flutterDirectory.path, 'bin', 'flutter'), args,
canFail: canFail, environment: environment, stderr: stderr); canFail: canFail, environment: environment, stderr: stderr, workingDirectory: workingDirectory);
} }
Future<ProcessResult> executeFlutter(String command, { Future<ProcessResult> executeFlutter(String command, {
List<String> options = const <String>[], List<String> options = const <String>[],
}) async { }) async {
final List<String> args = flutterCommandArgs(command, options); final List<String> args = _flutterCommandArgs(command, options);
return _processManager.run( return _processManager.run(
<String>[path.join(flutterDirectory.path, 'bin', 'flutter'), ...args], <String>[path.join(flutterDirectory.path, 'bin', 'flutter'), ...args],
workingDirectory: cwd, workingDirectory: cwd,
......
...@@ -88,9 +88,9 @@ Future<void> main() async { ...@@ -88,9 +88,9 @@ Future<void> main() async {
section('Flutter run (mode: $mode)'); section('Flutter run (mode: $mode)');
late Process run; late Process run;
await inDirectory(path.join(tempDir.path, 'app'), () async { await inDirectory(path.join(tempDir.path, 'app'), () async {
run = await startProcess( run = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
flutterCommandArgs('run', <String>['--$mode', '--verbose']), options: <String>['--$mode', '--verbose'],
); );
}); });
......
...@@ -77,9 +77,9 @@ void main() { ...@@ -77,9 +77,9 @@ void main() {
late Process run; late Process run;
await inDirectory(path.join(tempDir.path, 'app'), () async { await inDirectory(path.join(tempDir.path, 'app'), () async {
run = await startProcess( run = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
flutterCommandArgs('run', <String>['--$mode']), options: <String>['--$mode'],
); );
}); });
......
...@@ -143,9 +143,9 @@ class ApluginPlatformInterfaceMacOS { ...@@ -143,9 +143,9 @@ class ApluginPlatformInterfaceMacOS {
late Process run; late Process run;
await inDirectory(path.join(tempDir.path, 'app'), () async { await inDirectory(path.join(tempDir.path, 'app'), () async {
run = await startProcess( run = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
flutterCommandArgs('run', <String>['-d', 'macos', '-v']), options: <String>['-d', 'macos', '-v'],
); );
}); });
......
...@@ -22,7 +22,6 @@ const String kReplacementLine = 'fontSize: (orientation == Orientation.portrait) ...@@ -22,7 +22,6 @@ const String kReplacementLine = 'fontSize: (orientation == Orientation.portrait)
TaskFunction createHotModeTest({ TaskFunction createHotModeTest({
String? deviceIdOverride, String? deviceIdOverride,
Map<String, String>? environment,
bool checkAppRunningOnLocalDevice = false, bool checkAppRunningOnLocalDevice = false,
}) { }) {
// This file is modified during the test and needs to be restored at the end. // This file is modified during the test and needs to be restored at the end.
...@@ -63,71 +62,83 @@ TaskFunction createHotModeTest({ ...@@ -63,71 +62,83 @@ TaskFunction createHotModeTest({
try { try {
await inDirectory<void>(_editedFlutterGalleryDir, () async { await inDirectory<void>(_editedFlutterGalleryDir, () async {
smallReloadData = await captureReloadData(options, environment, benchmarkFile, (String line, Process process) { smallReloadData = await captureReloadData(
if (!line.contains('Reloaded ')) { options: options,
return; benchmarkFile: benchmarkFile,
} onLine: (String line, Process process) {
if (hotReloadCount == 0) { if (!line.contains('Reloaded ')) {
// Update a file for 2 library invalidation. return;
final File appDartSource = file(path.join( }
_editedFlutterGalleryDir.path, 'lib/gallery/app.dart', if (hotReloadCount == 0) {
)); // Update a file for 2 library invalidation.
appDartSource.writeAsStringSync( final File appDartSource = file(path.join(
appDartSource.readAsStringSync().replaceFirst( _editedFlutterGalleryDir.path,
"'Flutter Gallery'", "'Updated Flutter Gallery'", 'lib/gallery/app.dart',
));
appDartSource.writeAsStringSync(appDartSource.readAsStringSync().replaceFirst(
"'Flutter Gallery'",
"'Updated Flutter Gallery'",
)); ));
process.stdin.writeln('r'); process.stdin.writeln('r');
hotReloadCount += 1; hotReloadCount += 1;
} else { } else {
process.stdin.writeln('q'); process.stdin.writeln('q');
} }
}); },
);
mediumReloadData = await captureReloadData(options, environment, benchmarkFile, (String line, Process process) { mediumReloadData = await captureReloadData(
if (!line.contains('Reloaded ')) { options: options,
return; benchmarkFile: benchmarkFile,
} onLine: (String line, Process process) {
if (hotReloadCount == 1) { if (!line.contains('Reloaded ')) {
// Update a file for ~50 library invalidation. return;
final File appDartSource = file(path.join( }
_editedFlutterGalleryDir.path, 'lib/demo/calculator/home.dart', if (hotReloadCount == 1) {
)); // Update a file for ~50 library invalidation.
appDartSource.writeAsStringSync( final File appDartSource = file(path.join(
appDartSource.readAsStringSync().replaceFirst(kSourceLine, kReplacementLine) _editedFlutterGalleryDir.path, 'lib/demo/calculator/home.dart',
); ));
process.stdin.writeln('r'); appDartSource.writeAsStringSync(
hotReloadCount += 1; appDartSource.readAsStringSync().replaceFirst(kSourceLine, kReplacementLine)
} else { );
process.stdin.writeln('q'); process.stdin.writeln('r');
} hotReloadCount += 1;
}); } else {
process.stdin.writeln('q');
}
},
);
largeReloadData = await captureReloadData(options, environment, benchmarkFile, (String line, Process process) async { largeReloadData = await captureReloadData(
if (!line.contains('Reloaded ')) { options: options,
return; benchmarkFile: benchmarkFile,
} onLine: (String line, Process process) async {
if (hotReloadCount == 2) { if (!line.contains('Reloaded ')) {
// Trigger a framework invalidation (370 libraries) without modifying the source return;
flutterFrameworkSource.writeAsStringSync( }
'${flutterFrameworkSource.readAsStringSync()}\n' if (hotReloadCount == 2) {
); // Trigger a framework invalidation (370 libraries) without modifying the source
process.stdin.writeln('r'); flutterFrameworkSource.writeAsStringSync(
hotReloadCount += 1; '${flutterFrameworkSource.readAsStringSync()}\n'
} else { );
if (checkAppRunningOnLocalDevice) { process.stdin.writeln('r');
await _checkAppRunning(true); hotReloadCount += 1;
} else {
if (checkAppRunningOnLocalDevice) {
await _checkAppRunning(true);
}
process.stdin.writeln('q');
} }
process.stdin.writeln('q'); },
} );
});
// Start `flutter run` again to make sure it loads from the previous // Start `flutter run` again to make sure it loads from the previous
// state. Frontend loads up from previously generated kernel files. // state. Frontend loads up from previously generated kernel files.
{ {
final Process process = await startProcess( final Process process = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
flutterCommandArgs('run', options), options: options,
environment: environment,
); );
final Completer<void> stdoutDone = Completer<void>(); final Completer<void> stdoutDone = Completer<void>();
final Completer<void> stderrDone = Completer<void>(); final Completer<void> stderrDone = Completer<void>();
...@@ -233,16 +244,14 @@ TaskFunction createHotModeTest({ ...@@ -233,16 +244,14 @@ TaskFunction createHotModeTest({
}; };
} }
Future<Map<String, dynamic>> captureReloadData( Future<Map<String, dynamic>> captureReloadData({
List<String> options, required List<String> options,
Map<String, String>? environment, required File benchmarkFile,
File benchmarkFile, required void Function(String, Process) onLine,
void Function(String, Process) onLine, }) async {
) async { final Process process = await startFlutter(
final Process process = await startProcess( 'run',
path.join(flutterDirectory.path, 'bin', 'flutter'), options: options,
flutterCommandArgs('run', options),
environment: environment,
); );
final Completer<void> stdoutDone = Completer<void>(); final Completer<void> stdoutDone = Completer<void>();
......
...@@ -867,17 +867,19 @@ class DevtoolsStartupTest { ...@@ -867,17 +867,19 @@ class DevtoolsStartupTest {
break; break;
} }
final Process process = await startProcess(path.join(flutterDirectory.path, 'bin', 'flutter'), <String>[ final Process process = await startFlutter(
'run', 'run',
'--no-android-gradle-daemon', options: <String>[
'--no-publish-port', '--no-android-gradle-daemon',
'--verbose', '--no-publish-port',
'--profile', '--verbose',
'-d', '--profile',
device.deviceId, '-d',
if (applicationBinaryPath != null) device.deviceId,
'--use-application-binary=$applicationBinaryPath', if (applicationBinaryPath != null)
]); '--use-application-binary=$applicationBinaryPath',
],
);
final Completer<void> completer = Completer<void>(); final Completer<void> completer = Completer<void>();
bool sawLine = false; bool sawLine = false;
process.stdout process.stdout
......
...@@ -21,18 +21,15 @@ TaskFunction runTask(adb.DeviceOperatingSystem operatingSystem) { ...@@ -21,18 +21,15 @@ TaskFunction runTask(adb.DeviceOperatingSystem operatingSystem) {
final Directory appDir = utils.dir(path.join(utils.flutterDirectory.path, final Directory appDir = utils.dir(path.join(utils.flutterDirectory.path,
'dev/benchmarks/platform_channels_benchmarks')); 'dev/benchmarks/platform_channels_benchmarks'));
final Process flutterProcess = await utils.inDirectory(appDir, () async { final Process flutterProcess = await utils.inDirectory(appDir, () async {
final String flutterExe =
path.join(utils.flutterDirectory.path, 'bin', 'flutter');
final List<String> createArgs = <String>[ final List<String> createArgs = <String>[
'create',
'--platforms', '--platforms',
'ios,android', 'ios,android',
'--no-overwrite', '--no-overwrite',
'-v', '-v',
'.', '.',
]; ];
print('\nExecuting: $flutterExe $createArgs $appDir'); print('\nExecuting: flutter create $createArgs $appDir');
await utils.eval(flutterExe, createArgs); await utils.flutter('create', options: createArgs);
final List<String> options = <String>[ final List<String> options = <String>[
'-v', '-v',
......
...@@ -42,13 +42,13 @@ TaskFunction createWebDevModeTest(String webDevice, bool enableIncrementalCompil ...@@ -42,13 +42,13 @@ TaskFunction createWebDevModeTest(String webDevice, bool enableIncrementalCompil
recursiveCopy(flutterGalleryDir, _editedFlutterGalleryDir); recursiveCopy(flutterGalleryDir, _editedFlutterGalleryDir);
await inDirectory<void>(_editedFlutterGalleryDir, () async { await inDirectory<void>(_editedFlutterGalleryDir, () async {
{ {
await exec( await flutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'packages',
<String>['packages', 'get'], options: <String>['get'],
); );
final Process process = await startProcess( final Process process = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
flutterCommandArgs('run', options), options: options,
); );
final Completer<void> stdoutDone = Completer<void>(); final Completer<void> stdoutDone = Completer<void>();
...@@ -127,9 +127,9 @@ TaskFunction createWebDevModeTest(String webDevice, bool enableIncrementalCompil ...@@ -127,9 +127,9 @@ TaskFunction createWebDevModeTest(String webDevice, bool enableIncrementalCompil
{ {
final Stopwatch sw = Stopwatch()..start(); final Stopwatch sw = Stopwatch()..start();
final Process process = await startProcess( final Process process = await startFlutter(
path.join(flutterDirectory.path, 'bin', 'flutter'), 'run',
flutterCommandArgs('run', options), options: options,
); );
final Completer<void> stdoutDone = Completer<void>(); final Completer<void> stdoutDone = Completer<void>();
final Completer<void> stderrDone = Completer<void>(); final Completer<void> stderrDone = Completer<void>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment