// Copyright (c) 2026, 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'; Never usage() { print('Usage: ${Platform.executable} ${Platform.script} [--update-goldens]'); exit(1); } const int testPoolSize = 15; /// This script updates all the stops goldens in the vm_service tests. Future main(List args) async { args = [...args]; final updateGoldens = args.remove('--update-goldens'); final verbose = args.remove('--verbose'); if (args.isNotEmpty) { usage(); } final tests = collectTests(); final futures = >[]; final readyCompleters = >[]; for (var test in tests) { if (futures.length < testPoolSize) { futures.add(runTest( test, Future.value().then((_) => readyCompleters.isEmpty ? null : readyCompleters.removeLast().complete()), updateGoldens: updateGoldens, verbose: verbose)); } else { final ready = Completer(); readyCompleters.add(ready); futures.add(runTest(test, ready.future, updateGoldens: updateGoldens, verbose: verbose) .then((_) => readyCompleters.isEmpty ? null : readyCompleters.removeLast().complete())); } } await Future.wait(futures); } List collectTests() { final dataFolder = Directory.fromUri(Platform.script.resolve('.')); final files = []; for (var file in dataFolder.listSync(recursive: true)) { if (file is File && file.path.endsWith('_test.dart')) { files.add(file); } } return files; } Future runTest(File testFile, Future ready, {required bool updateGoldens, required bool verbose}) async { await ready; final result = await Process.run( Platform.executable, [ testFile.path, if (updateGoldens) '--update-goldens', ], ); if (result.exitCode != 0) { print('Test failed: ${testFile.path}'); if (verbose) { print('stdout:'); print(result.stdout); print('stderr:'); print(result.stderr); } } else { print('Test passed: ${testFile.path}'); } }