| Index: tools/testing/dart/test_runner.dart
|
| diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
|
| index ec0e91882158472c086e0fb22761b7a27ccf753f..3dfcdafffacb9cd9bceef47596c4bbbdff1f4c5c 100644
|
| --- a/tools/testing/dart/test_runner.dart
|
| +++ b/tools/testing/dart/test_runner.dart
|
| @@ -40,10 +40,11 @@ const MESSAGE_FAILED_TO_RUN_COMMAND = 'Failed to run command. return code=1';
|
| typedef void TestCaseEvent(TestCase testCase);
|
| typedef void ExitCodeEvent(int exitCode);
|
| typedef void EnqueueMoreWork(ProcessQueue queue);
|
| +typedef void Action();
|
|
|
| // Some IO tests use these variables and get confused if the host environment
|
| // variables are inherited so they are excluded.
|
| -const List<String> EXCLUDED_ENVIRONMENT_VARIABLES = const [
|
| +const EXCLUDED_ENVIRONMENT_VARIABLES = const [
|
| 'http_proxy',
|
| 'https_proxy',
|
| 'no_proxy',
|
| @@ -78,9 +79,9 @@ class Command {
|
| return _cachedHashCode;
|
| }
|
|
|
| - operator ==(other) =>
|
| + operator ==(Object other) =>
|
| identical(this, other) ||
|
| - (runtimeType == other.runtimeType && _equal(other));
|
| + (runtimeType == other.runtimeType && _equal(other as Command));
|
|
|
| void _buildHashCode(HashCodeBuilder builder) {
|
| builder.addJson(displayName);
|
| @@ -247,7 +248,7 @@ class AddFlagsKey {
|
| final Map env;
|
| AddFlagsKey(this.flags, this.env);
|
| // Just use object identity for environment map
|
| - bool operator ==(other) =>
|
| + bool operator ==(Object other) =>
|
| other is AddFlagsKey && flags == other.flags && env == other.env;
|
| int get hashCode => flags.hashCode ^ env.hashCode;
|
| }
|
| @@ -265,11 +266,11 @@ class ContentShellCommand extends ProcessCommand {
|
| // Cache the modified environments in a map from the old environment and
|
| // the string of Dart flags to the new environment. Avoid creating new
|
| // environment object for each command object.
|
| - static Map<AddFlagsKey, Map> environments = <AddFlagsKey, Map>{};
|
| + static Map<AddFlagsKey, Map> environments = {};
|
|
|
| static Map<String, String> _getEnvironment(
|
| Map<String, String> env, List<String> dartFlags) {
|
| - var needDartFlags = dartFlags != null && dartFlags.length > 0;
|
| + var needDartFlags = dartFlags != null && dartFlags.isNotEmpty;
|
| if (needDartFlags) {
|
| if (env == null) {
|
| env = const <String, String>{};
|
| @@ -484,7 +485,7 @@ class CleanDirectoryCopyCommand extends ScriptCommand {
|
| var destination = new io.Directory(_destinationDirectory);
|
|
|
| return destination.exists().then((bool exists) {
|
| - var cleanDirectoryFuture;
|
| + Future cleanDirectoryFuture;
|
| if (exists) {
|
| cleanDirectoryFuture = TestUtils.deleteDirectory(_destinationDirectory);
|
| } else {
|
| @@ -596,8 +597,8 @@ class CommandBuilder {
|
|
|
| CompilationCommand getCompilationCommand(
|
| String displayName,
|
| - outputFile,
|
| - neverSkipCompilation,
|
| + String outputFile,
|
| + bool neverSkipCompilation,
|
| List<Uri> bootstrapDependencies,
|
| String executable,
|
| List<String> arguments,
|
| @@ -615,8 +616,8 @@ class CommandBuilder {
|
|
|
| CompilationCommand getKernelCompilationCommand(
|
| String displayName,
|
| - outputFile,
|
| - neverSkipCompilation,
|
| + String outputFile,
|
| + bool neverSkipCompilation,
|
| List<Uri> bootstrapDependencies,
|
| String executable,
|
| List<String> arguments,
|
| @@ -632,8 +633,8 @@ class CommandBuilder {
|
| return _getUniqueCommand(command);
|
| }
|
|
|
| - AnalysisCommand getAnalysisCommand(
|
| - String displayName, executable, arguments, environmentOverrides,
|
| + AnalysisCommand getAnalysisCommand(String displayName, String executable,
|
| + List<String> arguments, Map<String, String> environmentOverrides,
|
| {String flavor: 'dart2analyzer'}) {
|
| var command = new AnalysisCommand._(
|
| flavor, displayName, executable, arguments, environmentOverrides);
|
| @@ -666,15 +667,17 @@ class CommandBuilder {
|
| return _getUniqueCommand(command);
|
| }
|
|
|
| - Command getJSCommandlineCommand(String displayName, executable, arguments,
|
| - [environment = null]) {
|
| + Command getJSCommandlineCommand(
|
| + String displayName, String executable, List<String> arguments,
|
| + [Map<String, String> environment]) {
|
| var command = new JSCommandlineCommand._(
|
| displayName, executable, arguments, environment);
|
| return _getUniqueCommand(command);
|
| }
|
|
|
| - Command getProcessCommand(String displayName, executable, arguments,
|
| - [environment = null, workingDirectory = null]) {
|
| + Command getProcessCommand(
|
| + String displayName, String executable, List<String> arguments,
|
| + [Map<String, String> environment, String workingDirectory]) {
|
| var command = new ProcessCommand._(
|
| displayName, executable, arguments, environment, workingDirectory);
|
| return _getUniqueCommand(command);
|
| @@ -698,7 +701,7 @@ class CommandBuilder {
|
| return _getUniqueCommand(new MakeSymlinkCommand._(link, target));
|
| }
|
|
|
| - Command _getUniqueCommand(Command command) {
|
| + T _getUniqueCommand<T extends Command>(T command) {
|
| // All Command classes implement hashCode and operator==.
|
| // We check if this command has already been built.
|
| // If so, we return the cached one. Otherwise we
|
| @@ -709,7 +712,7 @@ class CommandBuilder {
|
| }
|
| var cachedCommand = _cachedCommands[command];
|
| if (cachedCommand != null) {
|
| - return cachedCommand;
|
| + return cachedCommand as T;
|
| }
|
| _cachedCommands[command] = command;
|
| return command;
|
| @@ -760,7 +763,7 @@ class TestCase extends UniqueObject {
|
|
|
| TestCase(this.displayName, this.commands, this.configuration,
|
| this.expectedOutcomes,
|
| - {isNegative: false, TestInformation info: null}) {
|
| + {bool isNegative: false, TestInformation info}) {
|
| if (isNegative || displayName.contains("negative_test")) {
|
| _expectations |= IS_NEGATIVE;
|
| }
|
| @@ -870,8 +873,14 @@ class TestCase extends UniqueObject {
|
| * If the compilation command fails, then the rest of the test is not run.
|
| */
|
| class BrowserTestCase extends TestCase {
|
| - BrowserTestCase(displayName, commands, configuration, expectedOutcomes, info,
|
| - isNegative, this._testingUrl)
|
| + BrowserTestCase(
|
| + String displayName,
|
| + List<Command> commands,
|
| + configuration,
|
| + Set<Expectation> expectedOutcomes,
|
| + TestInformation info,
|
| + bool isNegative,
|
| + this._testingUrl)
|
| : super(displayName, commands, configuration, expectedOutcomes,
|
| isNegative: isNegative, info: info);
|
|
|
| @@ -1080,7 +1089,13 @@ class BrowserCommandOutputImpl extends CommandOutputImpl {
|
| bool _infraFailure;
|
|
|
| BrowserCommandOutputImpl(
|
| - command, exitCode, timedOut, stdout, stderr, time, compilationSkipped)
|
| + Command command,
|
| + int exitCode,
|
| + bool timedOut,
|
| + List<int> stdout,
|
| + List<int> stderr,
|
| + Duration time,
|
| + bool compilationSkipped)
|
| : _infraFailure =
|
| _failedBecauseOfFlakyInfrastructure(command, timedOut, stderr),
|
| super(command, exitCode, timedOut, stdout, stderr, time,
|
| @@ -1187,7 +1202,13 @@ class BrowserCommandOutputImpl extends CommandOutputImpl {
|
|
|
| class HTMLBrowserCommandOutputImpl extends BrowserCommandOutputImpl {
|
| HTMLBrowserCommandOutputImpl(
|
| - command, exitCode, timedOut, stdout, stderr, time, compilationSkipped)
|
| + Command command,
|
| + int exitCode,
|
| + bool timedOut,
|
| + List<int> stdout,
|
| + List<int> stderr,
|
| + Duration time,
|
| + bool compilationSkipped)
|
| : super(command, exitCode, timedOut, stdout, stderr, time,
|
| compilationSkipped);
|
|
|
| @@ -1229,9 +1250,8 @@ class BrowserTestJsonResult {
|
| }
|
| }
|
|
|
| - var events;
|
| try {
|
| - events = JSON.decode(content);
|
| + var events = JSON.decode(content);
|
| if (events != null) {
|
| validate("Message must be a List", events is List);
|
|
|
| @@ -1275,8 +1295,8 @@ class BrowserTestJsonResult {
|
| }
|
|
|
| static Expectation _getOutcome(Map<String, List<String>> messagesByType) {
|
| - occured(type) => messagesByType[type].length > 0;
|
| - searchForMsg(types, message) {
|
| + occured(String type) => messagesByType[type].length > 0;
|
| + searchForMsg(List<String> types, String message) {
|
| return types.any((type) => messagesByType[type].contains(message));
|
| }
|
|
|
| @@ -1422,7 +1442,13 @@ class AnalysisCommandOutputImpl extends CommandOutputImpl {
|
| final int FORMATTED_ERROR = 7;
|
|
|
| AnalysisCommandOutputImpl(
|
| - command, exitCode, timedOut, stdout, stderr, time, compilationSkipped)
|
| + Command command,
|
| + int exitCode,
|
| + bool timedOut,
|
| + List<int> stdout,
|
| + List<int> stderr,
|
| + Duration time,
|
| + bool compilationSkipped)
|
| : super(command, exitCode, timedOut, stdout, stderr, time,
|
| compilationSkipped, 0);
|
|
|
| @@ -1848,13 +1874,13 @@ test.dart: Data was removed due to excessive length
|
|
|
| // Helper to get a list of all child pids for a parent process.
|
| // The first element of the list is the parent pid.
|
| -Future<List<int>> _getPidList(pid, diagnostics) async {
|
| - var pid_list = [pid];
|
| - var lines;
|
| - var start_line = 0;
|
| +Future<List<int>> _getPidList(int pid, List<String> diagnostics) async {
|
| + var pids = [pid];
|
| + List<String> lines;
|
| + var startLine = 0;
|
| if (io.Platform.isLinux || io.Platform.isMacOS) {
|
| - var result = await io.Process
|
| - .run("pgrep", ["-P", "${pid_list[0]}"], runInShell: true);
|
| + var result =
|
| + await io.Process.run("pgrep", ["-P", "${pids[0]}"], runInShell: true);
|
| lines = result.stdout.split('\n');
|
| } else if (io.Platform.isWindows) {
|
| var result = await io.Process.run(
|
| @@ -1862,27 +1888,27 @@ Future<List<int>> _getPidList(pid, diagnostics) async {
|
| [
|
| "process",
|
| "where",
|
| - "(ParentProcessId=${pid_list[0]})",
|
| + "(ParentProcessId=${pids[0]})",
|
| "get",
|
| "ProcessId"
|
| ],
|
| runInShell: true);
|
| lines = result.stdout.split('\n');
|
| // Skip first line containing header "ProcessId".
|
| - start_line = 1;
|
| + startLine = 1;
|
| } else {
|
| assert(false);
|
| }
|
| - if (lines.length > start_line) {
|
| - for (int i = start_line; i < lines.length; ++i) {
|
| + if (lines.length > startLine) {
|
| + for (var i = startLine; i < lines.length; ++i) {
|
| var pid = int.parse(lines[i], onError: (source) => null);
|
| - if (pid != null) pid_list.add(pid);
|
| + if (pid != null) pids.add(pid);
|
| }
|
| } else {
|
| diagnostics.add("Could not find child pids");
|
| diagnostics.addAll(lines);
|
| }
|
| - return pid_list;
|
| + return pids;
|
| }
|
|
|
| /**
|
| @@ -1935,8 +1961,8 @@ class RunningProcess {
|
| StreamSubscription stderrSubscription =
|
| _drainStream(process.stderr, stderr);
|
|
|
| - var stdoutCompleter = new Completer();
|
| - var stderrCompleter = new Completer();
|
| + var stdoutCompleter = new Completer<Null>();
|
| + var stderrCompleter = new Completer<Null>();
|
|
|
| bool stdoutDone = false;
|
| bool stderrDone = false;
|
| @@ -1973,7 +1999,7 @@ class RunningProcess {
|
| timeoutHandler() async {
|
| timedOut = true;
|
| if (process != null) {
|
| - var executable;
|
| + String executable;
|
| if (io.Platform.isLinux) {
|
| executable = 'eu-stack';
|
| } else if (io.Platform.isMacOS) {
|
| @@ -1985,9 +2011,9 @@ class RunningProcess {
|
| } else if (io.Platform.isWindows) {
|
| bool is_x64 = command.executable.contains("X64") ||
|
| command.executable.contains("SIMARM64");
|
| - var win_sdk_path = configuration['win_sdk_path'];
|
| - if (win_sdk_path != null) {
|
| - executable = win_sdk_path +
|
| + var winSdkPath = configuration['win_sdk_path'];
|
| + if (winSdkPath != null) {
|
| + executable = winSdkPath +
|
| "\\Debuggers\\" +
|
| (is_x64 ? "x64" : "x86") +
|
| "\\cdb.exe";
|
| @@ -2000,10 +2026,10 @@ class RunningProcess {
|
| "${io.Platform.operatingSystem} not supported");
|
| }
|
| if (executable != null) {
|
| - var pid_list = await _getPidList(process.pid, diagnostics);
|
| - diagnostics.add("Process list including children: $pid_list");
|
| - for (pid in pid_list) {
|
| - var arguments;
|
| + var pids = await _getPidList(process.pid, diagnostics);
|
| + diagnostics.add("Process list including children: $pids");
|
| + for (pid in pids) {
|
| + List<String> arguments;
|
| if (io.Platform.isLinux) {
|
| arguments = ['-p $pid'];
|
| } else if (io.Platform.isMacOS) {
|
| @@ -2129,9 +2155,9 @@ class BatchRunnerProcess {
|
| String _runnerType;
|
|
|
| io.Process _process;
|
| - Map _processEnvironmentOverrides;
|
| - Completer _stdoutCompleter;
|
| - Completer _stderrCompleter;
|
| + Map<String, String> _processEnvironmentOverrides;
|
| + Completer<Null> _stdoutCompleter;
|
| + Completer<Null> _stderrCompleter;
|
| StreamSubscription<String> _stdoutSubscription;
|
| StreamSubscription<String> _stderrSubscription;
|
| Function _processExitHandler;
|
| @@ -2148,7 +2174,7 @@ class BatchRunnerProcess {
|
| assert(_completer == null);
|
| assert(!_currentlyRunning);
|
|
|
| - _completer = new Completer<CommandOutput>();
|
| + _completer = new Completer();
|
| bool sameRunnerType = _runnerType == runnerType &&
|
| _dictEquals(_processEnvironmentOverrides, command.environmentOverrides);
|
| _runnerType = runnerType;
|
| @@ -2178,9 +2204,9 @@ class BatchRunnerProcess {
|
| return _completer.future;
|
| }
|
|
|
| - Future terminate() {
|
| + Future<bool> terminate() {
|
| if (_process == null) return new Future.value(true);
|
| - Completer terminateCompleter = new Completer();
|
| + Completer terminateCompleter = new Completer<bool>();
|
| _processExitHandler = (_) {
|
| terminateCompleter.complete(true);
|
| };
|
| @@ -2256,7 +2282,7 @@ class BatchRunnerProcess {
|
| _process.kill();
|
| }
|
|
|
| - _startProcess(callback) {
|
| + void _startProcess(Action callback) {
|
| assert(_command is ProcessCommand);
|
| var executable = _command.executable;
|
| var arguments = _command.batchArguments.toList();
|
| @@ -2514,7 +2540,7 @@ class CommandQueue {
|
| assert(event.from == dgraph.NodeState.Initialized ||
|
| event.from == dgraph.NodeState.Waiting);
|
| graph.changeState(event.node, dgraph.NodeState.Processing);
|
| - var command = event.node.userData;
|
| + var command = event.node.userData as Command;
|
| if (event.node.dependencies.length > 0) {
|
| _runQueue.addFirst(command);
|
| } else {
|
| @@ -2732,10 +2758,12 @@ class CommandExecutorImpl implements CommandExecutor {
|
| var name = command.displayName;
|
| return _getBatchRunner(command.displayName + command.dartFile)
|
| .runCommand(name, command, timeout, command.arguments);
|
| - } else {
|
| + } else if (command is ProcessCommand) {
|
| return new RunningProcess(command, timeout,
|
| configuration: globalConfiguration)
|
| .run();
|
| + } else {
|
| + throw new ArgumentError("Unknown command type ${command.runtimeType}.");
|
| }
|
| }
|
|
|
| @@ -3079,8 +3107,14 @@ class ProcessQueue {
|
| final dgraph.Graph _graph = new dgraph.Graph();
|
| List<EventListener> _eventListener;
|
|
|
| - ProcessQueue(this._globalConfiguration, maxProcesses, maxBrowserProcesses,
|
| - DateTime startTime, testSuites, this._eventListener, this._allDone,
|
| + ProcessQueue(
|
| + this._globalConfiguration,
|
| + int maxProcesses,
|
| + int maxBrowserProcesses,
|
| + DateTime startTime,
|
| + List<TestSuite> testSuites,
|
| + this._eventListener,
|
| + this._allDone,
|
| [bool verbose = false,
|
| String recordingOutputFile,
|
| String recordedInputFile,
|
| @@ -3089,7 +3123,7 @@ class ProcessQueue {
|
| _graph.events
|
| .where((event) => event is dgraph.GraphSealedEvent)
|
| .listen((_) {
|
| - var testCases = new List.from(testCaseEnqueuer.remainingTestCases);
|
| + var testCases = testCaseEnqueuer.remainingTestCases.toList();
|
| testCases.sort((a, b) => a.displayName.compareTo(b.displayName));
|
|
|
| print("\nGenerating all matching test cases ....\n");
|
| @@ -3104,7 +3138,7 @@ class ProcessQueue {
|
| });
|
| }
|
|
|
| - var testCaseEnqueuer;
|
| + TestCaseEnqueuer testCaseEnqueuer;
|
| CommandQueue commandQueue;
|
|
|
| void setupForRunning(TestCaseEnqueuer testCaseEnqueuer) {
|
|
|