blob: d3fb6b315bd4aa7a9d0de9bf27f8188ddfb8bf7a [file] [log] [blame]
// Copyright 2013 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.
// Called from the custom-tests CI action.
//
// usage: dart run tool/run_tests.dart
// ignore_for_file: avoid_print
import 'dart:async';
import 'dart:io';
import 'package:io/io.dart' as io;
import 'package:path/path.dart' as p;
// This test runner simulates a consumption of go_router that checks if
// the dart fixes are applied correctly.
// This is done by copying the `test_fixes/` directory to a temp directory
// that references `go_router`, and running `dart fix --compare-to-golden`
// on the temp directory.
Future<void> main(List<String> args) async {
final Directory goRouterPackageRoot =
File.fromUri(Platform.script).parent.parent;
final Directory testTempDir = await Directory.systemTemp.createTemp();
// Cleans up the temp directory and exits with a given statusCode.
Future<Never> cleanUpAndExit(int statusCode) async {
await testTempDir.delete(recursive: true);
exit(statusCode);
}
// Copy the test_fixes folder to the temporary testFixesTargetDir.
//
// This also creates the proper pubspec.yaml in the temp directory.
await _prepareTemplate(
packageRoot: goRouterPackageRoot,
testTempDir: testTempDir,
);
// Run dart pub get in the temp directory to set it up.
final int pubGetStatusCode = await _runProcess(
'dart',
<String>[
'pub',
'get',
],
workingDirectory: testTempDir.path,
);
if (pubGetStatusCode != 0) {
await cleanUpAndExit(pubGetStatusCode);
}
// Run dart fix --compare-to-golden in the temp directory.
final int dartFixStatusCode = await _runProcess(
'dart',
<String>[
'fix',
'--compare-to-golden',
],
workingDirectory: testTempDir.path,
);
await cleanUpAndExit(dartFixStatusCode);
}
Future<void> _prepareTemplate({
required Directory packageRoot,
required Directory testTempDir,
}) async {
// The src test_fixes directory.
final Directory testFixesSrcDir =
Directory(p.join(packageRoot.path, 'test_fixes'));
// Copy from src `test_fixes/` to the temp directory.
await io.copyPath(testFixesSrcDir.path, testTempDir.path);
// The pubspec.yaml file to create.
final File targetPubspecFile = File(p.join(testTempDir.path, 'pubspec.yaml'));
final String targetYaml = '''
name: test_fixes
publish_to: "none"
version: 1.0.0
environment:
sdk: ">=2.18.0 <4.0.0"
flutter: ">=3.3.0"
dependencies:
flutter:
sdk: flutter
go_router:
path: ${packageRoot.path}
''';
await targetPubspecFile.writeAsString(targetYaml);
}
Future<Process> _streamOutput(Future<Process> processFuture) async {
final Process process = await processFuture;
unawaited(stdout.addStream(process.stdout));
unawaited(stderr.addStream(process.stderr));
return process;
}
Future<int> _runProcess(
String command,
List<String> arguments, {
String? workingDirectory,
}) async {
final Process process = await _streamOutput(Process.start(
command,
arguments,
workingDirectory: workingDirectory,
));
return process.exitCode;
}