Skip to content

Commit

Permalink
Funnel devicelab tests through utils process methods (#122161)
Browse files Browse the repository at this point in the history
Funnel devicelab tests through utils process methods
  • Loading branch information
jmagman authored Mar 8, 2023
1 parent 244372b commit a16e620
Show file tree
Hide file tree
Showing 13 changed files with 142 additions and 132 deletions.
5 changes: 2 additions & 3 deletions dev/devicelab/bin/tasks/flutter_engine_group_performance.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,9 @@ Future<TaskResult> _doTest() async {
final String gradlew = Platform.isWindows ? 'gradlew.bat' : 'gradlew';
final String gradlewExecutable =
Platform.isWindows ? '.\\$gradlew' : './$gradlew';
final String flutterPath = path.join(flutterDirectory, 'bin', 'flutter');
await utils.eval(flutterPath, <String>['precache', '--android'],
await utils.flutter('precache', options: <String>['--android'],
workingDirectory: modulePath);
await utils.eval(flutterPath, <String>['pub', 'get'],
await utils.flutter('pub', options: <String>['get'],
workingDirectory: modulePath);
_copyGradleFromModule(modulePath, androidPath);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ class NewGalleryChromeRunTest {
]);

final List<String> options = <String>['-d', 'chrome', '--verbose', '--resident'];
final Process process = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
flutterCommandArgs('run', options),
final Process process = await startFlutter(
'run',
options: options,
);

final Completer<void> stdoutDone = Completer<void>();
Expand Down
15 changes: 7 additions & 8 deletions dev/devicelab/bin/tasks/flutter_test_performance.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,13 @@ enum TestStep {

Future<int> runTest({bool coverage = false, bool noPub = false}) async {
final Stopwatch clock = Stopwatch()..start();
final List<String> arguments = flutterCommandArgs('test', <String>[
if (coverage) '--coverage',
if (noPub) '--no-pub',
path.join('flutter_test', 'trivial_widget_test.dart'),
]);
final Process analysis = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
arguments,
final Process analysis = await startFlutter(
'test',
options: <String>[
if (coverage) '--coverage',
if (noPub) '--no-pub',
path.join('flutter_test', 'trivial_widget_test.dart'),
],
workingDirectory: path.join(flutterDirectory.path, 'dev', 'automated_tests'),
);
int badLines = 0;
Expand Down
12 changes: 6 additions & 6 deletions dev/devicelab/bin/tasks/routing_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ void main() {
final Completer<void> ready = Completer<void>();
late bool ok;
print('run: starting...');
final Process run = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
final Process run = await startFlutter(
'run',
// --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
.transform<String>(utf8.decoder)
Expand Down Expand Up @@ -70,9 +70,9 @@ void main() {
throw 'Failed to run test app.';
}
print('drive: starting...');
final Process drive = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
<String>['drive', '--use-existing-app', 'http://127.0.0.1:$vmServicePort/', '--no-keep-app-running', 'lib/route.dart'],
final Process drive = await startFlutter(
'drive',
options: <String>['--use-existing-app', 'http://127.0.0.1:$vmServicePort/', '--no-keep-app-running', 'lib/route.dart'],
);
drive.stdout
.transform<String>(utf8.decoder)
Expand Down
6 changes: 3 additions & 3 deletions dev/devicelab/bin/tasks/service_extensions_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ void main() {
final Completer<void> ready = Completer<void>();
late bool ok;
print('run: starting...');
final Process run = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
<String>['run', '--verbose', '--no-fast-start', '--no-publish-port', '--disable-service-auth-codes', '-d', device.deviceId, 'lib/main.dart'],
final Process run = await startFlutter(
'run',
options: <String>['--verbose', '--no-fast-start', '--no-publish-port', '--disable-service-auth-codes', '-d', device.deviceId, 'lib/main.dart'],
);
run.stdout
.transform<String>(utf8.decoder)
Expand Down
20 changes: 12 additions & 8 deletions dev/devicelab/lib/framework/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ Future<String> eval(
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.
final Set<String> supportedDeviceTimeoutCommands = <String>{
'attach',
Expand Down Expand Up @@ -470,10 +470,11 @@ Future<int> flutter(String command, {
List<String> options = const <String>[],
bool canFail = false, // as in, whether failures are ok. False means that they are fatal.
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,
canFail: canFail, environment: environment);
canFail: canFail, environment: environment, workingDirectory: workingDirectory);
}

/// Starts a Flutter subprocess.
Expand Down Expand Up @@ -502,13 +503,15 @@ Future<Process> startFlutter(String command, {
List<String> options = const <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)
}) {
final List<String> args = flutterCommandArgs(command, options);
String? workingDirectory,
}) async {
final List<String> args = _flutterCommandArgs(command, options);
return startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
args,
environment: environment,
isBot: isBot,
workingDirectory: workingDirectory,
);
}

Expand All @@ -518,16 +521,17 @@ Future<String> evalFlutter(String command, {
bool canFail = false, // as in, whether failures are ok. False means that they are fatal.
Map<String, String>? environment,
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,
canFail: canFail, environment: environment, stderr: stderr);
canFail: canFail, environment: environment, stderr: stderr, workingDirectory: workingDirectory);
}

Future<ProcessResult> executeFlutter(String command, {
List<String> options = const <String>[],
}) async {
final List<String> args = flutterCommandArgs(command, options);
final List<String> args = _flutterCommandArgs(command, options);
return _processManager.run(
<String>[path.join(flutterDirectory.path, 'bin', 'flutter'), ...args],
workingDirectory: cwd,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,9 @@ Future<void> main() async {
section('Flutter run (mode: $mode)');
late Process run;
await inDirectory(path.join(tempDir.path, 'app'), () async {
run = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
flutterCommandArgs('run', <String>['--$mode', '--verbose']),
run = await startFlutter(
'run',
options: <String>['--$mode', '--verbose'],
);
});

Expand Down
6 changes: 3 additions & 3 deletions dev/devicelab/lib/tasks/android_lifecycles_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ void main() {

late Process run;
await inDirectory(path.join(tempDir.path, 'app'), () async {
run = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
flutterCommandArgs('run', <String>['--$mode']),
run = await startFlutter(
'run',
options: <String>['--$mode'],
);
});

Expand Down
6 changes: 3 additions & 3 deletions dev/devicelab/lib/tasks/dart_plugin_registry_tests.dart
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,9 @@ class ApluginPlatformInterfaceMacOS {

late Process run;
await inDirectory(path.join(tempDir.path, 'app'), () async {
run = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
flutterCommandArgs('run', <String>['-d', 'macos', '-v']),
run = await startFlutter(
'run',
options: <String>['-d', 'macos', '-v'],
);
});

Expand Down
145 changes: 77 additions & 68 deletions dev/devicelab/lib/tasks/hot_mode_tests.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ const String kReplacementLine = 'fontSize: (orientation == Orientation.portrait)

TaskFunction createHotModeTest({
String? deviceIdOverride,
Map<String, String>? environment,
bool checkAppRunningOnLocalDevice = false,
}) {
// This file is modified during the test and needs to be restored at the end.
Expand Down Expand Up @@ -63,71 +62,83 @@ TaskFunction createHotModeTest({

try {
await inDirectory<void>(_editedFlutterGalleryDir, () async {
smallReloadData = await captureReloadData(options, environment, benchmarkFile, (String line, Process process) {
if (!line.contains('Reloaded ')) {
return;
}
if (hotReloadCount == 0) {
// Update a file for 2 library invalidation.
final File appDartSource = file(path.join(
_editedFlutterGalleryDir.path, 'lib/gallery/app.dart',
));
appDartSource.writeAsStringSync(
appDartSource.readAsStringSync().replaceFirst(
"'Flutter Gallery'", "'Updated Flutter Gallery'",
smallReloadData = await captureReloadData(
options: options,
benchmarkFile: benchmarkFile,
onLine: (String line, Process process) {
if (!line.contains('Reloaded ')) {
return;
}
if (hotReloadCount == 0) {
// Update a file for 2 library invalidation.
final File appDartSource = file(path.join(
_editedFlutterGalleryDir.path,
'lib/gallery/app.dart',
));
appDartSource.writeAsStringSync(appDartSource.readAsStringSync().replaceFirst(
"'Flutter Gallery'",
"'Updated Flutter Gallery'",
));
process.stdin.writeln('r');
hotReloadCount += 1;
} else {
process.stdin.writeln('q');
}
});
process.stdin.writeln('r');
hotReloadCount += 1;
} else {
process.stdin.writeln('q');
}
},
);

mediumReloadData = await captureReloadData(options, environment, benchmarkFile, (String line, Process process) {
if (!line.contains('Reloaded ')) {
return;
}
if (hotReloadCount == 1) {
// Update a file for ~50 library invalidation.
final File appDartSource = file(path.join(
_editedFlutterGalleryDir.path, 'lib/demo/calculator/home.dart',
));
appDartSource.writeAsStringSync(
appDartSource.readAsStringSync().replaceFirst(kSourceLine, kReplacementLine)
);
process.stdin.writeln('r');
hotReloadCount += 1;
} else {
process.stdin.writeln('q');
}
});
mediumReloadData = await captureReloadData(
options: options,
benchmarkFile: benchmarkFile,
onLine: (String line, Process process) {
if (!line.contains('Reloaded ')) {
return;
}
if (hotReloadCount == 1) {
// Update a file for ~50 library invalidation.
final File appDartSource = file(path.join(
_editedFlutterGalleryDir.path, 'lib/demo/calculator/home.dart',
));
appDartSource.writeAsStringSync(
appDartSource.readAsStringSync().replaceFirst(kSourceLine, kReplacementLine)
);
process.stdin.writeln('r');
hotReloadCount += 1;
} else {
process.stdin.writeln('q');
}
},
);

largeReloadData = await captureReloadData(options, environment, benchmarkFile, (String line, Process process) async {
if (!line.contains('Reloaded ')) {
return;
}
if (hotReloadCount == 2) {
// Trigger a framework invalidation (370 libraries) without modifying the source
flutterFrameworkSource.writeAsStringSync(
'${flutterFrameworkSource.readAsStringSync()}\n'
);
process.stdin.writeln('r');
hotReloadCount += 1;
} else {
if (checkAppRunningOnLocalDevice) {
await _checkAppRunning(true);
largeReloadData = await captureReloadData(
options: options,
benchmarkFile: benchmarkFile,
onLine: (String line, Process process) async {
if (!line.contains('Reloaded ')) {
return;
}
if (hotReloadCount == 2) {
// Trigger a framework invalidation (370 libraries) without modifying the source
flutterFrameworkSource.writeAsStringSync(
'${flutterFrameworkSource.readAsStringSync()}\n'
);
process.stdin.writeln('r');
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
// state. Frontend loads up from previously generated kernel files.
{
final Process process = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
flutterCommandArgs('run', options),
environment: environment,
final Process process = await startFlutter(
'run',
options: options,
);
final Completer<void> stdoutDone = Completer<void>();
final Completer<void> stderrDone = Completer<void>();
Expand Down Expand Up @@ -233,16 +244,14 @@ TaskFunction createHotModeTest({
};
}

Future<Map<String, dynamic>> captureReloadData(
List<String> options,
Map<String, String>? environment,
File benchmarkFile,
void Function(String, Process) onLine,
) async {
final Process process = await startProcess(
path.join(flutterDirectory.path, 'bin', 'flutter'),
flutterCommandArgs('run', options),
environment: environment,
Future<Map<String, dynamic>> captureReloadData({
required List<String> options,
required File benchmarkFile,
required void Function(String, Process) onLine,
}) async {
final Process process = await startFlutter(
'run',
options: options,
);

final Completer<void> stdoutDone = Completer<void>();
Expand Down
22 changes: 12 additions & 10 deletions dev/devicelab/lib/tasks/perf_tests.dart
Original file line number Diff line number Diff line change
Expand Up @@ -867,17 +867,19 @@ class DevtoolsStartupTest {
break;
}

final Process process = await startProcess(path.join(flutterDirectory.path, 'bin', 'flutter'), <String>[
final Process process = await startFlutter(
'run',
'--no-android-gradle-daemon',
'--no-publish-port',
'--verbose',
'--profile',
'-d',
device.deviceId,
if (applicationBinaryPath != null)
'--use-application-binary=$applicationBinaryPath',
]);
options: <String>[
'--no-android-gradle-daemon',
'--no-publish-port',
'--verbose',
'--profile',
'-d',
device.deviceId,
if (applicationBinaryPath != null)
'--use-application-binary=$applicationBinaryPath',
],
);
final Completer<void> completer = Completer<void>();
bool sawLine = false;
process.stdout
Expand Down
Loading

0 comments on commit a16e620

Please sign in to comment.