| // Copyright (c) 2016, 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. |
| |
| library kernel.batch_util; |
| |
| import 'dart:convert'; |
| import 'dart:io'; |
| |
| enum CompilerOutcome { |
| Ok, |
| Fail, |
| } |
| |
| typedef Future<CompilerOutcome> BatchCallback(List<String> arguments); |
| |
| /// Runs the given [callback] in the batch mode for use by the test framework in |
| /// `dart-lang/sdk`. |
| /// |
| /// The [callback] should behave as a main method, except it should return a |
| /// [CompilerOutcome] for reporting its outcome to the testing framework. |
| Future runBatch(BatchCallback callback) async { |
| int totalTests = 0; |
| int testsFailed = 0; |
| Stopwatch watch = new Stopwatch()..start(); |
| print('>>> BATCH START'); |
| Stream input = stdin.transform(utf8.decoder).transform(new LineSplitter()); |
| await for (String line in input) { |
| if (line.isEmpty) { |
| int time = watch.elapsedMilliseconds; |
| print('>>> BATCH END ' |
| '(${totalTests - testsFailed})/$totalTests ${time}ms'); |
| break; |
| } |
| ++totalTests; |
| List<String> arguments = line.split(new RegExp(r'\s+')); |
| try { |
| CompilerOutcome outcome = await callback(arguments); |
| stderr.writeln('>>> EOF STDERR'); |
| if (outcome == CompilerOutcome.Ok) { |
| print('>>> TEST PASS ${watch.elapsedMilliseconds}ms'); |
| } else { |
| print('>>> TEST FAIL ${watch.elapsedMilliseconds}ms'); |
| } |
| } catch (e, stackTrace) { |
| stderr.writeln(e); |
| stderr.writeln(stackTrace); |
| stderr.writeln('>>> EOF STDERR'); |
| print('>>> TEST CRASH'); |
| } |
| } |
| } |