blob: 66145da6ab7d6f58c73437626731ef559e35a6e8 [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:io';
import 'utils/io_utils.dart';
final Uri repoDirUri = computeRepoDirUri();
Future<void> main() async {
String? coverage = Platform.environment["CFE_COVERAGE"];
if (coverage == null) {
throw "Set coverage path via 'CFE_COVERAGE' environment!";
}
List<String> testPaths = [];
for (String path in [
"pkg/_fe_analyzer_shared/test/",
"pkg/front_end/test/",
"pkg/frontend_server/test/",
"pkg/kernel/test/",
]) {
for (FileSystemEntity entry
in new Directory.fromUri(repoDirUri.resolve(path))
.listSync(recursive: true)) {
if (entry is! File) continue;
if (!entry.path.endsWith("_test.dart")) continue;
testPaths.add(entry.path);
}
}
Uri coverageRunner =
repoDirUri.resolve("pkg/front_end/tool/coverage_runner.dart");
if (!new File.fromUri(coverageRunner).existsSync()) {
throw "The coverage runner tool doesn't exist.";
}
final int processes = Platform.numberOfProcessors;
int processesLeft = processes;
int processesRunning = 0;
Completer<void> completer = new Completer();
print("Will run ${testPaths.length} tests in $processes processes.");
Stopwatch totalRuntimeStopwatch = new Stopwatch()..start();
void log(String s) {
print("${totalRuntimeStopwatch.elapsed}: $s");
}
while (testPaths.isNotEmpty) {
while (processesLeft <= 0) {
await completer.future;
}
processesLeft--;
processesRunning++;
String testPath = testPaths.removeLast();
Stopwatch stopwatch = new Stopwatch()..start();
// ignore: unawaited_futures
Process.run(Platform.resolvedExecutable, [
coverageRunner.toFilePath(),
"--enable-asserts",
testPath
]).then((ProcessResult value) {
log("$testPath ended with "
"exit code ${value.exitCode} "
"in ${stopwatch.elapsed}");
processesRunning--;
processesLeft++;
Completer<void> oldCompleter = completer;
completer = new Completer();
oldCompleter.complete();
});
}
while (processesRunning > 0) {
log("Awaiting $processesRunning processes");
await completer.future;
}
log("Done");
}