Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Side by Side Diff: tools/testing/dart/test_runner.dart

Issue 2863253002: Tighten up a bunch of types in test.dart. (Closed)
Patch Set: Merge branch 'master' into types-for-test Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/testing/dart/test_progress.dart ('k') | tools/testing/dart/test_suite.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * Classes and methods for executing tests. 6 * Classes and methods for executing tests.
7 * 7 *
8 * This module includes: 8 * This module includes:
9 * - Managing parallel execution of tests, including timeout checks. 9 * - Managing parallel execution of tests, including timeout checks.
10 * - Evaluating the output of each test as pass/fail/crash/timeout. 10 * - Evaluating the output of each test as pass/fail/crash/timeout.
(...skipping 22 matching lines...) Expand all
33 const int CRASHING_BROWSER_EXITCODE = -10; 33 const int CRASHING_BROWSER_EXITCODE = -10;
34 const int SLOW_TIMEOUT_MULTIPLIER = 4; 34 const int SLOW_TIMEOUT_MULTIPLIER = 4;
35 const int NON_UTF_FAKE_EXITCODE = 0xFFFD; 35 const int NON_UTF_FAKE_EXITCODE = 0xFFFD;
36 36
37 const MESSAGE_CANNOT_OPEN_DISPLAY = 'Gtk-WARNING **: cannot open display'; 37 const MESSAGE_CANNOT_OPEN_DISPLAY = 'Gtk-WARNING **: cannot open display';
38 const MESSAGE_FAILED_TO_RUN_COMMAND = 'Failed to run command. return code=1'; 38 const MESSAGE_FAILED_TO_RUN_COMMAND = 'Failed to run command. return code=1';
39 39
40 typedef void TestCaseEvent(TestCase testCase); 40 typedef void TestCaseEvent(TestCase testCase);
41 typedef void ExitCodeEvent(int exitCode); 41 typedef void ExitCodeEvent(int exitCode);
42 typedef void EnqueueMoreWork(ProcessQueue queue); 42 typedef void EnqueueMoreWork(ProcessQueue queue);
43 typedef void Action();
43 44
44 // Some IO tests use these variables and get confused if the host environment 45 // Some IO tests use these variables and get confused if the host environment
45 // variables are inherited so they are excluded. 46 // variables are inherited so they are excluded.
46 const List<String> EXCLUDED_ENVIRONMENT_VARIABLES = const [ 47 const EXCLUDED_ENVIRONMENT_VARIABLES = const [
47 'http_proxy', 48 'http_proxy',
48 'https_proxy', 49 'https_proxy',
49 'no_proxy', 50 'no_proxy',
50 'HTTP_PROXY', 51 'HTTP_PROXY',
51 'HTTPS_PROXY', 52 'HTTPS_PROXY',
52 'NO_PROXY' 53 'NO_PROXY'
53 ]; 54 ];
54 55
55 /** A command executed as a step in a test case. */ 56 /** A command executed as a step in a test case. */
56 class Command { 57 class Command {
(...skipping 14 matching lines...) Expand all
71 72
72 int get hashCode { 73 int get hashCode {
73 if (_cachedHashCode == null) { 74 if (_cachedHashCode == null) {
74 var builder = new HashCodeBuilder(); 75 var builder = new HashCodeBuilder();
75 _buildHashCode(builder); 76 _buildHashCode(builder);
76 _cachedHashCode = builder.value; 77 _cachedHashCode = builder.value;
77 } 78 }
78 return _cachedHashCode; 79 return _cachedHashCode;
79 } 80 }
80 81
81 operator ==(other) => 82 operator ==(Object other) =>
82 identical(this, other) || 83 identical(this, other) ||
83 (runtimeType == other.runtimeType && _equal(other)); 84 (runtimeType == other.runtimeType && _equal(other as Command));
84 85
85 void _buildHashCode(HashCodeBuilder builder) { 86 void _buildHashCode(HashCodeBuilder builder) {
86 builder.addJson(displayName); 87 builder.addJson(displayName);
87 } 88 }
88 89
89 bool _equal(covariant Command other) => 90 bool _equal(covariant Command other) =>
90 hashCode == other.hashCode && displayName == other.displayName; 91 hashCode == other.hashCode && displayName == other.displayName;
91 92
92 String toString() => reproductionCommand; 93 String toString() => reproductionCommand;
93 94
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 241
241 int get maxNumRetries => 1; 242 int get maxNumRetries => 1;
242 } 243 }
243 244
244 /// This is just a Pair(String, Map) class with hashCode and operator == 245 /// This is just a Pair(String, Map) class with hashCode and operator ==
245 class AddFlagsKey { 246 class AddFlagsKey {
246 final String flags; 247 final String flags;
247 final Map env; 248 final Map env;
248 AddFlagsKey(this.flags, this.env); 249 AddFlagsKey(this.flags, this.env);
249 // Just use object identity for environment map 250 // Just use object identity for environment map
250 bool operator ==(other) => 251 bool operator ==(Object other) =>
251 other is AddFlagsKey && flags == other.flags && env == other.env; 252 other is AddFlagsKey && flags == other.flags && env == other.env;
252 int get hashCode => flags.hashCode ^ env.hashCode; 253 int get hashCode => flags.hashCode ^ env.hashCode;
253 } 254 }
254 255
255 class ContentShellCommand extends ProcessCommand { 256 class ContentShellCommand extends ProcessCommand {
256 ContentShellCommand._( 257 ContentShellCommand._(
257 String executable, 258 String executable,
258 String htmlFile, 259 String htmlFile,
259 List<String> options, 260 List<String> options,
260 List<String> dartFlags, 261 List<String> dartFlags,
261 Map<String, String> environmentOverrides) 262 Map<String, String> environmentOverrides)
262 : super._("content_shell", executable, _getArguments(options, htmlFile), 263 : super._("content_shell", executable, _getArguments(options, htmlFile),
263 _getEnvironment(environmentOverrides, dartFlags)); 264 _getEnvironment(environmentOverrides, dartFlags));
264 265
265 // Cache the modified environments in a map from the old environment and 266 // Cache the modified environments in a map from the old environment and
266 // the string of Dart flags to the new environment. Avoid creating new 267 // the string of Dart flags to the new environment. Avoid creating new
267 // environment object for each command object. 268 // environment object for each command object.
268 static Map<AddFlagsKey, Map> environments = <AddFlagsKey, Map>{}; 269 static Map<AddFlagsKey, Map> environments = {};
269 270
270 static Map<String, String> _getEnvironment( 271 static Map<String, String> _getEnvironment(
271 Map<String, String> env, List<String> dartFlags) { 272 Map<String, String> env, List<String> dartFlags) {
272 var needDartFlags = dartFlags != null && dartFlags.length > 0; 273 var needDartFlags = dartFlags != null && dartFlags.isNotEmpty;
273 if (needDartFlags) { 274 if (needDartFlags) {
274 if (env == null) { 275 if (env == null) {
275 env = const <String, String>{}; 276 env = const <String, String>{};
276 } 277 }
277 var flags = dartFlags.join(' '); 278 var flags = dartFlags.join(' ');
278 return environments.putIfAbsent( 279 return environments.putIfAbsent(
279 new AddFlagsKey(flags, env), 280 new AddFlagsKey(flags, env),
280 () => new Map.from(env) 281 () => new Map.from(env)
281 ..addAll({'DART_FLAGS': flags, 'DART_FORWARDING_PRINT': '1'})); 282 ..addAll({'DART_FLAGS': flags, 'DART_FORWARDING_PRINT': '1'}));
282 } 283 }
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 478
478 String get reproductionCommand => 479 String get reproductionCommand =>
479 "Copying '$_sourceDirectory' to '$_destinationDirectory'."; 480 "Copying '$_sourceDirectory' to '$_destinationDirectory'.";
480 481
481 Future<ScriptCommandOutputImpl> run() { 482 Future<ScriptCommandOutputImpl> run() {
482 var watch = new Stopwatch()..start(); 483 var watch = new Stopwatch()..start();
483 484
484 var destination = new io.Directory(_destinationDirectory); 485 var destination = new io.Directory(_destinationDirectory);
485 486
486 return destination.exists().then((bool exists) { 487 return destination.exists().then((bool exists) {
487 var cleanDirectoryFuture; 488 Future cleanDirectoryFuture;
488 if (exists) { 489 if (exists) {
489 cleanDirectoryFuture = TestUtils.deleteDirectory(_destinationDirectory); 490 cleanDirectoryFuture = TestUtils.deleteDirectory(_destinationDirectory);
490 } else { 491 } else {
491 cleanDirectoryFuture = new Future.value(null); 492 cleanDirectoryFuture = new Future.value(null);
492 } 493 }
493 return cleanDirectoryFuture.then((_) { 494 return cleanDirectoryFuture.then((_) {
494 return TestUtils.copyDirectory(_sourceDirectory, _destinationDirectory); 495 return TestUtils.copyDirectory(_sourceDirectory, _destinationDirectory);
495 }); 496 });
496 }).then((_) { 497 }).then((_) {
497 return new ScriptCommandOutputImpl( 498 return new ScriptCommandOutputImpl(
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 590
590 BrowserHtmlTestCommand getBrowserHtmlTestCommand(String browser, String url, 591 BrowserHtmlTestCommand getBrowserHtmlTestCommand(String browser, String url,
591 Map configuration, List<String> expectedMessages, bool retry) { 592 Map configuration, List<String> expectedMessages, bool retry) {
592 var command = new BrowserHtmlTestCommand._( 593 var command = new BrowserHtmlTestCommand._(
593 browser, url, configuration, expectedMessages, retry); 594 browser, url, configuration, expectedMessages, retry);
594 return _getUniqueCommand(command); 595 return _getUniqueCommand(command);
595 } 596 }
596 597
597 CompilationCommand getCompilationCommand( 598 CompilationCommand getCompilationCommand(
598 String displayName, 599 String displayName,
599 outputFile, 600 String outputFile,
600 neverSkipCompilation, 601 bool neverSkipCompilation,
601 List<Uri> bootstrapDependencies, 602 List<Uri> bootstrapDependencies,
602 String executable, 603 String executable,
603 List<String> arguments, 604 List<String> arguments,
604 Map<String, String> environment) { 605 Map<String, String> environment) {
605 var command = new CompilationCommand._( 606 var command = new CompilationCommand._(
606 displayName, 607 displayName,
607 outputFile, 608 outputFile,
608 neverSkipCompilation, 609 neverSkipCompilation,
609 bootstrapDependencies, 610 bootstrapDependencies,
610 executable, 611 executable,
611 arguments, 612 arguments,
612 environment); 613 environment);
613 return _getUniqueCommand(command); 614 return _getUniqueCommand(command);
614 } 615 }
615 616
616 CompilationCommand getKernelCompilationCommand( 617 CompilationCommand getKernelCompilationCommand(
617 String displayName, 618 String displayName,
618 outputFile, 619 String outputFile,
619 neverSkipCompilation, 620 bool neverSkipCompilation,
620 List<Uri> bootstrapDependencies, 621 List<Uri> bootstrapDependencies,
621 String executable, 622 String executable,
622 List<String> arguments, 623 List<String> arguments,
623 Map<String, String> environment) { 624 Map<String, String> environment) {
624 var command = new KernelCompilationCommand._( 625 var command = new KernelCompilationCommand._(
625 displayName, 626 displayName,
626 outputFile, 627 outputFile,
627 neverSkipCompilation, 628 neverSkipCompilation,
628 bootstrapDependencies, 629 bootstrapDependencies,
629 executable, 630 executable,
630 arguments, 631 arguments,
631 environment); 632 environment);
632 return _getUniqueCommand(command); 633 return _getUniqueCommand(command);
633 } 634 }
634 635
635 AnalysisCommand getAnalysisCommand( 636 AnalysisCommand getAnalysisCommand(String displayName, String executable,
636 String displayName, executable, arguments, environmentOverrides, 637 List<String> arguments, Map<String, String> environmentOverrides,
637 {String flavor: 'dart2analyzer'}) { 638 {String flavor: 'dart2analyzer'}) {
638 var command = new AnalysisCommand._( 639 var command = new AnalysisCommand._(
639 flavor, displayName, executable, arguments, environmentOverrides); 640 flavor, displayName, executable, arguments, environmentOverrides);
640 return _getUniqueCommand(command); 641 return _getUniqueCommand(command);
641 } 642 }
642 643
643 VmCommand getVmCommand(String executable, List<String> arguments, 644 VmCommand getVmCommand(String executable, List<String> arguments,
644 Map<String, String> environmentOverrides) { 645 Map<String, String> environmentOverrides) {
645 var command = new VmCommand._(executable, arguments, environmentOverrides); 646 var command = new VmCommand._(executable, arguments, environmentOverrides);
646 return _getUniqueCommand(command); 647 return _getUniqueCommand(command);
(...skipping 12 matching lines...) Expand all
659 String precompiledRunner, 660 String precompiledRunner,
660 String processTest, 661 String processTest,
661 String testDirectory, 662 String testDirectory,
662 List<String> arguments, 663 List<String> arguments,
663 bool useBlobs) { 664 bool useBlobs) {
664 var command = new AdbPrecompilationCommand._( 665 var command = new AdbPrecompilationCommand._(
665 precompiledRunner, processTest, testDirectory, arguments, useBlobs); 666 precompiledRunner, processTest, testDirectory, arguments, useBlobs);
666 return _getUniqueCommand(command); 667 return _getUniqueCommand(command);
667 } 668 }
668 669
669 Command getJSCommandlineCommand(String displayName, executable, arguments, 670 Command getJSCommandlineCommand(
670 [environment = null]) { 671 String displayName, String executable, List<String> arguments,
672 [Map<String, String> environment]) {
671 var command = new JSCommandlineCommand._( 673 var command = new JSCommandlineCommand._(
672 displayName, executable, arguments, environment); 674 displayName, executable, arguments, environment);
673 return _getUniqueCommand(command); 675 return _getUniqueCommand(command);
674 } 676 }
675 677
676 Command getProcessCommand(String displayName, executable, arguments, 678 Command getProcessCommand(
677 [environment = null, workingDirectory = null]) { 679 String displayName, String executable, List<String> arguments,
680 [Map<String, String> environment, String workingDirectory]) {
678 var command = new ProcessCommand._( 681 var command = new ProcessCommand._(
679 displayName, executable, arguments, environment, workingDirectory); 682 displayName, executable, arguments, environment, workingDirectory);
680 return _getUniqueCommand(command); 683 return _getUniqueCommand(command);
681 } 684 }
682 685
683 Command getCopyCommand(String sourceDirectory, String destinationDirectory) { 686 Command getCopyCommand(String sourceDirectory, String destinationDirectory) {
684 var command = 687 var command =
685 new CleanDirectoryCopyCommand._(sourceDirectory, destinationDirectory); 688 new CleanDirectoryCopyCommand._(sourceDirectory, destinationDirectory);
686 return _getUniqueCommand(command); 689 return _getUniqueCommand(command);
687 } 690 }
688 691
689 Command getPubCommand(String pubCommand, String pubExecutable, 692 Command getPubCommand(String pubCommand, String pubExecutable,
690 String pubspecYamlDirectory, String pubCacheDirectory, 693 String pubspecYamlDirectory, String pubCacheDirectory,
691 {List<String> arguments: const <String>[]}) { 694 {List<String> arguments: const <String>[]}) {
692 var command = new PubCommand._(pubCommand, pubExecutable, 695 var command = new PubCommand._(pubCommand, pubExecutable,
693 pubspecYamlDirectory, pubCacheDirectory, arguments); 696 pubspecYamlDirectory, pubCacheDirectory, arguments);
694 return _getUniqueCommand(command); 697 return _getUniqueCommand(command);
695 } 698 }
696 699
697 Command getMakeSymlinkCommand(String link, String target) { 700 Command getMakeSymlinkCommand(String link, String target) {
698 return _getUniqueCommand(new MakeSymlinkCommand._(link, target)); 701 return _getUniqueCommand(new MakeSymlinkCommand._(link, target));
699 } 702 }
700 703
701 Command _getUniqueCommand(Command command) { 704 T _getUniqueCommand<T extends Command>(T command) {
702 // All Command classes implement hashCode and operator==. 705 // All Command classes implement hashCode and operator==.
703 // We check if this command has already been built. 706 // We check if this command has already been built.
704 // If so, we return the cached one. Otherwise we 707 // If so, we return the cached one. Otherwise we
705 // store the one given as [command] argument. 708 // store the one given as [command] argument.
706 if (_cleared) { 709 if (_cleared) {
707 throw new Exception( 710 throw new Exception(
708 "CommandBuilder.get[type]Command called after cache cleared"); 711 "CommandBuilder.get[type]Command called after cache cleared");
709 } 712 }
710 var cachedCommand = _cachedCommands[command]; 713 var cachedCommand = _cachedCommands[command];
711 if (cachedCommand != null) { 714 if (cachedCommand != null) {
712 return cachedCommand; 715 return cachedCommand as T;
713 } 716 }
714 _cachedCommands[command] = command; 717 _cachedCommands[command] = command;
715 return command; 718 return command;
716 } 719 }
717 } 720 }
718 721
719 /** 722 /**
720 * TestCase contains all the information needed to run a test and evaluate 723 * TestCase contains all the information needed to run a test and evaluate
721 * its output. Running a test involves starting a separate process, with 724 * its output. Running a test involves starting a separate process, with
722 * the executable and arguments given by the TestCase, and recording its 725 * the executable and arguments given by the TestCase, and recording its
(...skipping 30 matching lines...) Expand all
753 new Map<Command, CommandOutput>(); 756 new Map<Command, CommandOutput>();
754 757
755 Map configuration; 758 Map configuration;
756 String displayName; 759 String displayName;
757 int _expectations = 0; 760 int _expectations = 0;
758 int hash = 0; 761 int hash = 0;
759 Set<Expectation> expectedOutcomes; 762 Set<Expectation> expectedOutcomes;
760 763
761 TestCase(this.displayName, this.commands, this.configuration, 764 TestCase(this.displayName, this.commands, this.configuration,
762 this.expectedOutcomes, 765 this.expectedOutcomes,
763 {isNegative: false, TestInformation info: null}) { 766 {bool isNegative: false, TestInformation info}) {
764 if (isNegative || displayName.contains("negative_test")) { 767 if (isNegative || displayName.contains("negative_test")) {
765 _expectations |= IS_NEGATIVE; 768 _expectations |= IS_NEGATIVE;
766 } 769 }
767 if (info != null) { 770 if (info != null) {
768 _setExpectations(info); 771 _setExpectations(info);
769 hash = 772 hash =
770 info.originTestPath.relativeTo(TestUtils.dartDir).toString().hashCode; 773 info.originTestPath.relativeTo(TestUtils.dartDir).toString().hashCode;
771 } 774 }
772 } 775 }
773 776
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 commands.length == commandOutputs.length); 866 commands.length == commandOutputs.length);
864 } 867 }
865 } 868 }
866 869
867 /** 870 /**
868 * BrowserTestCase has an extra compilation command that is run in a separate 871 * BrowserTestCase has an extra compilation command that is run in a separate
869 * process, before the regular test is run as in the base class [TestCase]. 872 * process, before the regular test is run as in the base class [TestCase].
870 * If the compilation command fails, then the rest of the test is not run. 873 * If the compilation command fails, then the rest of the test is not run.
871 */ 874 */
872 class BrowserTestCase extends TestCase { 875 class BrowserTestCase extends TestCase {
873 BrowserTestCase(displayName, commands, configuration, expectedOutcomes, info, 876 BrowserTestCase(
874 isNegative, this._testingUrl) 877 String displayName,
878 List<Command> commands,
879 configuration,
880 Set<Expectation> expectedOutcomes,
881 TestInformation info,
882 bool isNegative,
883 this._testingUrl)
875 : super(displayName, commands, configuration, expectedOutcomes, 884 : super(displayName, commands, configuration, expectedOutcomes,
876 isNegative: isNegative, info: info); 885 isNegative: isNegative, info: info);
877 886
878 String _testingUrl; 887 String _testingUrl;
879 888
880 String get testingUrl => _testingUrl; 889 String get testingUrl => _testingUrl;
881 } 890 }
882 891
883 class UnittestSuiteMessagesMixin { 892 class UnittestSuiteMessagesMixin {
884 bool _isAsyncTest(String testOutput) { 893 bool _isAsyncTest(String testOutput) {
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 command.browser == "ie11") { 1082 command.browser == "ie11") {
1074 DebugLogger.warning("Timeout of ie11 on test page ${command.url}"); 1083 DebugLogger.warning("Timeout of ie11 on test page ${command.url}");
1075 return true; 1084 return true;
1076 } 1085 }
1077 return false; 1086 return false;
1078 } 1087 }
1079 1088
1080 bool _infraFailure; 1089 bool _infraFailure;
1081 1090
1082 BrowserCommandOutputImpl( 1091 BrowserCommandOutputImpl(
1083 command, exitCode, timedOut, stdout, stderr, time, compilationSkipped) 1092 Command command,
1093 int exitCode,
1094 bool timedOut,
1095 List<int> stdout,
1096 List<int> stderr,
1097 Duration time,
1098 bool compilationSkipped)
1084 : _infraFailure = 1099 : _infraFailure =
1085 _failedBecauseOfFlakyInfrastructure(command, timedOut, stderr), 1100 _failedBecauseOfFlakyInfrastructure(command, timedOut, stderr),
1086 super(command, exitCode, timedOut, stdout, stderr, time, 1101 super(command, exitCode, timedOut, stdout, stderr, time,
1087 compilationSkipped, 0); 1102 compilationSkipped, 0);
1088 1103
1089 Expectation result(TestCase testCase) { 1104 Expectation result(TestCase testCase) {
1090 if (_infraFailure) { 1105 if (_infraFailure) {
1091 return Expectation.IGNORE; 1106 return Expectation.IGNORE;
1092 } 1107 }
1093 // Handle crashes and timeouts first 1108 // Handle crashes and timeouts first
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 (!isWindows || exitCode != WHITELISTED_CONTENTSHELL_EXITCODE)); 1195 (!isWindows || exitCode != WHITELISTED_CONTENTSHELL_EXITCODE));
1181 } 1196 }
1182 DebugLogger.warning("Couldn't find 'Content-Type: text/plain' in output. " 1197 DebugLogger.warning("Couldn't find 'Content-Type: text/plain' in output. "
1183 "($command)."); 1198 "($command).");
1184 return true; 1199 return true;
1185 } 1200 }
1186 } 1201 }
1187 1202
1188 class HTMLBrowserCommandOutputImpl extends BrowserCommandOutputImpl { 1203 class HTMLBrowserCommandOutputImpl extends BrowserCommandOutputImpl {
1189 HTMLBrowserCommandOutputImpl( 1204 HTMLBrowserCommandOutputImpl(
1190 command, exitCode, timedOut, stdout, stderr, time, compilationSkipped) 1205 Command command,
1206 int exitCode,
1207 bool timedOut,
1208 List<int> stdout,
1209 List<int> stderr,
1210 Duration time,
1211 bool compilationSkipped)
1191 : super(command, exitCode, timedOut, stdout, stderr, time, 1212 : super(command, exitCode, timedOut, stdout, stderr, time,
1192 compilationSkipped); 1213 compilationSkipped);
1193 1214
1194 bool didFail(TestCase testCase) { 1215 bool didFail(TestCase testCase) {
1195 return _getOutcome() != Expectation.PASS; 1216 return _getOutcome() != Expectation.PASS;
1196 } 1217 }
1197 1218
1198 bool get _browserTestFailure { 1219 bool get _browserTestFailure {
1199 // We should not need to convert back and forward. 1220 // We should not need to convert back and forward.
1200 var output = decodeUtf8(super.stdout); 1221 var output = decodeUtf8(super.stdout);
(...skipping 21 matching lines...) Expand all
1222 BrowserTestJsonResult(this.outcome, this.htmlDom, this.events); 1243 BrowserTestJsonResult(this.outcome, this.htmlDom, this.events);
1223 1244
1224 static BrowserTestJsonResult parseFromString(String content) { 1245 static BrowserTestJsonResult parseFromString(String content) {
1225 void validate(String assertion, bool value) { 1246 void validate(String assertion, bool value) {
1226 if (!value) { 1247 if (!value) {
1227 throw "InvalidFormat sent from browser driving page: $assertion:\n\n" 1248 throw "InvalidFormat sent from browser driving page: $assertion:\n\n"
1228 "$content"; 1249 "$content";
1229 } 1250 }
1230 } 1251 }
1231 1252
1232 var events;
1233 try { 1253 try {
1234 events = JSON.decode(content); 1254 var events = JSON.decode(content);
1235 if (events != null) { 1255 if (events != null) {
1236 validate("Message must be a List", events is List); 1256 validate("Message must be a List", events is List);
1237 1257
1238 Map<String, List<String>> messagesByType = {}; 1258 Map<String, List<String>> messagesByType = {};
1239 ALLOWED_TYPES.forEach((type) => messagesByType[type] = <String>[]); 1259 ALLOWED_TYPES.forEach((type) => messagesByType[type] = <String>[]);
1240 1260
1241 for (var entry in events) { 1261 for (var entry in events) {
1242 validate("An entry must be a Map", entry is Map); 1262 validate("An entry must be a Map", entry is Map);
1243 1263
1244 var type = entry['type']; 1264 var type = entry['type'];
(...skipping 23 matching lines...) Expand all
1268 // If something goes wrong, we know the content was not in the correct 1288 // If something goes wrong, we know the content was not in the correct
1269 // JSON format. So we can't parse it. 1289 // JSON format. So we can't parse it.
1270 // The caller is responsible for falling back to the old way of 1290 // The caller is responsible for falling back to the old way of
1271 // determining if a test failed. 1291 // determining if a test failed.
1272 } 1292 }
1273 1293
1274 return null; 1294 return null;
1275 } 1295 }
1276 1296
1277 static Expectation _getOutcome(Map<String, List<String>> messagesByType) { 1297 static Expectation _getOutcome(Map<String, List<String>> messagesByType) {
1278 occured(type) => messagesByType[type].length > 0; 1298 occured(String type) => messagesByType[type].length > 0;
1279 searchForMsg(types, message) { 1299 searchForMsg(List<String> types, String message) {
1280 return types.any((type) => messagesByType[type].contains(message)); 1300 return types.any((type) => messagesByType[type].contains(message));
1281 } 1301 }
1282 1302
1283 // FIXME(kustermann,ricow): I think this functionality doesn't work in 1303 // FIXME(kustermann,ricow): I think this functionality doesn't work in
1284 // test_controller.js: So far I haven't seen anything being reported on 1304 // test_controller.js: So far I haven't seen anything being reported on
1285 // "window.compilationerror" 1305 // "window.compilationerror"
1286 if (occured('window_compilationerror')) { 1306 if (occured('window_compilationerror')) {
1287 return Expectation.COMPILETIME_ERROR; 1307 return Expectation.COMPILETIME_ERROR;
1288 } 1308 }
1289 1309
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1415 1435
1416 class AnalysisCommandOutputImpl extends CommandOutputImpl { 1436 class AnalysisCommandOutputImpl extends CommandOutputImpl {
1417 // An error line has 8 fields that look like: 1437 // An error line has 8 fields that look like:
1418 // ERROR|COMPILER|MISSING_SOURCE|file:/tmp/t.dart|15|1|24|Missing source. 1438 // ERROR|COMPILER|MISSING_SOURCE|file:/tmp/t.dart|15|1|24|Missing source.
1419 final int ERROR_LEVEL = 0; 1439 final int ERROR_LEVEL = 0;
1420 final int ERROR_TYPE = 1; 1440 final int ERROR_TYPE = 1;
1421 final int FILENAME = 3; 1441 final int FILENAME = 3;
1422 final int FORMATTED_ERROR = 7; 1442 final int FORMATTED_ERROR = 7;
1423 1443
1424 AnalysisCommandOutputImpl( 1444 AnalysisCommandOutputImpl(
1425 command, exitCode, timedOut, stdout, stderr, time, compilationSkipped) 1445 Command command,
1446 int exitCode,
1447 bool timedOut,
1448 List<int> stdout,
1449 List<int> stderr,
1450 Duration time,
1451 bool compilationSkipped)
1426 : super(command, exitCode, timedOut, stdout, stderr, time, 1452 : super(command, exitCode, timedOut, stdout, stderr, time,
1427 compilationSkipped, 0); 1453 compilationSkipped, 0);
1428 1454
1429 Expectation result(TestCase testCase) { 1455 Expectation result(TestCase testCase) {
1430 // TODO(kustermann): If we run the analyzer not in batch mode, make sure 1456 // TODO(kustermann): If we run the analyzer not in batch mode, make sure
1431 // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings, 1457 // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings,
1432 // no errors) 1458 // no errors)
1433 1459
1434 // Handle crashes and timeouts first 1460 // Handle crashes and timeouts first
1435 if (hasCrashed) return Expectation.CRASH; 1461 if (hasCrashed) return Expectation.CRASH;
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
1841 head = null; 1867 head = null;
1842 tail = null; 1868 tail = null;
1843 _checkUtf8(complete); 1869 _checkUtf8(complete);
1844 } 1870 }
1845 return complete; 1871 return complete;
1846 } 1872 }
1847 } 1873 }
1848 1874
1849 // Helper to get a list of all child pids for a parent process. 1875 // Helper to get a list of all child pids for a parent process.
1850 // The first element of the list is the parent pid. 1876 // The first element of the list is the parent pid.
1851 Future<List<int>> _getPidList(pid, diagnostics) async { 1877 Future<List<int>> _getPidList(int pid, List<String> diagnostics) async {
1852 var pid_list = [pid]; 1878 var pids = [pid];
1853 var lines; 1879 List<String> lines;
1854 var start_line = 0; 1880 var startLine = 0;
1855 if (io.Platform.isLinux || io.Platform.isMacOS) { 1881 if (io.Platform.isLinux || io.Platform.isMacOS) {
1856 var result = await io.Process 1882 var result =
1857 .run("pgrep", ["-P", "${pid_list[0]}"], runInShell: true); 1883 await io.Process.run("pgrep", ["-P", "${pids[0]}"], runInShell: true);
1858 lines = result.stdout.split('\n'); 1884 lines = result.stdout.split('\n');
1859 } else if (io.Platform.isWindows) { 1885 } else if (io.Platform.isWindows) {
1860 var result = await io.Process.run( 1886 var result = await io.Process.run(
1861 "wmic", 1887 "wmic",
1862 [ 1888 [
1863 "process", 1889 "process",
1864 "where", 1890 "where",
1865 "(ParentProcessId=${pid_list[0]})", 1891 "(ParentProcessId=${pids[0]})",
1866 "get", 1892 "get",
1867 "ProcessId" 1893 "ProcessId"
1868 ], 1894 ],
1869 runInShell: true); 1895 runInShell: true);
1870 lines = result.stdout.split('\n'); 1896 lines = result.stdout.split('\n');
1871 // Skip first line containing header "ProcessId". 1897 // Skip first line containing header "ProcessId".
1872 start_line = 1; 1898 startLine = 1;
1873 } else { 1899 } else {
1874 assert(false); 1900 assert(false);
1875 } 1901 }
1876 if (lines.length > start_line) { 1902 if (lines.length > startLine) {
1877 for (int i = start_line; i < lines.length; ++i) { 1903 for (var i = startLine; i < lines.length; ++i) {
1878 var pid = int.parse(lines[i], onError: (source) => null); 1904 var pid = int.parse(lines[i], onError: (source) => null);
1879 if (pid != null) pid_list.add(pid); 1905 if (pid != null) pids.add(pid);
1880 } 1906 }
1881 } else { 1907 } else {
1882 diagnostics.add("Could not find child pids"); 1908 diagnostics.add("Could not find child pids");
1883 diagnostics.addAll(lines); 1909 diagnostics.addAll(lines);
1884 } 1910 }
1885 return pid_list; 1911 return pids;
1886 } 1912 }
1887 1913
1888 /** 1914 /**
1889 * A RunningProcess actually runs a test, getting the command lines from 1915 * A RunningProcess actually runs a test, getting the command lines from
1890 * its [TestCase], starting the test process (and first, a compilation 1916 * its [TestCase], starting the test process (and first, a compilation
1891 * process if the TestCase is a [BrowserTestCase]), creating a timeout 1917 * process if the TestCase is a [BrowserTestCase]), creating a timeout
1892 * timer, and recording the results in a new [CommandOutput] object, which it 1918 * timer, and recording the results in a new [CommandOutput] object, which it
1893 * attaches to the TestCase. The lifetime of the RunningProcess is limited 1919 * attaches to the TestCase. The lifetime of the RunningProcess is limited
1894 * to the time it takes to start the process, run the process, and record 1920 * to the time it takes to start the process, run the process, and record
1895 * the result; there are no pointers to it, so it should be available to 1921 * the result; there are no pointers to it, so it should be available to
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 var args = command.arguments; 1954 var args = command.arguments;
1929 Future processFuture = io.Process.start(command.executable, args, 1955 Future processFuture = io.Process.start(command.executable, args,
1930 environment: processEnvironment, 1956 environment: processEnvironment,
1931 workingDirectory: command.workingDirectory); 1957 workingDirectory: command.workingDirectory);
1932 processFuture.then((io.Process process) { 1958 processFuture.then((io.Process process) {
1933 StreamSubscription stdoutSubscription = 1959 StreamSubscription stdoutSubscription =
1934 _drainStream(process.stdout, stdout); 1960 _drainStream(process.stdout, stdout);
1935 StreamSubscription stderrSubscription = 1961 StreamSubscription stderrSubscription =
1936 _drainStream(process.stderr, stderr); 1962 _drainStream(process.stderr, stderr);
1937 1963
1938 var stdoutCompleter = new Completer(); 1964 var stdoutCompleter = new Completer<Null>();
1939 var stderrCompleter = new Completer(); 1965 var stderrCompleter = new Completer<Null>();
1940 1966
1941 bool stdoutDone = false; 1967 bool stdoutDone = false;
1942 bool stderrDone = false; 1968 bool stderrDone = false;
1943 pid = process.pid; 1969 pid = process.pid;
1944 1970
1945 // This timer is used to close stdio to the subprocess once we got 1971 // This timer is used to close stdio to the subprocess once we got
1946 // the exitCode. Sometimes descendants of the subprocess keep stdio 1972 // the exitCode. Sometimes descendants of the subprocess keep stdio
1947 // handles alive even though the direct subprocess is dead. 1973 // handles alive even though the direct subprocess is dead.
1948 Timer watchdogTimer; 1974 Timer watchdogTimer;
1949 1975
(...skipping 16 matching lines...) Expand all
1966 watchdogTimer.cancel(); 1992 watchdogTimer.cancel();
1967 } 1993 }
1968 } 1994 }
1969 } 1995 }
1970 1996
1971 // Close stdin so that tests that try to block on input will fail. 1997 // Close stdin so that tests that try to block on input will fail.
1972 process.stdin.close(); 1998 process.stdin.close();
1973 timeoutHandler() async { 1999 timeoutHandler() async {
1974 timedOut = true; 2000 timedOut = true;
1975 if (process != null) { 2001 if (process != null) {
1976 var executable; 2002 String executable;
1977 if (io.Platform.isLinux) { 2003 if (io.Platform.isLinux) {
1978 executable = 'eu-stack'; 2004 executable = 'eu-stack';
1979 } else if (io.Platform.isMacOS) { 2005 } else if (io.Platform.isMacOS) {
1980 // Try to print stack traces of the timed out process. 2006 // Try to print stack traces of the timed out process.
1981 // `sample` is a sampling profiler but we ask it sample for 1 2007 // `sample` is a sampling profiler but we ask it sample for 1
1982 // second with a 4 second delay between samples so that we only 2008 // second with a 4 second delay between samples so that we only
1983 // sample the threads once. 2009 // sample the threads once.
1984 executable = '/usr/bin/sample'; 2010 executable = '/usr/bin/sample';
1985 } else if (io.Platform.isWindows) { 2011 } else if (io.Platform.isWindows) {
1986 bool is_x64 = command.executable.contains("X64") || 2012 bool is_x64 = command.executable.contains("X64") ||
1987 command.executable.contains("SIMARM64"); 2013 command.executable.contains("SIMARM64");
1988 var win_sdk_path = configuration['win_sdk_path']; 2014 var winSdkPath = configuration['win_sdk_path'];
1989 if (win_sdk_path != null) { 2015 if (winSdkPath != null) {
1990 executable = win_sdk_path + 2016 executable = winSdkPath +
1991 "\\Debuggers\\" + 2017 "\\Debuggers\\" +
1992 (is_x64 ? "x64" : "x86") + 2018 (is_x64 ? "x64" : "x86") +
1993 "\\cdb.exe"; 2019 "\\cdb.exe";
1994 diagnostics.add("Using $executable to print stack traces"); 2020 diagnostics.add("Using $executable to print stack traces");
1995 } else { 2021 } else {
1996 diagnostics.add("win_sdk path not found"); 2022 diagnostics.add("win_sdk path not found");
1997 } 2023 }
1998 } else { 2024 } else {
1999 diagnostics.add("Capturing stack traces on" 2025 diagnostics.add("Capturing stack traces on"
2000 "${io.Platform.operatingSystem} not supported"); 2026 "${io.Platform.operatingSystem} not supported");
2001 } 2027 }
2002 if (executable != null) { 2028 if (executable != null) {
2003 var pid_list = await _getPidList(process.pid, diagnostics); 2029 var pids = await _getPidList(process.pid, diagnostics);
2004 diagnostics.add("Process list including children: $pid_list"); 2030 diagnostics.add("Process list including children: $pids");
2005 for (pid in pid_list) { 2031 for (pid in pids) {
2006 var arguments; 2032 List<String> arguments;
2007 if (io.Platform.isLinux) { 2033 if (io.Platform.isLinux) {
2008 arguments = ['-p $pid']; 2034 arguments = ['-p $pid'];
2009 } else if (io.Platform.isMacOS) { 2035 } else if (io.Platform.isMacOS) {
2010 arguments = ['$pid', '1', '4000', '-mayDie']; 2036 arguments = ['$pid', '1', '4000', '-mayDie'];
2011 } else if (io.Platform.isWindows) { 2037 } else if (io.Platform.isWindows) {
2012 arguments = ['-p', '$pid', '-c', '!uniqstack;qd']; 2038 arguments = ['-p', '$pid', '-c', '!uniqstack;qd'];
2013 } else { 2039 } else {
2014 assert(false); 2040 assert(false);
2015 } 2041 }
2016 diagnostics.add("Trying to capture stack trace for pid $pid"); 2042 diagnostics.add("Trying to capture stack trace for pid $pid");
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 } 2148 }
2123 } 2149 }
2124 2150
2125 class BatchRunnerProcess { 2151 class BatchRunnerProcess {
2126 Completer<CommandOutput> _completer; 2152 Completer<CommandOutput> _completer;
2127 ProcessCommand _command; 2153 ProcessCommand _command;
2128 List<String> _arguments; 2154 List<String> _arguments;
2129 String _runnerType; 2155 String _runnerType;
2130 2156
2131 io.Process _process; 2157 io.Process _process;
2132 Map _processEnvironmentOverrides; 2158 Map<String, String> _processEnvironmentOverrides;
2133 Completer _stdoutCompleter; 2159 Completer<Null> _stdoutCompleter;
2134 Completer _stderrCompleter; 2160 Completer<Null> _stderrCompleter;
2135 StreamSubscription<String> _stdoutSubscription; 2161 StreamSubscription<String> _stdoutSubscription;
2136 StreamSubscription<String> _stderrSubscription; 2162 StreamSubscription<String> _stderrSubscription;
2137 Function _processExitHandler; 2163 Function _processExitHandler;
2138 2164
2139 bool _currentlyRunning = false; 2165 bool _currentlyRunning = false;
2140 OutputLog _testStdout; 2166 OutputLog _testStdout;
2141 OutputLog _testStderr; 2167 OutputLog _testStderr;
2142 String _status; 2168 String _status;
2143 DateTime _startTime; 2169 DateTime _startTime;
2144 Timer _timer; 2170 Timer _timer;
2145 2171
2146 Future<CommandOutput> runCommand(String runnerType, ProcessCommand command, 2172 Future<CommandOutput> runCommand(String runnerType, ProcessCommand command,
2147 int timeout, List<String> arguments) { 2173 int timeout, List<String> arguments) {
2148 assert(_completer == null); 2174 assert(_completer == null);
2149 assert(!_currentlyRunning); 2175 assert(!_currentlyRunning);
2150 2176
2151 _completer = new Completer<CommandOutput>(); 2177 _completer = new Completer();
2152 bool sameRunnerType = _runnerType == runnerType && 2178 bool sameRunnerType = _runnerType == runnerType &&
2153 _dictEquals(_processEnvironmentOverrides, command.environmentOverrides); 2179 _dictEquals(_processEnvironmentOverrides, command.environmentOverrides);
2154 _runnerType = runnerType; 2180 _runnerType = runnerType;
2155 _currentlyRunning = true; 2181 _currentlyRunning = true;
2156 _command = command; 2182 _command = command;
2157 _arguments = arguments; 2183 _arguments = arguments;
2158 _processEnvironmentOverrides = command.environmentOverrides; 2184 _processEnvironmentOverrides = command.environmentOverrides;
2159 2185
2160 if (_process == null) { 2186 if (_process == null) {
2161 // Start process if not yet started. 2187 // Start process if not yet started.
2162 _startProcess(() { 2188 _startProcess(() {
2163 doStartTest(command, timeout); 2189 doStartTest(command, timeout);
2164 }); 2190 });
2165 } else if (!sameRunnerType) { 2191 } else if (!sameRunnerType) {
2166 // Restart this runner with the right executable for this test if needed. 2192 // Restart this runner with the right executable for this test if needed.
2167 _processExitHandler = (_) { 2193 _processExitHandler = (_) {
2168 _startProcess(() { 2194 _startProcess(() {
2169 doStartTest(command, timeout); 2195 doStartTest(command, timeout);
2170 }); 2196 });
2171 }; 2197 };
2172 _process.kill(); 2198 _process.kill();
2173 _stdoutSubscription.cancel(); 2199 _stdoutSubscription.cancel();
2174 _stderrSubscription.cancel(); 2200 _stderrSubscription.cancel();
2175 } else { 2201 } else {
2176 doStartTest(command, timeout); 2202 doStartTest(command, timeout);
2177 } 2203 }
2178 return _completer.future; 2204 return _completer.future;
2179 } 2205 }
2180 2206
2181 Future terminate() { 2207 Future<bool> terminate() {
2182 if (_process == null) return new Future.value(true); 2208 if (_process == null) return new Future.value(true);
2183 Completer terminateCompleter = new Completer(); 2209 Completer terminateCompleter = new Completer<bool>();
2184 _processExitHandler = (_) { 2210 _processExitHandler = (_) {
2185 terminateCompleter.complete(true); 2211 terminateCompleter.complete(true);
2186 }; 2212 };
2187 _process.kill(); 2213 _process.kill();
2188 _stdoutSubscription.cancel(); 2214 _stdoutSubscription.cancel();
2189 _stderrSubscription.cancel(); 2215 _stderrSubscription.cancel();
2190 2216
2191 return terminateCompleter.future; 2217 return terminateCompleter.future;
2192 } 2218 }
2193 2219
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2249 } 2275 }
2250 2276
2251 return handler; 2277 return handler;
2252 } 2278 }
2253 2279
2254 void _timeoutHandler() { 2280 void _timeoutHandler() {
2255 _processExitHandler = makeExitHandler(">>> TEST TIMEOUT"); 2281 _processExitHandler = makeExitHandler(">>> TEST TIMEOUT");
2256 _process.kill(); 2282 _process.kill();
2257 } 2283 }
2258 2284
2259 _startProcess(callback) { 2285 void _startProcess(Action callback) {
2260 assert(_command is ProcessCommand); 2286 assert(_command is ProcessCommand);
2261 var executable = _command.executable; 2287 var executable = _command.executable;
2262 var arguments = _command.batchArguments.toList(); 2288 var arguments = _command.batchArguments.toList();
2263 arguments.add('--batch'); 2289 arguments.add('--batch');
2264 var environment = new Map.from(io.Platform.environment); 2290 var environment = new Map.from(io.Platform.environment);
2265 if (_processEnvironmentOverrides != null) { 2291 if (_processEnvironmentOverrides != null) {
2266 for (var key in _processEnvironmentOverrides.keys) { 2292 for (var key in _processEnvironmentOverrides.keys) {
2267 environment[key] = _processEnvironmentOverrides[key]; 2293 environment[key] = _processEnvironmentOverrides[key];
2268 } 2294 }
2269 } 2295 }
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
2507 2533
2508 CommandQueue(this.graph, this.enqueuer, this.executor, this._maxProcesses, 2534 CommandQueue(this.graph, this.enqueuer, this.executor, this._maxProcesses,
2509 this._maxBrowserProcesses, this._verbose) { 2535 this._maxBrowserProcesses, this._verbose) {
2510 var eventCondition = graph.events.where; 2536 var eventCondition = graph.events.where;
2511 eventCondition((e) => e is dgraph.StateChangedEvent).listen((e) { 2537 eventCondition((e) => e is dgraph.StateChangedEvent).listen((e) {
2512 var event = e as dgraph.StateChangedEvent; 2538 var event = e as dgraph.StateChangedEvent;
2513 if (event.to == dgraph.NodeState.Enqueuing) { 2539 if (event.to == dgraph.NodeState.Enqueuing) {
2514 assert(event.from == dgraph.NodeState.Initialized || 2540 assert(event.from == dgraph.NodeState.Initialized ||
2515 event.from == dgraph.NodeState.Waiting); 2541 event.from == dgraph.NodeState.Waiting);
2516 graph.changeState(event.node, dgraph.NodeState.Processing); 2542 graph.changeState(event.node, dgraph.NodeState.Processing);
2517 var command = event.node.userData; 2543 var command = event.node.userData as Command;
2518 if (event.node.dependencies.length > 0) { 2544 if (event.node.dependencies.length > 0) {
2519 _runQueue.addFirst(command); 2545 _runQueue.addFirst(command);
2520 } else { 2546 } else {
2521 _runQueue.add(command); 2547 _runQueue.add(command);
2522 } 2548 }
2523 Timer.run(() => _tryRunNextCommand()); 2549 Timer.run(() => _tryRunNextCommand());
2524 } 2550 }
2525 }); 2551 });
2526 // We're finished if the graph is sealed and all nodes are in a finished 2552 // We're finished if the graph is sealed and all nodes are in a finished
2527 // state (Successful, Failed or UnableToRun). 2553 // state (Successful, Failed or UnableToRun).
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
2725 return adbDevicePool.acquireDevice().then((AdbDevice device) { 2751 return adbDevicePool.acquireDevice().then((AdbDevice device) {
2726 return _runAdbPrecompilationCommand(device, command, timeout) 2752 return _runAdbPrecompilationCommand(device, command, timeout)
2727 .whenComplete(() { 2753 .whenComplete(() {
2728 adbDevicePool.releaseDevice(device); 2754 adbDevicePool.releaseDevice(device);
2729 }); 2755 });
2730 }); 2756 });
2731 } else if (command is VmBatchCommand) { 2757 } else if (command is VmBatchCommand) {
2732 var name = command.displayName; 2758 var name = command.displayName;
2733 return _getBatchRunner(command.displayName + command.dartFile) 2759 return _getBatchRunner(command.displayName + command.dartFile)
2734 .runCommand(name, command, timeout, command.arguments); 2760 .runCommand(name, command, timeout, command.arguments);
2735 } else { 2761 } else if (command is ProcessCommand) {
2736 return new RunningProcess(command, timeout, 2762 return new RunningProcess(command, timeout,
2737 configuration: globalConfiguration) 2763 configuration: globalConfiguration)
2738 .run(); 2764 .run();
2765 } else {
2766 throw new ArgumentError("Unknown command type ${command.runtimeType}.");
2739 } 2767 }
2740 } 2768 }
2741 2769
2742 Future<CommandOutput> _runAdbPrecompilationCommand( 2770 Future<CommandOutput> _runAdbPrecompilationCommand(
2743 AdbDevice device, AdbPrecompilationCommand command, int timeout) async { 2771 AdbDevice device, AdbPrecompilationCommand command, int timeout) async {
2744 var runner = command.precompiledRunnerFilename; 2772 var runner = command.precompiledRunnerFilename;
2745 var processTest = command.processTestFilename; 2773 var processTest = command.processTestFilename;
2746 var testdir = command.precompiledTestDirectory; 2774 var testdir = command.precompiledTestDirectory;
2747 var arguments = command.arguments; 2775 var arguments = command.arguments;
2748 var devicedir = DartPrecompiledAdbRuntimeConfiguration.DeviceDir; 2776 var devicedir = DartPrecompiledAdbRuntimeConfiguration.DeviceDir;
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
3072 } 3100 }
3073 } 3101 }
3074 3102
3075 class ProcessQueue { 3103 class ProcessQueue {
3076 Map _globalConfiguration; 3104 Map _globalConfiguration;
3077 3105
3078 Function _allDone; 3106 Function _allDone;
3079 final dgraph.Graph _graph = new dgraph.Graph(); 3107 final dgraph.Graph _graph = new dgraph.Graph();
3080 List<EventListener> _eventListener; 3108 List<EventListener> _eventListener;
3081 3109
3082 ProcessQueue(this._globalConfiguration, maxProcesses, maxBrowserProcesses, 3110 ProcessQueue(
3083 DateTime startTime, testSuites, this._eventListener, this._allDone, 3111 this._globalConfiguration,
3112 int maxProcesses,
3113 int maxBrowserProcesses,
3114 DateTime startTime,
3115 List<TestSuite> testSuites,
3116 this._eventListener,
3117 this._allDone,
3084 [bool verbose = false, 3118 [bool verbose = false,
3085 String recordingOutputFile, 3119 String recordingOutputFile,
3086 String recordedInputFile, 3120 String recordedInputFile,
3087 AdbDevicePool adbDevicePool]) { 3121 AdbDevicePool adbDevicePool]) {
3088 void setupForListing(TestCaseEnqueuer testCaseEnqueuer) { 3122 void setupForListing(TestCaseEnqueuer testCaseEnqueuer) {
3089 _graph.events 3123 _graph.events
3090 .where((event) => event is dgraph.GraphSealedEvent) 3124 .where((event) => event is dgraph.GraphSealedEvent)
3091 .listen((_) { 3125 .listen((_) {
3092 var testCases = new List.from(testCaseEnqueuer.remainingTestCases); 3126 var testCases = testCaseEnqueuer.remainingTestCases.toList();
3093 testCases.sort((a, b) => a.displayName.compareTo(b.displayName)); 3127 testCases.sort((a, b) => a.displayName.compareTo(b.displayName));
3094 3128
3095 print("\nGenerating all matching test cases ....\n"); 3129 print("\nGenerating all matching test cases ....\n");
3096 3130
3097 for (TestCase testCase in testCases) { 3131 for (TestCase testCase in testCases) {
3098 eventFinishedTestCase(testCase); 3132 eventFinishedTestCase(testCase);
3099 print("${testCase.displayName} " 3133 print("${testCase.displayName} "
3100 "Expectations: ${testCase.expectedOutcomes.join(', ')} " 3134 "Expectations: ${testCase.expectedOutcomes.join(', ')} "
3101 "Configuration: '${testCase.configurationString}'"); 3135 "Configuration: '${testCase.configurationString}'");
3102 } 3136 }
3103 eventAllTestsKnown(); 3137 eventAllTestsKnown();
3104 }); 3138 });
3105 } 3139 }
3106 3140
3107 var testCaseEnqueuer; 3141 TestCaseEnqueuer testCaseEnqueuer;
3108 CommandQueue commandQueue; 3142 CommandQueue commandQueue;
3109 3143
3110 void setupForRunning(TestCaseEnqueuer testCaseEnqueuer) { 3144 void setupForRunning(TestCaseEnqueuer testCaseEnqueuer) {
3111 Timer _debugTimer; 3145 Timer _debugTimer;
3112 // If we haven't seen a single test finishing during a 10 minute period 3146 // If we haven't seen a single test finishing during a 10 minute period
3113 // something is definitely wrong, so we dump the debugging information. 3147 // something is definitely wrong, so we dump the debugging information.
3114 final debugTimerDuration = const Duration(minutes: 10); 3148 final debugTimerDuration = const Duration(minutes: 10);
3115 3149
3116 void cancelDebugTimer() { 3150 void cancelDebugTimer() {
3117 if (_debugTimer != null) { 3151 if (_debugTimer != null) {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
3255 } 3289 }
3256 } 3290 }
3257 3291
3258 void eventAllTestsDone() { 3292 void eventAllTestsDone() {
3259 for (var listener in _eventListener) { 3293 for (var listener in _eventListener) {
3260 listener.allDone(); 3294 listener.allDone();
3261 } 3295 }
3262 _allDone(); 3296 _allDone();
3263 } 3297 }
3264 } 3298 }
OLDNEW
« no previous file with comments | « tools/testing/dart/test_progress.dart ('k') | tools/testing/dart/test_suite.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698