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

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

Issue 1859973002: Autoformat tools/testing/dart (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Format whole directory Created 4 years, 8 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_runner.dart ('k') | tools/testing/dart/utils.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 enumerating and preparing tests. 6 * Classes and methods for enumerating and preparing tests.
7 * 7 *
8 * This library includes: 8 * This library includes:
9 * 9 *
10 * - Creating tests by listing all the Dart files in certain directories, 10 * - Creating tests by listing all the Dart files in certain directories,
11 * and creating [TestCase]s for those files that meet the relevant criteria. 11 * and creating [TestCase]s for those files that meet the relevant criteria.
12 * - Preparing tests, including copying files and frameworks to temporary 12 * - Preparing tests, including copying files and frameworks to temporary
13 * directories, and computing the command line and arguments to be run. 13 * directories, and computing the command line and arguments to be run.
14 */ 14 */
15 library test_suite; 15 library test_suite;
16 16
17 import "dart:async"; 17 import "dart:async";
18 import "dart:io"; 18 import "dart:io";
19 import "dart:math"; 19 import "dart:math";
20 import "drt_updater.dart"; 20 import "drt_updater.dart";
21 import "html_test.dart" as htmlTest; 21 import "html_test.dart" as htmlTest;
22 import "path.dart"; 22 import "path.dart";
23 import "multitest.dart"; 23 import "multitest.dart";
24 import "status_file_parser.dart"; 24 import "status_file_parser.dart";
25 import "summary_report.dart"; 25 import "summary_report.dart";
26 import "test_runner.dart"; 26 import "test_runner.dart";
27 import "utils.dart"; 27 import "utils.dart";
28 import "http_server.dart" show PREFIX_BUILDDIR, PREFIX_DARTDIR; 28 import "http_server.dart" show PREFIX_BUILDDIR, PREFIX_DARTDIR;
29 29
30 import "compiler_configuration.dart" show 30 import "compiler_configuration.dart"
31 CommandArtifact, 31 show CommandArtifact, CompilerConfiguration;
32 CompilerConfiguration;
33 32
34 import "runtime_configuration.dart" show 33 import "runtime_configuration.dart" show RuntimeConfiguration;
35 RuntimeConfiguration;
36 34
37 import 'browser_test.dart'; 35 import 'browser_test.dart';
38 36
39
40 RegExp multiHtmlTestGroupRegExp = new RegExp(r"\s*[^/]\s*group\('[^,']*"); 37 RegExp multiHtmlTestGroupRegExp = new RegExp(r"\s*[^/]\s*group\('[^,']*");
41 RegExp multiHtmlTestRegExp = new RegExp(r"useHtmlIndividualConfiguration()"); 38 RegExp multiHtmlTestRegExp = new RegExp(r"useHtmlIndividualConfiguration()");
42 // Require at least one non-space character before '///' 39 // Require at least one non-space character before '///'
43 RegExp multiTestRegExp = new RegExp(r"\S *" 40 RegExp multiTestRegExp = new RegExp(r"\S *"
44 r"/// \w+:(.*)"); 41 r"/// \w+:(.*)");
45 RegExp dartExtension = new RegExp(r'\.dart$'); 42 RegExp dartExtension = new RegExp(r'\.dart$');
46 43
47 /** 44 /**
48 * A simple function that tests [arg] and returns `true` or `false`. 45 * A simple function that tests [arg] and returns `true` or `false`.
49 */ 46 */
50 typedef bool Predicate<T>(T arg); 47 typedef bool Predicate<T>(T arg);
51 48
52 typedef void CreateTest(Path filePath, 49 typedef void CreateTest(Path filePath, Path originTestPath,
53 Path originTestPath, 50 bool hasCompileError, bool hasRuntimeError,
54 bool hasCompileError, 51 {bool isNegativeIfChecked,
55 bool hasRuntimeError, 52 bool hasCompileErrorIfChecked,
56 {bool isNegativeIfChecked, 53 bool hasStaticWarning,
57 bool hasCompileErrorIfChecked, 54 String multitestKey});
58 bool hasStaticWarning,
59 String multitestKey});
60 55
61 typedef void VoidFunction(); 56 typedef void VoidFunction();
62 57
63 /** 58 /**
64 * Calls [function] asynchronously. Returns a future that completes with the 59 * Calls [function] asynchronously. Returns a future that completes with the
65 * result of the function. If the function is `null`, returns a future that 60 * result of the function. If the function is `null`, returns a future that
66 * completes immediately with `null`. 61 * completes immediately with `null`.
67 */ 62 */
68 Future asynchronously(function()) { 63 Future asynchronously(function()) {
69 if (function == null) return new Future.value(null); 64 if (function == null) return new Future.value(null);
70 65
71 var completer = new Completer(); 66 var completer = new Completer();
72 Timer.run(() => completer.complete(function())); 67 Timer.run(() => completer.complete(function()));
73 68
74 return completer.future; 69 return completer.future;
75 } 70 }
76 71
77
78 /** A completer that waits until all added [Future]s complete. */ 72 /** A completer that waits until all added [Future]s complete. */
79 // TODO(rnystrom): Copied from web_components. Remove from here when it gets 73 // TODO(rnystrom): Copied from web_components. Remove from here when it gets
80 // added to dart:core. (See #6626.) 74 // added to dart:core. (See #6626.)
81 class FutureGroup { 75 class FutureGroup {
82 static const _FINISHED = -1; 76 static const _FINISHED = -1;
83 int _pending = 0; 77 int _pending = 0;
84 Completer<List> _completer = new Completer<List>(); 78 Completer<List> _completer = new Completer<List>();
85 final List<Future> futures = <Future>[]; 79 final List<Future> futures = <Future>[];
86 bool wasCompleted = false; 80 bool wasCompleted = false;
87 81
(...skipping 21 matching lines...) Expand all
109 wasCompleted = true; 103 wasCompleted = true;
110 } 104 }
111 } 105 }
112 }); 106 });
113 futures.add(handledTaskFuture); 107 futures.add(handledTaskFuture);
114 } 108 }
115 109
116 Future<List> get future => _completer.future; 110 Future<List> get future => _completer.future;
117 } 111 }
118 112
119
120 /** 113 /**
121 * A TestSuite represents a collection of tests. It creates a [TestCase] 114 * A TestSuite represents a collection of tests. It creates a [TestCase]
122 * object for each test to be run, and passes the test cases to a callback. 115 * object for each test to be run, and passes the test cases to a callback.
123 * 116 *
124 * Most TestSuites represent a directory or directory tree containing tests, 117 * Most TestSuites represent a directory or directory tree containing tests,
125 * and a status file containing the expected results when these tests are run. 118 * and a status file containing the expected results when these tests are run.
126 */ 119 */
127 abstract class TestSuite { 120 abstract class TestSuite {
128 final Map configuration; 121 final Map configuration;
129 final String suiteName; 122 final String suiteName;
130 // This function is set by subclasses before enqueueing starts. 123 // This function is set by subclasses before enqueueing starts.
131 Function doTest; 124 Function doTest;
132 Map<String, String> _environmentOverrides; 125 Map<String, String> _environmentOverrides;
133 126
134 TestSuite(this.configuration, this.suiteName) { 127 TestSuite(this.configuration, this.suiteName) {
135 TestUtils.buildDir(configuration); // Sets configuration_directory. 128 TestUtils.buildDir(configuration); // Sets configuration_directory.
136 if (configuration['configuration_directory'] != null) { 129 if (configuration['configuration_directory'] != null) {
137 _environmentOverrides = { 130 _environmentOverrides = {
138 'DART_CONFIGURATION' : configuration['configuration_directory'] 131 'DART_CONFIGURATION': configuration['configuration_directory']
139 }; 132 };
140 } 133 }
141 } 134 }
142 135
143 Map<String, String> get environmentOverrides => _environmentOverrides; 136 Map<String, String> get environmentOverrides => _environmentOverrides;
144 137
145 /** 138 /**
146 * Whether or not binaries should be found in the root build directory or 139 * Whether or not binaries should be found in the root build directory or
147 * in the built SDK. 140 * in the built SDK.
148 */ 141 */
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 if (!optionsName.isEmpty) { 345 if (!optionsName.isEmpty) {
353 testUniqueName = '$testUniqueName-$optionsName'; 346 testUniqueName = '$testUniqueName-$optionsName';
354 } 347 }
355 348
356 Path generatedTestPath = new Path(buildDir) 349 Path generatedTestPath = new Path(buildDir)
357 .append('generated_$name') 350 .append('generated_$name')
358 .append(dirname) 351 .append(dirname)
359 .append(testUniqueName); 352 .append(testUniqueName);
360 353
361 TestUtils.mkdirRecursive(new Path('.'), generatedTestPath); 354 TestUtils.mkdirRecursive(new Path('.'), generatedTestPath);
362 return new File(generatedTestPath.toNativePath()).absolute.path 355 return new File(generatedTestPath.toNativePath())
356 .absolute
357 .path
363 .replaceAll('\\', '/'); 358 .replaceAll('\\', '/');
364 } 359 }
365 360
366 String buildTestCaseDisplayName(Path suiteDir, 361 String buildTestCaseDisplayName(Path suiteDir, Path originTestPath,
367 Path originTestPath, 362 {String multitestName: ""}) {
368 {String multitestName: ""}) {
369 Path testNamePath = originTestPath.relativeTo(suiteDir); 363 Path testNamePath = originTestPath.relativeTo(suiteDir);
370 var directory = testNamePath.directoryPath; 364 var directory = testNamePath.directoryPath;
371 var filenameWithoutExt = testNamePath.filenameWithoutExtension; 365 var filenameWithoutExt = testNamePath.filenameWithoutExtension;
372 366
373 String concat(String base, String part) { 367 String concat(String base, String part) {
374 if (base == "") return part; 368 if (base == "") return part;
375 if (part == "") return base; 369 if (part == "") return base;
376 return "$base/$part"; 370 return "$base/$part";
377 } 371 }
378 372
379 var testName = "$directory"; 373 var testName = "$directory";
380 testName = concat(testName, "$filenameWithoutExt"); 374 testName = concat(testName, "$filenameWithoutExt");
381 testName = concat(testName, multitestName); 375 testName = concat(testName, multitestName);
382 return testName; 376 return testName;
383 } 377 }
384 378
385 /** 379 /**
386 * Create a directories for generated assets (tests, html files, 380 * Create a directories for generated assets (tests, html files,
387 * pubspec checkouts ...). 381 * pubspec checkouts ...).
388 */ 382 */
389 383
390 String createOutputDirectory(Path testPath, String optionsName) { 384 String createOutputDirectory(Path testPath, String optionsName) {
391 var checked = configuration['checked'] ? '-checked' : ''; 385 var checked = configuration['checked'] ? '-checked' : '';
392 var minified = configuration['minified'] ? '-minified' : ''; 386 var minified = configuration['minified'] ? '-minified' : '';
393 var sdk = configuration['use_sdk'] ? '-sdk' : ''; 387 var sdk = configuration['use_sdk'] ? '-sdk' : '';
394 var packages = configuration['use_public_packages'] 388 var packages =
395 ? '-public_packages' : ''; 389 configuration['use_public_packages'] ? '-public_packages' : '';
396 var dirName = "${configuration['compiler']}-${configuration['runtime']}" 390 var dirName = "${configuration['compiler']}-${configuration['runtime']}"
397 "$checked$minified$packages$sdk"; 391 "$checked$minified$packages$sdk";
398 return createGeneratedTestDirectoryHelper( 392 return createGeneratedTestDirectoryHelper(
399 "tests", dirName, testPath, optionsName); 393 "tests", dirName, testPath, optionsName);
400 } 394 }
401 395
402 String createCompilationOutputDirectory(Path testPath) { 396 String createCompilationOutputDirectory(Path testPath) {
403 var checked = configuration['checked'] ? '-checked' : ''; 397 var checked = configuration['checked'] ? '-checked' : '';
404 var minified = configuration['minified'] ? '-minified' : ''; 398 var minified = configuration['minified'] ? '-minified' : '';
405 var csp = configuration['csp'] ? '-csp' : ''; 399 var csp = configuration['csp'] ? '-csp' : '';
406 var sdk = configuration['use_sdk'] ? '-sdk' : ''; 400 var sdk = configuration['use_sdk'] ? '-sdk' : '';
407 var packages = configuration['use_public_packages'] 401 var packages =
408 ? '-public_packages' : ''; 402 configuration['use_public_packages'] ? '-public_packages' : '';
409 var dirName = "${configuration['compiler']}" 403 var dirName = "${configuration['compiler']}"
410 "$checked$minified$csp$packages$sdk"; 404 "$checked$minified$csp$packages$sdk";
411 return createGeneratedTestDirectoryHelper( 405 return createGeneratedTestDirectoryHelper(
412 "compilations", dirName, testPath, ""); 406 "compilations", dirName, testPath, "");
413 } 407 }
414 408
415 String createPubspecCheckoutDirectory(Path directoryOfPubspecYaml) { 409 String createPubspecCheckoutDirectory(Path directoryOfPubspecYaml) {
416 var sdk = configuration['use_sdk'] ? '-sdk' : ''; 410 var sdk = configuration['use_sdk'] ? '-sdk' : '';
417 var pkg = configuration['use_public_packages'] 411 var pkg = configuration['use_public_packages']
418 ? 'public_packages' : 'repo_packages'; 412 ? 'public_packages'
413 : 'repo_packages';
419 return createGeneratedTestDirectoryHelper( 414 return createGeneratedTestDirectoryHelper(
420 "pubspec_checkouts", '$pkg$sdk', directoryOfPubspecYaml, ""); 415 "pubspec_checkouts", '$pkg$sdk', directoryOfPubspecYaml, "");
421 } 416 }
422 417
423 String createPubPackageBuildsDirectory(Path directoryOfPubspecYaml) { 418 String createPubPackageBuildsDirectory(Path directoryOfPubspecYaml) {
424 var pkg = configuration['use_public_packages'] 419 var pkg = configuration['use_public_packages']
425 ? 'public_packages' : 'repo_packages'; 420 ? 'public_packages'
421 : 'repo_packages';
426 return createGeneratedTestDirectoryHelper( 422 return createGeneratedTestDirectoryHelper(
427 "pub_package_builds", pkg, directoryOfPubspecYaml, ""); 423 "pub_package_builds", pkg, directoryOfPubspecYaml, "");
428 } 424 }
429 425
430 /** 426 /**
431 * Helper function for discovering the packages in the dart repository. 427 * Helper function for discovering the packages in the dart repository.
432 */ 428 */
433 Future<List> listDir(Path path, Function isValid) { 429 Future<List> listDir(Path path, Function isValid) {
434 var dir = new Directory(path.toNativePath()); 430 var dir = new Directory(path.toNativePath());
435 return dir.exists().then((var exist) { 431 return dir.exists().then((var exist) {
436 if (!exist) return []; 432 if (!exist) return [];
437 return dir.list(recursive: false) 433 return dir
438 .where((fse) => fse is Directory) 434 .list(recursive: false)
439 .map((Directory directory) { 435 .where((fse) => fse is Directory)
440 var fullPath = directory.absolute.path; 436 .map((Directory directory) {
441 var packageName = new Path(fullPath).filename; 437 var fullPath = directory.absolute.path;
442 if (isValid(packageName)) { 438 var packageName = new Path(fullPath).filename;
443 return [packageName, path.append(packageName).toNativePath()]; 439 if (isValid(packageName)) {
444 } 440 return [packageName, path.append(packageName).toNativePath()];
445 return null; 441 }
446 }) 442 return null;
447 .where((name) => name != null) 443 })
448 .toList(); 444 .where((name) => name != null)
449 }); 445 .toList();
446 });
450 } 447 }
451 448
452 Future<Map> discoverPackagesInRepository() { 449 Future<Map> discoverPackagesInRepository() {
453 /* 450 /*
454 * Layout of packages inside the dart repository: 451 * Layout of packages inside the dart repository:
455 * dart/ 452 * dart/
456 * pkg/PACKAGE_NAME 453 * pkg/PACKAGE_NAME
457 * third_party/pkg/PACKAGE_NAME 454 * third_party/pkg/PACKAGE_NAME
458 * runtime/observatory/PACKAGE_NAME 455 * runtime/observatory/PACKAGE_NAME
459 * sdk/lib/_internal/PACKAGE_NAME 456 * sdk/lib/_internal/PACKAGE_NAME
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 return packageDirectories; 512 return packageDirectories;
516 }); 513 });
517 } 514 }
518 515
519 /** 516 /**
520 * Helper function for building dependency_overrides for pubspec.yaml files. 517 * Helper function for building dependency_overrides for pubspec.yaml files.
521 */ 518 */
522 Map buildPubspecDependencyOverrides(Map packageDirectories) { 519 Map buildPubspecDependencyOverrides(Map packageDirectories) {
523 Map overrides = {}; 520 Map overrides = {};
524 packageDirectories.forEach((String packageName, String fullPath) { 521 packageDirectories.forEach((String packageName, String fullPath) {
525 overrides[packageName] = { 'path' : fullPath }; 522 overrides[packageName] = {'path': fullPath};
526 }); 523 });
527 return overrides; 524 return overrides;
528 } 525 }
529
530 } 526 }
531 527
532
533 Future<Iterable<String>> ccTestLister(String runnerPath) { 528 Future<Iterable<String>> ccTestLister(String runnerPath) {
534 return Process.run(runnerPath, ["--list"]).then((ProcessResult result) { 529 return Process.run(runnerPath, ["--list"]).then((ProcessResult result) {
535 if (result.exitCode != 0) { 530 if (result.exitCode != 0) {
536 throw "Failed to list tests: '$runnerPath --list'. " 531 throw "Failed to list tests: '$runnerPath --list'. "
537 "Process exited with ${result.exitCode}"; 532 "Process exited with ${result.exitCode}";
538 } 533 }
539 return result.stdout 534 return result.stdout
540 .split('\n') 535 .split('\n')
541 .map((line) => line.trim()) 536 .map((line) => line.trim())
542 .where((name) => name.length > 0); 537 .where((name) => name.length > 0);
543 }); 538 });
544 } 539 }
545 540
546
547 /** 541 /**
548 * A specialized [TestSuite] that runs tests written in C to unit test 542 * A specialized [TestSuite] that runs tests written in C to unit test
549 * the Dart virtual machine and its API. 543 * the Dart virtual machine and its API.
550 * 544 *
551 * The tests are compiled into a monolithic executable by the build step. 545 * The tests are compiled into a monolithic executable by the build step.
552 * The executable lists its tests when run with the --list command line flag. 546 * The executable lists its tests when run with the --list command line flag.
553 * Individual tests are run by specifying them on the command line. 547 * Individual tests are run by specifying them on the command line.
554 */ 548 */
555 class CCTestSuite extends TestSuite { 549 class CCTestSuite extends TestSuite {
556 final String testPrefix; 550 final String testPrefix;
557 String targetRunnerPath; 551 String targetRunnerPath;
558 String hostRunnerPath; 552 String hostRunnerPath;
559 final String dartDir; 553 final String dartDir;
560 List<String> statusFilePaths; 554 List<String> statusFilePaths;
561 555
562 CCTestSuite(Map configuration, 556 CCTestSuite(Map configuration, String suiteName, String runnerName,
563 String suiteName, 557 this.statusFilePaths,
564 String runnerName, 558 {this.testPrefix: ''})
565 this.statusFilePaths,
566 {this.testPrefix: ''})
567 : super(configuration, suiteName), 559 : super(configuration, suiteName),
568 dartDir = TestUtils.dartDir.toNativePath() { 560 dartDir = TestUtils.dartDir.toNativePath() {
569 // For running the tests we use the given '$runnerName' binary 561 // For running the tests we use the given '$runnerName' binary
570 targetRunnerPath = '$buildDir/$runnerName'; 562 targetRunnerPath = '$buildDir/$runnerName';
571 563
572 // For listing the tests we use the '$runnerName.host' binary if it exists 564 // For listing the tests we use the '$runnerName.host' binary if it exists
573 // and use '$runnerName' if it doesn't. 565 // and use '$runnerName' if it doesn't.
574 var binarySuffix = Platform.operatingSystem == 'windows' ? '.exe' : ''; 566 var binarySuffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
575 var hostBinary = '$targetRunnerPath.host$binarySuffix'; 567 var hostBinary = '$targetRunnerPath.host$binarySuffix';
576 if (new File(hostBinary).existsSync()) { 568 if (new File(hostBinary).existsSync()) {
577 hostRunnerPath = hostBinary; 569 hostRunnerPath = hostBinary;
578 } else { 570 } else {
579 hostRunnerPath = targetRunnerPath; 571 hostRunnerPath = targetRunnerPath;
580 } 572 }
581 } 573 }
582 574
583 void testNameHandler(TestExpectations testExpectations, String testName) { 575 void testNameHandler(TestExpectations testExpectations, String testName) {
584 // Only run the tests that match the pattern. Use the name 576 // Only run the tests that match the pattern. Use the name
585 // "suiteName/testName" for cc tests. 577 // "suiteName/testName" for cc tests.
586 String constructedName = '$suiteName/$testPrefix$testName'; 578 String constructedName = '$suiteName/$testPrefix$testName';
587 579
588 var expectations = testExpectations.expectations( 580 var expectations = testExpectations.expectations('$testPrefix$testName');
589 '$testPrefix$testName');
590 581
591 var args = TestUtils.standardOptions(configuration); 582 var args = TestUtils.standardOptions(configuration);
592 args.add(testName); 583 args.add(testName);
593 584
594 var command = CommandBuilder.instance.getProcessCommand( 585 var command = CommandBuilder.instance.getProcessCommand(
595 'run_vm_unittest', targetRunnerPath, args, environmentOverrides); 586 'run_vm_unittest', targetRunnerPath, args, environmentOverrides);
596 enqueueNewTestCase( 587 enqueueNewTestCase(
597 new TestCase(constructedName, [command], configuration, expectations)); 588 new TestCase(constructedName, [command], configuration, expectations));
598 } 589 }
599 590
600 void forEachTest(Function onTest, Map testCache, [VoidFunction onDone]) { 591 void forEachTest(Function onTest, Map testCache, [VoidFunction onDone]) {
601 doTest = onTest; 592 doTest = onTest;
602 var statusFiles = 593 var statusFiles =
603 statusFilePaths.map((statusFile) => "$dartDir/$statusFile").toList(); 594 statusFilePaths.map((statusFile) => "$dartDir/$statusFile").toList();
604 595
605 ReadTestExpectations(statusFiles, configuration) 596 ReadTestExpectations(statusFiles, configuration)
606 .then((TestExpectations expectations) { 597 .then((TestExpectations expectations) {
607 ccTestLister(hostRunnerPath).then((Iterable<String> names) { 598 ccTestLister(hostRunnerPath).then((Iterable<String> names) {
608 names.forEach((testName) => testNameHandler(expectations, testName)); 599 names.forEach((testName) => testNameHandler(expectations, testName));
609 doTest = null; 600 doTest = null;
610 if (onDone != null) onDone(); 601 if (onDone != null) onDone();
611 }).catchError((error) { 602 }).catchError((error) {
612 print("Fatal error occured: $error"); 603 print("Fatal error occured: $error");
613 exit(1); 604 exit(1);
614 }); 605 });
615 }); 606 });
616 } 607 }
617 } 608 }
618 609
619
620 class TestInformation { 610 class TestInformation {
621 Path filePath; 611 Path filePath;
622 Path originTestPath; 612 Path originTestPath;
623 Map optionsFromFile; 613 Map optionsFromFile;
624 bool hasCompileError; 614 bool hasCompileError;
625 bool hasRuntimeError; 615 bool hasRuntimeError;
626 bool isNegativeIfChecked; 616 bool isNegativeIfChecked;
627 bool hasCompileErrorIfChecked; 617 bool hasCompileErrorIfChecked;
628 bool hasStaticWarning; 618 bool hasStaticWarning;
629 String multitestKey; 619 String multitestKey;
630 620
631 TestInformation(this.filePath, this.originTestPath, this.optionsFromFile, 621 TestInformation(
632 this.hasCompileError, this.hasRuntimeError, 622 this.filePath,
633 this.isNegativeIfChecked, this.hasCompileErrorIfChecked, 623 this.originTestPath,
634 this.hasStaticWarning, 624 this.optionsFromFile,
635 {this.multitestKey: ''}) { 625 this.hasCompileError,
626 this.hasRuntimeError,
627 this.isNegativeIfChecked,
628 this.hasCompileErrorIfChecked,
629 this.hasStaticWarning,
630 {this.multitestKey: ''}) {
636 assert(filePath.isAbsolute); 631 assert(filePath.isAbsolute);
637 } 632 }
638 } 633 }
639 634
640
641 class HtmlTestInformation extends TestInformation { 635 class HtmlTestInformation extends TestInformation {
642 List<String> expectedMessages; 636 List<String> expectedMessages;
643 List<String> scripts; 637 List<String> scripts;
644 638
645 HtmlTestInformation(Path filePath, this.expectedMessages, this.scripts) 639 HtmlTestInformation(Path filePath, this.expectedMessages, this.scripts)
646 : super(filePath, filePath, 640 : super(
647 {'isMultitest': false, 'isMultiHtmlTest': false}, 641 filePath,
648 false, false, false, false, false) {} 642 filePath,
643 {'isMultitest': false, 'isMultiHtmlTest': false},
644 false,
645 false,
646 false,
647 false,
648 false) {}
649 } 649 }
650 650
651
652 /** 651 /**
653 * A standard [TestSuite] implementation that searches for tests in a 652 * A standard [TestSuite] implementation that searches for tests in a
654 * directory, and creates [TestCase]s that compile and/or run them. 653 * directory, and creates [TestCase]s that compile and/or run them.
655 */ 654 */
656 class StandardTestSuite extends TestSuite { 655 class StandardTestSuite extends TestSuite {
657 final Path suiteDir; 656 final Path suiteDir;
658 final List<String> statusFilePaths; 657 final List<String> statusFilePaths;
659 TestExpectations testExpectations; 658 TestExpectations testExpectations;
660 List<TestInformation> cachedTests; 659 List<TestInformation> cachedTests;
661 final Path dartDir; 660 final Path dartDir;
662 Predicate<String> isTestFilePredicate; 661 Predicate<String> isTestFilePredicate;
663 final bool listRecursively; 662 final bool listRecursively;
664 final extraVmOptions; 663 final extraVmOptions;
665 List<Uri> _dart2JsBootstrapDependencies; 664 List<Uri> _dart2JsBootstrapDependencies;
666 665
667 StandardTestSuite(Map configuration, 666 StandardTestSuite(Map configuration, String suiteName, Path suiteDirectory,
668 String suiteName, 667 this.statusFilePaths,
669 Path suiteDirectory, 668 {this.isTestFilePredicate, bool recursive: false})
670 this.statusFilePaths,
671 {this.isTestFilePredicate,
672 bool recursive: false})
673 : super(configuration, suiteName), 669 : super(configuration, suiteName),
674 dartDir = TestUtils.dartDir, 670 dartDir = TestUtils.dartDir,
675 listRecursively = recursive, 671 listRecursively = recursive,
676 suiteDir = TestUtils.dartDir.join(suiteDirectory), 672 suiteDir = TestUtils.dartDir.join(suiteDirectory),
677 extraVmOptions = TestUtils.getExtraVmOptions(configuration) { 673 extraVmOptions = TestUtils.getExtraVmOptions(configuration) {
678 if (!useSdk) { 674 if (!useSdk) {
679 _dart2JsBootstrapDependencies = []; 675 _dart2JsBootstrapDependencies = [];
680 } else { 676 } else {
681 var snapshotPath = TestUtils.absolutePath(new Path(buildDir).join( 677 var snapshotPath = TestUtils
682 new Path('dart-sdk/bin/snapshots/' 678 .absolutePath(
683 'utils_wrapper.dart.snapshot'))).toString(); 679 new Path(buildDir).join(new Path('dart-sdk/bin/snapshots/'
684 _dart2JsBootstrapDependencies = 680 'utils_wrapper.dart.snapshot')))
685 [new Uri(scheme: 'file', path: snapshotPath)]; 681 .toString();
682 _dart2JsBootstrapDependencies = [
683 new Uri(scheme: 'file', path: snapshotPath)
684 ];
686 } 685 }
687 } 686 }
688 687
689 /** 688 /**
690 * Creates a test suite whose file organization matches an expected structure. 689 * Creates a test suite whose file organization matches an expected structure.
691 * To use this, your suite should look like: 690 * To use this, your suite should look like:
692 * 691 *
693 * dart/ 692 * dart/
694 * path/ 693 * path/
695 * to/ 694 * to/
(...skipping 12 matching lines...) Expand all
708 * If you follow that convention, then you can construct one of these like: 707 * If you follow that convention, then you can construct one of these like:
709 * 708 *
710 * new StandardTestSuite.forDirectory(configuration, 'path/to/mytestsuite'); 709 * new StandardTestSuite.forDirectory(configuration, 'path/to/mytestsuite');
711 * 710 *
712 * instead of having to create a custom [StandardTestSuite] subclass. In 711 * instead of having to create a custom [StandardTestSuite] subclass. In
713 * particular, if you add 'path/to/mytestsuite' to [TEST_SUITE_DIRECTORIES] 712 * particular, if you add 'path/to/mytestsuite' to [TEST_SUITE_DIRECTORIES]
714 * in test.dart, this will all be set up for you. 713 * in test.dart, this will all be set up for you.
715 */ 714 */
716 factory StandardTestSuite.forDirectory(Map configuration, Path directory) { 715 factory StandardTestSuite.forDirectory(Map configuration, Path directory) {
717 var name = directory.filename; 716 var name = directory.filename;
718 var status_paths = ['$directory/$name.status', 717 var status_paths = [
719 '$directory/.status', 718 '$directory/$name.status',
720 '$directory/${name}_dart2js.status', 719 '$directory/.status',
721 '$directory/${name}_analyzer2.status']; 720 '$directory/${name}_dart2js.status',
721 '$directory/${name}_analyzer2.status'
722 ];
722 723
723 return new StandardTestSuite(configuration, 724 return new StandardTestSuite(configuration, name, directory, status_paths,
724 name, directory,
725 status_paths,
726 isTestFilePredicate: (filename) => filename.endsWith('_test.dart'), 725 isTestFilePredicate: (filename) => filename.endsWith('_test.dart'),
727 recursive: true); 726 recursive: true);
728 } 727 }
729 728
730 List<Uri> get dart2JsBootstrapDependencies => _dart2JsBootstrapDependencies; 729 List<Uri> get dart2JsBootstrapDependencies => _dart2JsBootstrapDependencies;
731 730
732 /** 731 /**
733 * The default implementation assumes a file is a test if 732 * The default implementation assumes a file is a test if
734 * it ends in "Test.dart". 733 * it ends in "Test.dart".
735 */ 734 */
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 return new Future.value(null); 815 return new Future.value(null);
817 } else { 816 } else {
818 var group = new FutureGroup(); 817 var group = new FutureGroup();
819 enqueueDirectory(dir, group); 818 enqueueDirectory(dir, group);
820 return group.future; 819 return group.future;
821 } 820 }
822 }); 821 });
823 } 822 }
824 823
825 void enqueueDirectory(Directory dir, FutureGroup group) { 824 void enqueueDirectory(Directory dir, FutureGroup group) {
826 var lister = dir.list(recursive: listRecursively) 825 var lister = dir
826 .list(recursive: listRecursively)
827 .where((fse) => fse is File) 827 .where((fse) => fse is File)
828 .forEach((File f) { 828 .forEach((File f) {
829 enqueueFile(f.path, group); 829 enqueueFile(f.path, group);
830 }); 830 });
831 group.add(lister); 831 group.add(lister);
832 } 832 }
833 833
834 void enqueueFile(String filename, FutureGroup group) { 834 void enqueueFile(String filename, FutureGroup group) {
835 if (isHtmlTestFile(filename)) { 835 if (isHtmlTestFile(filename)) {
836 var info = htmlTest.getInformation(filename); 836 var info = htmlTest.getInformation(filename);
837 if (info == null) { 837 if (info == null) {
838 DebugLogger.error( 838 DebugLogger
839 "HtmlTest $filename does not contain required annotations"); 839 .error("HtmlTest $filename does not contain required annotations");
840 return; 840 return;
841 } 841 }
842 cachedTests.add(info); 842 cachedTests.add(info);
843 enqueueTestCaseFromTestInformation(info); 843 enqueueTestCaseFromTestInformation(info);
844 return; 844 return;
845 } 845 }
846 if (!isTestFile(filename)) return; 846 if (!isTestFile(filename)) return;
847 Path filePath = new Path(filename); 847 Path filePath = new Path(filename);
848 848
849 var optionsFromFile = readOptionsFromFile(filePath); 849 var optionsFromFile = readOptionsFromFile(filePath);
850 CreateTest createTestCase = makeTestCaseCreator(optionsFromFile); 850 CreateTest createTestCase = makeTestCaseCreator(optionsFromFile);
851 851
852 if (optionsFromFile['isMultitest']) { 852 if (optionsFromFile['isMultitest']) {
853 group.add(doMultitest(filePath, buildDir, suiteDir, createTestCase)); 853 group.add(doMultitest(filePath, buildDir, suiteDir, createTestCase));
854 } else { 854 } else {
855 createTestCase(filePath, 855 createTestCase(filePath, filePath, optionsFromFile['hasCompileError'],
856 filePath, 856 optionsFromFile['hasRuntimeError'],
857 optionsFromFile['hasCompileError'], 857 hasStaticWarning: optionsFromFile['hasStaticWarning']);
858 optionsFromFile['hasRuntimeError'],
859 hasStaticWarning: optionsFromFile['hasStaticWarning']);
860 } 858 }
861 } 859 }
862 860
863 static Path _findPubspecYamlFile(Path filePath) { 861 static Path _findPubspecYamlFile(Path filePath) {
864 final existsCache = TestUtils.existsCache; 862 final existsCache = TestUtils.existsCache;
865 863
866 Path root = TestUtils.dartDir; 864 Path root = TestUtils.dartDir;
867 assert ("$filePath".startsWith("$root")); 865 assert("$filePath".startsWith("$root"));
868 866
869 // We start with the parent directory of [filePath] and go up until 867 // We start with the parent directory of [filePath] and go up until
870 // the root directory (excluding the root). 868 // the root directory (excluding the root).
871 List<String> segments = 869 List<String> segments = filePath.directoryPath.relativeTo(root).segments();
872 filePath.directoryPath.relativeTo(root).segments();
873 while (segments.length > 0) { 870 while (segments.length > 0) {
874 var pubspecYamlPath = 871 var pubspecYamlPath = new Path(segments.join('/')).append('pubspec.yaml');
875 new Path(segments.join('/')).append('pubspec.yaml');
876 if (existsCache.doesFileExist(pubspecYamlPath.toNativePath())) { 872 if (existsCache.doesFileExist(pubspecYamlPath.toNativePath())) {
877 return root.join(pubspecYamlPath); 873 return root.join(pubspecYamlPath);
878 } 874 }
879 segments.removeLast(); 875 segments.removeLast();
880 } 876 }
881 return null; 877 return null;
882 } 878 }
883 879
884 void enqueueTestCaseFromTestInformation(TestInformation info) { 880 void enqueueTestCaseFromTestInformation(TestInformation info) {
885 String testName = buildTestCaseDisplayName(suiteDir, info.originTestPath, 881 String testName = buildTestCaseDisplayName(suiteDir, info.originTestPath,
886 multitestName: 882 multitestName:
887 info.optionsFromFile['isMultitest'] ? info.multitestKey : ""); 883 info.optionsFromFile['isMultitest'] ? info.multitestKey : "");
888 Set<Expectation> expectations = testExpectations.expectations(testName); 884 Set<Expectation> expectations = testExpectations.expectations(testName);
889 if (info is HtmlTestInformation) { 885 if (info is HtmlTestInformation) {
890 enqueueHtmlTest(info, testName, expectations); 886 enqueueHtmlTest(info, testName, expectations);
891 return; 887 return;
892 } 888 }
893 var filePath = info.filePath; 889 var filePath = info.filePath;
894 var optionsFromFile = info.optionsFromFile; 890 var optionsFromFile = info.optionsFromFile;
895 891
896 Map buildSpecialPackageRoot(Path pubspecYamlFile) { 892 Map buildSpecialPackageRoot(Path pubspecYamlFile) {
897 var commands = <Command>[]; 893 var commands = <Command>[];
898 var packageDir = pubspecYamlFile.directoryPath; 894 var packageDir = pubspecYamlFile.directoryPath;
899 var packageName = packageDir.filename; 895 var packageName = packageDir.filename;
900 896
901 var checkoutDirectory = 897 var checkoutDirectory = createPubspecCheckoutDirectory(packageDir);
902 createPubspecCheckoutDirectory(packageDir);
903 var modifiedYamlFile = new Path(checkoutDirectory).append("pubspec.yaml"); 898 var modifiedYamlFile = new Path(checkoutDirectory).append("pubspec.yaml");
904 var pubCacheDirectory = new Path(checkoutDirectory).append("pub-cache"); 899 var pubCacheDirectory = new Path(checkoutDirectory).append("pub-cache");
905 var newPackageRoot = new Path(checkoutDirectory).append("packages"); 900 var newPackageRoot = new Path(checkoutDirectory).append("packages");
906 901
907 // Remove the old packages directory, so we can do a clean 'pub get'. 902 // Remove the old packages directory, so we can do a clean 'pub get'.
908 var newPackagesDirectory = new Directory(newPackageRoot.toNativePath()); 903 var newPackagesDirectory = new Directory(newPackageRoot.toNativePath());
909 if (newPackagesDirectory.existsSync()) { 904 if (newPackagesDirectory.existsSync()) {
910 newPackagesDirectory.deleteSync(recursive: true); 905 newPackagesDirectory.deleteSync(recursive: true);
911 } 906 }
912 907
913 // NOTE: We make a link in the package-root to [packageName], since 908 // NOTE: We make a link in the package-root to [packageName], since
914 // 'pub get' doesn't create the link to the package containing 909 // 'pub get' doesn't create the link to the package containing
915 // pubspec.yaml if there is no lib directory. 910 // pubspec.yaml if there is no lib directory.
916 var packageLink = newPackageRoot.append(packageName); 911 var packageLink = newPackageRoot.append(packageName);
917 var packageLinkTarget = packageDir.append('lib'); 912 var packageLinkTarget = packageDir.append('lib');
918 913
919 // NOTE: We make a link in the package-root to pkg/expect, since 914 // NOTE: We make a link in the package-root to pkg/expect, since
920 // 'package:expect' is not available on pub.dartlang.org! 915 // 'package:expect' is not available on pub.dartlang.org!
921 var expectLink = newPackageRoot.append('expect'); 916 var expectLink = newPackageRoot.append('expect');
922 var expectLinkTarget = TestUtils.dartDir 917 var expectLinkTarget =
923 .append('pkg').append('expect').append('lib'); 918 TestUtils.dartDir.append('pkg').append('expect').append('lib');
924 919
925 // Generate dependency overrides if we use repository packages. 920 // Generate dependency overrides if we use repository packages.
926 var packageDirectories = {}; 921 var packageDirectories = {};
927 if (configuration['use_repository_packages']) { 922 if (configuration['use_repository_packages']) {
928 packageDirectories = new Map.from(localPackageDirectories); 923 packageDirectories = new Map.from(localPackageDirectories);
929 924
930 // Don't create a dependency override for pub, since it's an application 925 // Don't create a dependency override for pub, since it's an application
931 // package and it has a dependency on compiler_unsupported which isn't 926 // package and it has a dependency on compiler_unsupported which isn't
932 // in the repo. 927 // in the repo.
933 packageDirectories.remove('pub'); 928 packageDirectories.remove('pub');
(...skipping 10 matching lines...) Expand all
944 destinationFile: modifiedYamlFile.toNativePath())); 939 destinationFile: modifiedYamlFile.toNativePath()));
945 commands.add(CommandBuilder.instance.getPubCommand( 940 commands.add(CommandBuilder.instance.getPubCommand(
946 "get", pubPath, checkoutDirectory, pubCacheDirectory.toNativePath())); 941 "get", pubPath, checkoutDirectory, pubCacheDirectory.toNativePath()));
947 if (new Directory(packageLinkTarget.toNativePath()).existsSync()) { 942 if (new Directory(packageLinkTarget.toNativePath()).existsSync()) {
948 commands.add(CommandBuilder.instance.getMakeSymlinkCommand( 943 commands.add(CommandBuilder.instance.getMakeSymlinkCommand(
949 packageLink.toNativePath(), packageLinkTarget.toNativePath())); 944 packageLink.toNativePath(), packageLinkTarget.toNativePath()));
950 } 945 }
951 commands.add(CommandBuilder.instance.getMakeSymlinkCommand( 946 commands.add(CommandBuilder.instance.getMakeSymlinkCommand(
952 expectLink.toNativePath(), expectLinkTarget.toNativePath())); 947 expectLink.toNativePath(), expectLinkTarget.toNativePath()));
953 948
954 return { 949 return {'commands': commands, 'package-root': newPackageRoot,};
955 'commands' : commands,
956 'package-root' : newPackageRoot,
957 };
958 } 950 }
959 951
960 // If this test is inside a package, we will check if there is a 952 // If this test is inside a package, we will check if there is a
961 // pubspec.yaml file and if so, create a custom package root for it. 953 // pubspec.yaml file and if so, create a custom package root for it.
962 List<Command> baseCommands = <Command>[]; 954 List<Command> baseCommands = <Command>[];
963 Path packageRoot; 955 Path packageRoot;
964 if (configuration['use_repository_packages'] || 956 if (configuration['use_repository_packages'] ||
965 configuration['use_public_packages']) { 957 configuration['use_public_packages']) {
966 Path pubspecYamlFile = _findPubspecYamlFile(filePath); 958 Path pubspecYamlFile = _findPubspecYamlFile(filePath);
967 if (pubspecYamlFile != null) { 959 if (pubspecYamlFile != null) {
(...skipping 28 matching lines...) Expand all
996 multiHtmlTestExpectations[fullTestName] = 988 multiHtmlTestExpectations[fullTestName] =
997 testExpectations.expectations(fullTestName); 989 testExpectations.expectations(fullTestName);
998 } 990 }
999 enqueueBrowserTest(baseCommands, packageRoot, info, testName, 991 enqueueBrowserTest(baseCommands, packageRoot, info, testName,
1000 multiHtmlTestExpectations); 992 multiHtmlTestExpectations);
1001 } else { 993 } else {
1002 enqueueBrowserTest( 994 enqueueBrowserTest(
1003 baseCommands, packageRoot, info, testName, expectations); 995 baseCommands, packageRoot, info, testName, expectations);
1004 } 996 }
1005 } else { 997 } else {
1006 enqueueStandardTest( 998 enqueueStandardTest(baseCommands, info, testName, expectations);
1007 baseCommands, info, testName, expectations);
1008 } 999 }
1009 } 1000 }
1010 1001
1011 void enqueueStandardTest(List<Command> baseCommands, 1002 void enqueueStandardTest(List<Command> baseCommands, TestInformation info,
1012 TestInformation info, 1003 String testName, Set<Expectation> expectations) {
1013 String testName, 1004 var commonArguments =
1014 Set<Expectation> expectations) { 1005 commonArgumentsFromFile(info.filePath, info.optionsFromFile);
1015 var commonArguments = commonArgumentsFromFile(info.filePath,
1016 info.optionsFromFile);
1017 1006
1018 List<List<String>> vmOptionsList = getVmOptions(info.optionsFromFile); 1007 List<List<String>> vmOptionsList = getVmOptions(info.optionsFromFile);
1019 assert(!vmOptionsList.isEmpty); 1008 assert(!vmOptionsList.isEmpty);
1020 1009
1021 for (var vmOptionsVarient = 0; 1010 for (var vmOptionsVarient = 0;
1022 vmOptionsVarient < vmOptionsList.length; 1011 vmOptionsVarient < vmOptionsList.length;
1023 vmOptionsVarient++) { 1012 vmOptionsVarient++) {
1024 var vmOptions = vmOptionsList[vmOptionsVarient]; 1013 var vmOptions = vmOptionsList[vmOptionsVarient];
1025 var allVmOptions = vmOptions; 1014 var allVmOptions = vmOptions;
1026 if (!extraVmOptions.isEmpty) { 1015 if (!extraVmOptions.isEmpty) {
1027 allVmOptions = new List.from(vmOptions)..addAll(extraVmOptions); 1016 allVmOptions = new List.from(vmOptions)..addAll(extraVmOptions);
1028 } 1017 }
1029 1018
1030 var commands = []..addAll(baseCommands); 1019 var commands = []..addAll(baseCommands);
1031 commands.addAll(makeCommands(info, vmOptionsVarient, 1020 commands.addAll(
1032 allVmOptions, commonArguments)); 1021 makeCommands(info, vmOptionsVarient, allVmOptions, commonArguments));
1033 enqueueNewTestCase( 1022 enqueueNewTestCase(new TestCase(
1034 new TestCase('$suiteName/$testName', 1023 '$suiteName/$testName', commands, configuration, expectations,
1035 commands, 1024 isNegative: isNegative(info), info: info));
1036 configuration,
1037 expectations,
1038 isNegative: isNegative(info),
1039 info: info));
1040 } 1025 }
1041 } 1026 }
1042 1027
1043 bool expectCompileError(TestInformation info) { 1028 bool expectCompileError(TestInformation info) {
1044 return info.hasCompileError || 1029 return info.hasCompileError ||
1045 (configuration['checked'] && info.hasCompileErrorIfChecked); 1030 (configuration['checked'] && info.hasCompileErrorIfChecked);
1046 } 1031 }
1047 1032
1048 bool isNegative(TestInformation info) { 1033 bool isNegative(TestInformation info) {
1049 bool negative = expectCompileError(info) || 1034 bool negative = expectCompileError(info) ||
1050 (configuration['checked'] && info.isNegativeIfChecked); 1035 (configuration['checked'] && info.isNegativeIfChecked);
1051 if (info.hasRuntimeError && hasRuntime) { 1036 if (info.hasRuntimeError && hasRuntime) {
1052 negative = true; 1037 negative = true;
1053 } 1038 }
1054 return negative; 1039 return negative;
1055 } 1040 }
1056 1041
1057 List<Command> makeCommands(TestInformation info, 1042 List<Command> makeCommands(
1058 int vmOptionsVarient, 1043 TestInformation info, int vmOptionsVarient, var vmOptions, var args) {
1059 var vmOptions,
1060 var args) {
1061 List<Command> commands = <Command>[]; 1044 List<Command> commands = <Command>[];
1062 CompilerConfiguration compilerConfiguration = 1045 CompilerConfiguration compilerConfiguration =
1063 new CompilerConfiguration(configuration); 1046 new CompilerConfiguration(configuration);
1064 List<String> sharedOptions = info.optionsFromFile['sharedOptions']; 1047 List<String> sharedOptions = info.optionsFromFile['sharedOptions'];
1065 1048
1066 List<String> compileTimeArguments = <String>[]; 1049 List<String> compileTimeArguments = <String>[];
1067 String tempDir; 1050 String tempDir;
1068 if (compilerConfiguration.hasCompiler) { 1051 if (compilerConfiguration.hasCompiler) {
1069 compileTimeArguments = 1052 compileTimeArguments = compilerConfiguration.computeCompilerArguments(
1070 compilerConfiguration.computeCompilerArguments(vmOptions, 1053 vmOptions, sharedOptions, args);
1071 sharedOptions,
1072 args);
1073 // Avoid doing this for analyzer. 1054 // Avoid doing this for analyzer.
1074 var path = info.filePath; 1055 var path = info.filePath;
1075 if (vmOptionsVarient != 0) { 1056 if (vmOptionsVarient != 0) {
1076 // Ensure a unique directory for each test case. 1057 // Ensure a unique directory for each test case.
1077 path = path.join(new Path(vmOptionsVarient.toString())); 1058 path = path.join(new Path(vmOptionsVarient.toString()));
1078 } 1059 }
1079 tempDir = createCompilationOutputDirectory(path); 1060 tempDir = createCompilationOutputDirectory(path);
1080 } 1061 }
1081 1062
1082 CommandArtifact compilationArtifact = 1063 CommandArtifact compilationArtifact =
(...skipping 11 matching lines...) Expand all
1094 return commands; 1075 return commands;
1095 } 1076 }
1096 1077
1097 RuntimeConfiguration runtimeConfiguration = 1078 RuntimeConfiguration runtimeConfiguration =
1098 new RuntimeConfiguration(configuration); 1079 new RuntimeConfiguration(configuration);
1099 List<String> runtimeArguments = 1080 List<String> runtimeArguments =
1100 compilerConfiguration.computeRuntimeArguments( 1081 compilerConfiguration.computeRuntimeArguments(
1101 runtimeConfiguration, 1082 runtimeConfiguration,
1102 buildDir, 1083 buildDir,
1103 info, 1084 info,
1104 vmOptions, sharedOptions, args, 1085 vmOptions,
1086 sharedOptions,
1087 args,
1105 compilationArtifact); 1088 compilationArtifact);
1106 1089
1107 return commands 1090 return commands
1108 ..addAll( 1091 ..addAll(runtimeConfiguration.computeRuntimeCommands(
1109 runtimeConfiguration.computeRuntimeCommands( 1092 this,
1110 this, 1093 CommandBuilder.instance,
1111 CommandBuilder.instance, 1094 compilationArtifact,
1112 compilationArtifact, 1095 runtimeArguments,
1113 runtimeArguments, 1096 environmentOverrides));
1114 environmentOverrides));
1115 } 1097 }
1116 1098
1117 CreateTest makeTestCaseCreator(Map optionsFromFile) { 1099 CreateTest makeTestCaseCreator(Map optionsFromFile) {
1118 return (Path filePath, 1100 return (Path filePath, Path originTestPath, bool hasCompileError,
1119 Path originTestPath, 1101 bool hasRuntimeError,
1120 bool hasCompileError, 1102 {bool isNegativeIfChecked: false,
1121 bool hasRuntimeError, 1103 bool hasCompileErrorIfChecked: false,
1122 {bool isNegativeIfChecked: false, 1104 bool hasStaticWarning: false,
1123 bool hasCompileErrorIfChecked: false, 1105 String multitestKey}) {
1124 bool hasStaticWarning: false,
1125 String multitestKey}) {
1126 // Cache the test information for each test case. 1106 // Cache the test information for each test case.
1127 var info = new TestInformation(filePath, 1107 var info = new TestInformation(
1128 originTestPath, 1108 filePath,
1129 optionsFromFile, 1109 originTestPath,
1130 hasCompileError, 1110 optionsFromFile,
1131 hasRuntimeError, 1111 hasCompileError,
1132 isNegativeIfChecked, 1112 hasRuntimeError,
1133 hasCompileErrorIfChecked, 1113 isNegativeIfChecked,
1134 hasStaticWarning, 1114 hasCompileErrorIfChecked,
1135 multitestKey: multitestKey); 1115 hasStaticWarning,
1116 multitestKey: multitestKey);
1136 cachedTests.add(info); 1117 cachedTests.add(info);
1137 enqueueTestCaseFromTestInformation(info); 1118 enqueueTestCaseFromTestInformation(info);
1138 }; 1119 };
1139 } 1120 }
1140 1121
1141 /** 1122 /**
1142 * _createUrlPathFromFile takes a [file], which is either located in the dart 1123 * _createUrlPathFromFile takes a [file], which is either located in the dart
1143 * or in the build directory, and will return a String representing 1124 * or in the build directory, and will return a String representing
1144 * the relative path to either the dart or the build directory. 1125 * the relative path to either the dart or the build directory.
1145 * Thus, the returned [String] will be the path component of the URL 1126 * Thus, the returned [String] will be the path component of the URL
(...skipping 26 matching lines...) Expand all
1172 if (configuration['list']) { 1153 if (configuration['list']) {
1173 return Uri.parse('http://listing_the_tests_only'); 1154 return Uri.parse('http://listing_the_tests_only');
1174 } 1155 }
1175 assert(configuration.containsKey('_servers_')); 1156 assert(configuration.containsKey('_servers_'));
1176 int serverPort = configuration['_servers_'].port; 1157 int serverPort = configuration['_servers_'].port;
1177 int crossOriginPort = configuration['_servers_'].crossOriginPort; 1158 int crossOriginPort = configuration['_servers_'].crossOriginPort;
1178 Map parameters = {'crossOriginPort': crossOriginPort.toString()}; 1159 Map parameters = {'crossOriginPort': crossOriginPort.toString()};
1179 if (subtestName != null) { 1160 if (subtestName != null) {
1180 parameters['group'] = subtestName; 1161 parameters['group'] = subtestName;
1181 } 1162 }
1182 return new Uri(scheme: 'http', 1163 return new Uri(
1183 host: configuration['local_ip'], 1164 scheme: 'http',
1184 port: serverPort, 1165 host: configuration['local_ip'],
1185 path: pathComponent, 1166 port: serverPort,
1186 queryParameters: parameters); 1167 path: pathComponent,
1168 queryParameters: parameters);
1187 } 1169 }
1188 1170
1189 void _createWrapperFile(String dartWrapperFilename, 1171 void _createWrapperFile(
1190 Path localDartLibraryFilename) { 1172 String dartWrapperFilename, Path localDartLibraryFilename) {
1191 File file = new File(dartWrapperFilename); 1173 File file = new File(dartWrapperFilename);
1192 RandomAccessFile dartWrapper = file.openSync(mode: FileMode.WRITE); 1174 RandomAccessFile dartWrapper = file.openSync(mode: FileMode.WRITE);
1193 1175
1194 var libraryPathComponent = _createUrlPathFromFile(localDartLibraryFilename); 1176 var libraryPathComponent = _createUrlPathFromFile(localDartLibraryFilename);
1195 var generatedSource = dartTestWrapper(libraryPathComponent); 1177 var generatedSource = dartTestWrapper(libraryPathComponent);
1196 dartWrapper.writeStringSync(generatedSource); 1178 dartWrapper.writeStringSync(generatedSource);
1197 dartWrapper.closeSync(); 1179 dartWrapper.closeSync();
1198 } 1180 }
1199 1181
1200 /** 1182 /**
1201 * The [StandardTestSuite] has support for tests that 1183 * The [StandardTestSuite] has support for tests that
1202 * compile a test from Dart to JavaScript, and then run the resulting 1184 * compile a test from Dart to JavaScript, and then run the resulting
1203 * JavaScript. This function creates a working directory to hold the 1185 * JavaScript. This function creates a working directory to hold the
1204 * JavaScript version of the test, and copies the appropriate framework 1186 * JavaScript version of the test, and copies the appropriate framework
1205 * files to that directory. It creates a [BrowserTestCase], which has 1187 * files to that directory. It creates a [BrowserTestCase], which has
1206 * two sequential steps to be run by the [ProcessQueue] when the test is 1188 * two sequential steps to be run by the [ProcessQueue] when the test is
1207 * executed: a compilation step and an execution step, both with the 1189 * executed: a compilation step and an execution step, both with the
1208 * appropriate executable and arguments. The [expectations] object can be 1190 * appropriate executable and arguments. The [expectations] object can be
1209 * either a Set<String> if the test is a regular test, or a Map<String 1191 * either a Set<String> if the test is a regular test, or a Map<String
1210 * subTestName, Set<String>> if we are running a browser multi-test (one 1192 * subTestName, Set<String>> if we are running a browser multi-test (one
1211 * compilation and many browser runs). 1193 * compilation and many browser runs).
1212 */ 1194 */
1213 void enqueueBrowserTest( 1195 void enqueueBrowserTest(List<Command> baseCommands, Path packageRoot,
1214 List<Command> baseCommands, 1196 TestInformation info, String testName, expectations) {
1215 Path packageRoot,
1216 TestInformation info,
1217 String testName,
1218 expectations) {
1219 RegExp badChars = new RegExp('[-=/]'); 1197 RegExp badChars = new RegExp('[-=/]');
1220 List VmOptionsList = getVmOptions(info.optionsFromFile); 1198 List VmOptionsList = getVmOptions(info.optionsFromFile);
1221 bool multipleOptions = VmOptionsList.length > 1; 1199 bool multipleOptions = VmOptionsList.length > 1;
1222 for (var vmOptions in VmOptionsList) { 1200 for (var vmOptions in VmOptionsList) {
1223 String optionsName = 1201 String optionsName =
1224 multipleOptions ? vmOptions.join('-').replaceAll(badChars, '') : ''; 1202 multipleOptions ? vmOptions.join('-').replaceAll(badChars, '') : '';
1225 String tempDir = createOutputDirectory(info.filePath, optionsName); 1203 String tempDir = createOutputDirectory(info.filePath, optionsName);
1226 enqueueBrowserTestWithOptions( 1204 enqueueBrowserTestWithOptions(baseCommands, packageRoot, info, testName,
1227 baseCommands, 1205 expectations, vmOptions, tempDir);
1228 packageRoot,
1229 info,
1230 testName,
1231 expectations,
1232 vmOptions,
1233 tempDir);
1234 } 1206 }
1235 } 1207 }
1236 1208
1237
1238 void enqueueBrowserTestWithOptions( 1209 void enqueueBrowserTestWithOptions(
1239 List<Command> baseCommands, 1210 List<Command> baseCommands,
1240 Path packageRoot, 1211 Path packageRoot,
1241 TestInformation info, 1212 TestInformation info,
1242 String testName, 1213 String testName,
1243 expectations, 1214 expectations,
1244 List<String> vmOptions, 1215 List<String> vmOptions,
1245 String tempDir) { 1216 String tempDir) {
1246 // TODO(Issue 14651): If we're on dartium, we need to pass [packageRoot] 1217 // TODO(Issue 14651): If we're on dartium, we need to pass [packageRoot]
1247 // on to the browser (it may be test specific). 1218 // on to the browser (it may be test specific).
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 scriptPath = compiledDartWrapperFilename; 1301 scriptPath = compiledDartWrapperFilename;
1331 } 1302 }
1332 scriptPath = _createUrlPathFromFile(new Path(scriptPath)); 1303 scriptPath = _createUrlPathFromFile(new Path(scriptPath));
1333 1304
1334 content = getHtmlContents(filename, scriptType, new Path("$scriptPath")); 1305 content = getHtmlContents(filename, scriptType, new Path("$scriptPath"));
1335 htmlTest.writeStringSync(content); 1306 htmlTest.writeStringSync(content);
1336 htmlTest.closeSync(); 1307 htmlTest.closeSync();
1337 } 1308 }
1338 1309
1339 if (compiler != 'none') { 1310 if (compiler != 'none') {
1340 commands.add( 1311 commands.add(_compileCommand(dartWrapperFilename,
1341 _compileCommand( 1312 compiledDartWrapperFilename, compiler, tempDir, optionsFromFile));
1342 dartWrapperFilename,
1343 compiledDartWrapperFilename,
1344 compiler,
1345 tempDir,
1346 optionsFromFile));
1347 } 1313 }
1348 1314
1349 // some tests require compiling multiple input scripts. 1315 // some tests require compiling multiple input scripts.
1350 List<String> otherScripts = optionsFromFile['otherScripts']; 1316 List<String> otherScripts = optionsFromFile['otherScripts'];
1351 for (String name in otherScripts) { 1317 for (String name in otherScripts) {
1352 Path namePath = new Path(name); 1318 Path namePath = new Path(name);
1353 String fileName = namePath.filename; 1319 String fileName = namePath.filename;
1354 Path fromPath = filePath.directoryPath.join(namePath); 1320 Path fromPath = filePath.directoryPath.join(namePath);
1355 if (compiler != 'none') { 1321 if (compiler != 'none') {
1356 assert(namePath.extension == 'dart'); 1322 assert(namePath.extension == 'dart');
1357 commands.add( 1323 commands.add(_compileCommand(fromPath.toNativePath(),
1358 _compileCommand( 1324 '$tempDir/$fileName.js', compiler, tempDir, optionsFromFile));
1359 fromPath.toNativePath(),
1360 '$tempDir/$fileName.js',
1361 compiler,
1362 tempDir,
1363 optionsFromFile));
1364 } 1325 }
1365 if (compiler == 'none') { 1326 if (compiler == 'none') {
1366 // For the tests that require multiple input scripts but are not 1327 // For the tests that require multiple input scripts but are not
1367 // compiled, move the input scripts over with the script so they can 1328 // compiled, move the input scripts over with the script so they can
1368 // be accessed. 1329 // be accessed.
1369 String result = new File(fromPath.toNativePath()).readAsStringSync(); 1330 String result = new File(fromPath.toNativePath()).readAsStringSync();
1370 new File('$tempDir/$fileName').writeAsStringSync(result); 1331 new File('$tempDir/$fileName').writeAsStringSync(result);
1371 } 1332 }
1372 } 1333 }
1373 1334
1374
1375 // Variables for browser multi-tests. 1335 // Variables for browser multi-tests.
1376 bool multitest = info.optionsFromFile['isMultiHtmlTest']; 1336 bool multitest = info.optionsFromFile['isMultiHtmlTest'];
1377 List<String> subtestNames = 1337 List<String> subtestNames =
1378 multitest ? info.optionsFromFile['subtestNames'] : [null]; 1338 multitest ? info.optionsFromFile['subtestNames'] : [null];
1379 for (String subtestName in subtestNames) { 1339 for (String subtestName in subtestNames) {
1380 // Construct the command that executes the browser test 1340 // Construct the command that executes the browser test
1381 List<Command> commandSet = new List<Command>.from(commands); 1341 List<Command> commandSet = new List<Command>.from(commands);
1382 1342
1383 var htmlPath_subtest = _createUrlPathFromFile(new Path(htmlPath)); 1343 var htmlPath_subtest = _createUrlPathFromFile(new Path(htmlPath));
1384 var fullHtmlPath = 1344 var fullHtmlPath =
1385 _getUriForBrowserTest(htmlPath_subtest, subtestName).toString(); 1345 _getUriForBrowserTest(htmlPath_subtest, subtestName).toString();
1386 1346
1387 if (runtime == "drt") { 1347 if (runtime == "drt") {
1388 var dartFlags = []; 1348 var dartFlags = [];
1389 var contentShellOptions = []; 1349 var contentShellOptions = [];
1390 1350
1391 contentShellOptions.add('--no-timeout'); 1351 contentShellOptions.add('--no-timeout');
1392 contentShellOptions.add('--dump-render-tree'); 1352 contentShellOptions.add('--dump-render-tree');
1393 1353
1394 if (compiler == 'none') { 1354 if (compiler == 'none') {
1395 dartFlags.add('--ignore-unrecognized-flags'); 1355 dartFlags.add('--ignore-unrecognized-flags');
1396 if (configuration["checked"]) { 1356 if (configuration["checked"]) {
1397 dartFlags.add('--enable_asserts'); 1357 dartFlags.add('--enable_asserts');
1398 dartFlags.add("--enable_type_checks"); 1358 dartFlags.add("--enable_type_checks");
1399 } 1359 }
1400 dartFlags.addAll(vmOptions); 1360 dartFlags.addAll(vmOptions);
1401 } 1361 }
1402 1362
1403 commandSet.add( 1363 commandSet.add(CommandBuilder.instance.getContentShellCommand(
1404 CommandBuilder.instance.getContentShellCommand( 1364 contentShellFilename,
1405 contentShellFilename, 1365 fullHtmlPath,
1406 fullHtmlPath, 1366 contentShellOptions,
1407 contentShellOptions, 1367 dartFlags,
1408 dartFlags, 1368 environmentOverrides));
1409 environmentOverrides));
1410 } else { 1369 } else {
1411 commandSet.add( 1370 commandSet.add(CommandBuilder.instance.getBrowserTestCommand(
1412 CommandBuilder.instance.getBrowserTestCommand( 1371 runtime, fullHtmlPath, configuration, !isNegative(info)));
1413 runtime,
1414 fullHtmlPath,
1415 configuration,
1416 !isNegative(info)));
1417 } 1372 }
1418 1373
1419 // Create BrowserTestCase and queue it. 1374 // Create BrowserTestCase and queue it.
1420 var fullTestName = multitest ? '$testName/$subtestName' : testName; 1375 var fullTestName = multitest ? '$testName/$subtestName' : testName;
1421 var expectation = multitest ? expectations[fullTestName] : expectations; 1376 var expectation = multitest ? expectations[fullTestName] : expectations;
1422 var testCase = new BrowserTestCase( 1377 var testCase = new BrowserTestCase('$suiteName/$fullTestName', commandSet,
1423 '$suiteName/$fullTestName', 1378 configuration, expectation, info, isNegative(info), fullHtmlPath);
1424 commandSet,
1425 configuration,
1426 expectation,
1427 info,
1428 isNegative(info),
1429 fullHtmlPath);
1430 1379
1431 enqueueNewTestCase(testCase); 1380 enqueueNewTestCase(testCase);
1432 } 1381 }
1433 } 1382 }
1434 1383
1435 void enqueueHtmlTest( 1384 void enqueueHtmlTest(
1436 HtmlTestInformation info, 1385 HtmlTestInformation info, String testName, expectations) {
1437 String testName,
1438 expectations) {
1439 final String compiler = configuration['compiler']; 1386 final String compiler = configuration['compiler'];
1440 final String runtime = configuration['runtime']; 1387 final String runtime = configuration['runtime'];
1441 // Html tests work only with the browser controller. 1388 // Html tests work only with the browser controller.
1442 if (!TestUtils.isBrowserRuntime(runtime) || runtime == 'drt') { 1389 if (!TestUtils.isBrowserRuntime(runtime) || runtime == 'drt') {
1443 return; 1390 return;
1444 } 1391 }
1445 bool compileToJS = (compiler == 'dart2js'); 1392 bool compileToJS = (compiler == 'dart2js');
1446 1393
1447 final Path filePath = info.filePath; 1394 final Path filePath = info.filePath;
1448 final String tempDir = createOutputDirectory(filePath, ''); 1395 final String tempDir = createOutputDirectory(filePath, '');
(...skipping 19 matching lines...) Expand all
1468 Fail('HTML test scripts must have relative paths: $scriptPath'); 1415 Fail('HTML test scripts must have relative paths: $scriptPath');
1469 break; 1416 break;
1470 } 1417 }
1471 if (uri.pathSegments.length > 1) { 1418 if (uri.pathSegments.length > 1) {
1472 Fail('HTML test scripts must be in test directory: $scriptPath'); 1419 Fail('HTML test scripts must be in test directory: $scriptPath');
1473 break; 1420 break;
1474 } 1421 }
1475 Uri script = testUri.resolveUri(uri); 1422 Uri script = testUri.resolveUri(uri);
1476 Uri copiedScript = tempUri.resolveUri(uri); 1423 Uri copiedScript = tempUri.resolveUri(uri);
1477 if (compiler == 'none' || scriptPath.endsWith('.js')) { 1424 if (compiler == 'none' || scriptPath.endsWith('.js')) {
1478 new File.fromUri(copiedScript).writeAsStringSync( 1425 new File.fromUri(copiedScript)
1479 new File.fromUri(script).readAsStringSync()); 1426 .writeAsStringSync(new File.fromUri(script).readAsStringSync());
1480 } else { 1427 } else {
1481 var destination = copiedScript.toFilePath(); 1428 var destination = copiedScript.toFilePath();
1482 if (compileToJS) { 1429 if (compileToJS) {
1483 destination = destination.replaceFirst(dartExtension, '.js'); 1430 destination = destination.replaceFirst(dartExtension, '.js');
1484 } 1431 }
1485 commands.add(_compileCommand( 1432 commands.add(_compileCommand(script.toFilePath(), destination,
1486 script.toFilePath(), 1433 compiler, tempDir, info.optionsFromFile));
1487 destination,
1488 compiler,
1489 tempDir,
1490 info.optionsFromFile));
1491 } 1434 }
1492 } 1435 }
1493 } 1436 }
1494 final Uri htmlFile = tempUri.resolve(filePath.filename); 1437 final Uri htmlFile = tempUri.resolve(filePath.filename);
1495 new File.fromUri(htmlFile).writeAsStringSync(contents); 1438 new File.fromUri(htmlFile).writeAsStringSync(contents);
1496 1439
1497 var htmlPath = _createUrlPathFromFile(new Path(htmlFile.toFilePath())); 1440 var htmlPath = _createUrlPathFromFile(new Path(htmlFile.toFilePath()));
1498 var fullHtmlPath = _getUriForBrowserTest(htmlPath, null).toString(); 1441 var fullHtmlPath = _getUriForBrowserTest(htmlPath, null).toString();
1499 commands.add(CommandBuilder.instance.getBrowserHtmlTestCommand( 1442 commands.add(CommandBuilder.instance.getBrowserHtmlTestCommand(runtime,
1500 runtime, 1443 fullHtmlPath, configuration, info.expectedMessages, !isNegative(info)));
1501 fullHtmlPath,
1502 configuration,
1503 info.expectedMessages,
1504 !isNegative(info)));
1505 String testDisplayName = '$suiteName/$testName'; 1444 String testDisplayName = '$suiteName/$testName';
1506 var testCase = new BrowserTestCase( 1445 var testCase = new BrowserTestCase(testDisplayName, commands, configuration,
1507 testDisplayName, 1446 expectations, info, isNegative(info), fullHtmlPath);
1508 commands,
1509 configuration,
1510 expectations,
1511 info,
1512 isNegative(info),
1513 fullHtmlPath);
1514 enqueueNewTestCase(testCase); 1447 enqueueNewTestCase(testCase);
1515 return; 1448 return;
1516 } 1449 }
1517 1450
1518 /** Helper to create a compilation command for a single input file. */ 1451 /** Helper to create a compilation command for a single input file. */
1519 Command _compileCommand(String inputFile, String outputFile, 1452 Command _compileCommand(String inputFile, String outputFile, String compiler,
1520 String compiler, String dir, optionsFromFile) { 1453 String dir, optionsFromFile) {
1521 assert(compiler == 'dart2js'); 1454 assert(compiler == 'dart2js');
1522 List<String> args; 1455 List<String> args;
1523 if (compilerPath.endsWith('.dart')) { 1456 if (compilerPath.endsWith('.dart')) {
1524 // Run the compiler script via the Dart VM. 1457 // Run the compiler script via the Dart VM.
1525 args = [compilerPath]; 1458 args = [compilerPath];
1526 } else { 1459 } else {
1527 args = []; 1460 args = [];
1528 } 1461 }
1529 args.addAll(TestUtils.standardOptions(configuration)); 1462 args.addAll(TestUtils.standardOptions(configuration));
1530 String packageRoot = 1463 String packageRoot = packageRootArgument(optionsFromFile['packageRoot']);
1531 packageRootArgument(optionsFromFile['packageRoot']);
1532 if (packageRoot != null) args.add(packageRoot); 1464 if (packageRoot != null) args.add(packageRoot);
1533 String packages = packagesArgument(optionsFromFile['packages']); 1465 String packages = packagesArgument(optionsFromFile['packages']);
1534 if (packages != null) args.add(packages); 1466 if (packages != null) args.add(packages);
1535 args.add('--out=$outputFile'); 1467 args.add('--out=$outputFile');
1536 args.add(inputFile); 1468 args.add(inputFile);
1537 List<String> options = optionsFromFile['sharedOptions']; 1469 List<String> options = optionsFromFile['sharedOptions'];
1538 if (options != null) args.addAll(options); 1470 if (options != null) args.addAll(options);
1539 return CommandBuilder.instance.getCompilationCommand( 1471 return CommandBuilder.instance.getCompilationCommand(
1540 compiler, outputFile, !useSdk, 1472 compiler,
1541 dart2JsBootstrapDependencies, compilerPath, args, environmentOverrides); 1473 outputFile,
1474 !useSdk,
1475 dart2JsBootstrapDependencies,
1476 compilerPath,
1477 args,
1478 environmentOverrides);
1542 } 1479 }
1543 1480
1544 /** Helper to create a Polymer deploy command for a single HTML file. */ 1481 /** Helper to create a Polymer deploy command for a single HTML file. */
1545 Command _polymerDeployCommand(String inputFile, String outputDir, 1482 Command _polymerDeployCommand(
1546 optionsFromFile) { 1483 String inputFile, String outputDir, optionsFromFile) {
1547 List<String> args = []; 1484 List<String> args = [];
1548 String packageRoot = packageRootArgument(optionsFromFile['packageRoot']); 1485 String packageRoot = packageRootArgument(optionsFromFile['packageRoot']);
1549 if (packageRoot != null) args.add(packageRoot); 1486 if (packageRoot != null) args.add(packageRoot);
1550 String packages = packagesArgument(optionsFromFile['packages']); 1487 String packages = packagesArgument(optionsFromFile['packages']);
1551 if (packages != null) args.add(packages); 1488 if (packages != null) args.add(packages);
1552 args..add('package:polymer/deploy.dart') 1489 args
1553 ..add('--test')..add(inputFile) 1490 ..add('package:polymer/deploy.dart')
1554 ..add('--out')..add(outputDir) 1491 ..add('--test')
1555 ..add('--file-filter')..add('.svn'); 1492 ..add(inputFile)
1493 ..add('--out')
1494 ..add(outputDir)
1495 ..add('--file-filter')
1496 ..add('.svn');
1556 if (configuration['csp']) args.add('--csp'); 1497 if (configuration['csp']) args.add('--csp');
1557 1498
1558 return CommandBuilder.instance.getProcessCommand( 1499 return CommandBuilder.instance.getProcessCommand(
1559 'polymer_deploy', dartVmBinaryFileName, args, environmentOverrides); 1500 'polymer_deploy', dartVmBinaryFileName, args, environmentOverrides);
1560 } 1501 }
1561 1502
1562 String get scriptType { 1503 String get scriptType {
1563 switch (configuration['compiler']) { 1504 switch (configuration['compiler']) {
1564 case 'none': 1505 case 'none':
1565 return 'application/dart'; 1506 return 'application/dart';
1566 case 'dart2js': 1507 case 'dart2js':
1567 case 'dart2analyzer': 1508 case 'dart2analyzer':
1568 return 'text/javascript'; 1509 return 'text/javascript';
1569 default: 1510 default:
1570 print('Non-web runtime, so no scriptType for: ' 1511 print('Non-web runtime, so no scriptType for: '
1571 '${configuration["compiler"]}'); 1512 '${configuration["compiler"]}');
1572 exit(1); 1513 exit(1);
1573 return null; 1514 return null;
1574 } 1515 }
1575 } 1516 }
1576 1517
1577 bool get hasRuntime { 1518 bool get hasRuntime {
1578 switch(configuration['runtime']) { 1519 switch (configuration['runtime']) {
1579 case 'none': 1520 case 'none':
1580 return false; 1521 return false;
1581 default: 1522 default:
1582 return true; 1523 return true;
1583 } 1524 }
1584 } 1525 }
1585 1526
1586 String get contentShellFilename { 1527 String get contentShellFilename {
1587 if (configuration['drt'] != '') { 1528 if (configuration['drt'] != '') {
1588 return configuration['drt']; 1529 return configuration['drt'];
(...skipping 18 matching lines...) Expand all
1607 args.add(packages); 1548 args.add(packages);
1608 } 1549 }
1609 args.addAll(additionalOptions(filePath)); 1550 args.addAll(additionalOptions(filePath));
1610 if (configuration['analyzer']) { 1551 if (configuration['analyzer']) {
1611 args.add('--machine'); 1552 args.add('--machine');
1612 args.add('--no-hints'); 1553 args.add('--no-hints');
1613 } 1554 }
1614 1555
1615 if (configuration["compiler"] == "dart2analyzer" && 1556 if (configuration["compiler"] == "dart2analyzer" &&
1616 (filePath.filename.contains("dart2js") || 1557 (filePath.filename.contains("dart2js") ||
1617 filePath.directoryPath.segments().last.contains('html_common'))) { 1558 filePath.directoryPath.segments().last.contains('html_common'))) {
1618 args.add("--use-dart2js-libraries"); 1559 args.add("--use-dart2js-libraries");
1619 } 1560 }
1620 1561
1621 bool isMultitest = optionsFromFile["isMultitest"]; 1562 bool isMultitest = optionsFromFile["isMultitest"];
1622 List<String> dartOptions = optionsFromFile["dartOptions"]; 1563 List<String> dartOptions = optionsFromFile["dartOptions"];
1623 1564
1624 assert(!isMultitest || dartOptions == null); 1565 assert(!isMultitest || dartOptions == null);
1625 args.add(filePath.toNativePath()); 1566 args.add(filePath.toNativePath());
1626 if (dartOptions != null) { 1567 if (dartOptions != null) {
1627 args.addAll(dartOptions); 1568 args.addAll(dartOptions);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 return readOptionsFromCo19File(filePath); 1667 return readOptionsFromCo19File(filePath);
1727 } 1668 }
1728 RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)"); 1669 RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)");
1729 RegExp sharedOptionsRegExp = new RegExp(r"// SharedOptions=(.*)"); 1670 RegExp sharedOptionsRegExp = new RegExp(r"// SharedOptions=(.*)");
1730 RegExp dartOptionsRegExp = new RegExp(r"// DartOptions=(.*)"); 1671 RegExp dartOptionsRegExp = new RegExp(r"// DartOptions=(.*)");
1731 RegExp otherScriptsRegExp = new RegExp(r"// OtherScripts=(.*)"); 1672 RegExp otherScriptsRegExp = new RegExp(r"// OtherScripts=(.*)");
1732 RegExp packageRootRegExp = new RegExp(r"// PackageRoot=(.*)"); 1673 RegExp packageRootRegExp = new RegExp(r"// PackageRoot=(.*)");
1733 RegExp packagesRegExp = new RegExp(r"// Packages=(.*)"); 1674 RegExp packagesRegExp = new RegExp(r"// Packages=(.*)");
1734 RegExp isolateStubsRegExp = new RegExp(r"// IsolateStubs=(.*)"); 1675 RegExp isolateStubsRegExp = new RegExp(r"// IsolateStubs=(.*)");
1735 // TODO(gram) Clean these up once the old directives are not supported. 1676 // TODO(gram) Clean these up once the old directives are not supported.
1736 RegExp domImportRegExp = 1677 RegExp domImportRegExp = new RegExp(
1737 new RegExp(r"^[#]?import.*dart:(html|web_audio|indexed_db|svg|web_sql)", 1678 r"^[#]?import.*dart:(html|web_audio|indexed_db|svg|web_sql)",
1738 multiLine: true); 1679 multiLine: true);
1739 1680
1740 var bytes = new File(filePath.toNativePath()).readAsBytesSync(); 1681 var bytes = new File(filePath.toNativePath()).readAsBytesSync();
1741 String contents = decodeUtf8(bytes); 1682 String contents = decodeUtf8(bytes);
1742 bytes = null; 1683 bytes = null;
1743 1684
1744 // Find the options in the file. 1685 // Find the options in the file.
1745 List<List> result = new List<List>(); 1686 List<List> result = new List<List>();
1746 List<String> dartOptions; 1687 List<String> dartOptions;
1747 List<String> sharedOptions; 1688 List<String> sharedOptions;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 1747
1807 bool isMultitest = multiTestRegExp.hasMatch(contents); 1748 bool isMultitest = multiTestRegExp.hasMatch(contents);
1808 bool isMultiHtmlTest = multiHtmlTestRegExp.hasMatch(contents); 1749 bool isMultiHtmlTest = multiHtmlTestRegExp.hasMatch(contents);
1809 Match isolateMatch = isolateStubsRegExp.firstMatch(contents); 1750 Match isolateMatch = isolateStubsRegExp.firstMatch(contents);
1810 String isolateStubs = isolateMatch != null ? isolateMatch[1] : ''; 1751 String isolateStubs = isolateMatch != null ? isolateMatch[1] : '';
1811 bool containsDomImport = domImportRegExp.hasMatch(contents); 1752 bool containsDomImport = domImportRegExp.hasMatch(contents);
1812 1753
1813 List<String> subtestNames = []; 1754 List<String> subtestNames = [];
1814 Iterator matchesIter = 1755 Iterator matchesIter =
1815 multiHtmlTestGroupRegExp.allMatches(contents).iterator; 1756 multiHtmlTestGroupRegExp.allMatches(contents).iterator;
1816 while(matchesIter.moveNext() && isMultiHtmlTest) { 1757 while (matchesIter.moveNext() && isMultiHtmlTest) {
1817 String fullMatch = matchesIter.current.group(0); 1758 String fullMatch = matchesIter.current.group(0);
1818 subtestNames.add(fullMatch.substring(fullMatch.indexOf("'") + 1)); 1759 subtestNames.add(fullMatch.substring(fullMatch.indexOf("'") + 1));
1819 } 1760 }
1820 1761
1821 return { "vmOptions": result, 1762 return {
1822 "sharedOptions": sharedOptions == null ? [] : sharedOptions, 1763 "vmOptions": result,
1823 "dartOptions": dartOptions, 1764 "sharedOptions": sharedOptions == null ? [] : sharedOptions,
1824 "packageRoot": packageRoot, 1765 "dartOptions": dartOptions,
1825 "packages": packages, 1766 "packageRoot": packageRoot,
1826 "hasCompileError": false, 1767 "packages": packages,
1827 "hasRuntimeError": false, 1768 "hasCompileError": false,
1828 "hasStaticWarning" : false, 1769 "hasRuntimeError": false,
1829 "otherScripts": otherScripts, 1770 "hasStaticWarning": false,
1830 "isMultitest": isMultitest, 1771 "otherScripts": otherScripts,
1831 "isMultiHtmlTest": isMultiHtmlTest, 1772 "isMultitest": isMultitest,
1832 "subtestNames": subtestNames, 1773 "isMultiHtmlTest": isMultiHtmlTest,
1833 "isolateStubs": isolateStubs, 1774 "subtestNames": subtestNames,
1834 "containsDomImport": containsDomImport }; 1775 "isolateStubs": isolateStubs,
1776 "containsDomImport": containsDomImport
1777 };
1835 } 1778 }
1836 1779
1837 List<List<String>> getVmOptions(Map optionsFromFile) { 1780 List<List<String>> getVmOptions(Map optionsFromFile) {
1838 var COMPILERS = const ['none', 'precompiler', 'dart2app']; 1781 var COMPILERS = const ['none', 'precompiler', 'dart2app'];
1839 var RUNTIMES = const ['none', 'dart_precompiled', 'dart_product', 'vm', 1782 var RUNTIMES = const [
1840 'drt', 'dartium', 1783 'none',
1841 'ContentShellOnAndroid', 'DartiumOnAndroid']; 1784 'dart_precompiled',
1785 'dart_product',
1786 'vm',
1787 'drt',
1788 'dartium',
1789 'ContentShellOnAndroid',
1790 'DartiumOnAndroid'
1791 ];
1842 var needsVmOptions = COMPILERS.contains(configuration['compiler']) && 1792 var needsVmOptions = COMPILERS.contains(configuration['compiler']) &&
1843 RUNTIMES.contains(configuration['runtime']); 1793 RUNTIMES.contains(configuration['runtime']);
1844 if (!needsVmOptions) return [[]]; 1794 if (!needsVmOptions) return [[]];
1845 final vmOptions = optionsFromFile['vmOptions']; 1795 final vmOptions = optionsFromFile['vmOptions'];
1846 return vmOptions; 1796 return vmOptions;
1847 } 1797 }
1848 1798
1849 /** 1799 /**
1850 * Read options from a co19 test file. 1800 * Read options from a co19 test file.
1851 * 1801 *
1852 * The reason this is different from [readOptionsFromFile] is that 1802 * The reason this is different from [readOptionsFromFile] is that
1853 * co19 is developed based on a contract which defines certain test 1803 * co19 is developed based on a contract which defines certain test
1854 * tags. These tags may appear unused, but should not be removed 1804 * tags. These tags may appear unused, but should not be removed
1855 * without consulting with the co19 team. 1805 * without consulting with the co19 team.
1856 * 1806 *
1857 * Also, [readOptionsFromFile] recognizes a number of additional 1807 * Also, [readOptionsFromFile] recognizes a number of additional
1858 * tags that are not appropriate for use in general tests of 1808 * tags that are not appropriate for use in general tests of
1859 * conformance to the Dart language. Any Dart implementation must 1809 * conformance to the Dart language. Any Dart implementation must
1860 * pass the co19 test suite as is, and not require extra flags, 1810 * pass the co19 test suite as is, and not require extra flags,
1861 * environment variables, configuration files, etc. 1811 * environment variables, configuration files, etc.
1862 */ 1812 */
1863 Map readOptionsFromCo19File(Path filePath) { 1813 Map readOptionsFromCo19File(Path filePath) {
1864 String contents = decodeUtf8(new File(filePath.toNativePath()) 1814 String contents =
1865 .readAsBytesSync()); 1815 decodeUtf8(new File(filePath.toNativePath()).readAsBytesSync());
1866 1816
1867 bool hasCompileError = contents.contains("@compile-error"); 1817 bool hasCompileError = contents.contains("@compile-error");
1868 bool hasRuntimeError = contents.contains("@runtime-error"); 1818 bool hasRuntimeError = contents.contains("@runtime-error");
1869 bool hasStaticWarning = contents.contains("@static-warning"); 1819 bool hasStaticWarning = contents.contains("@static-warning");
1870 bool isMultitest = multiTestRegExp.hasMatch(contents); 1820 bool isMultitest = multiTestRegExp.hasMatch(contents);
1871 1821
1872 return { 1822 return {
1873 "vmOptions": <List>[[]], 1823 "vmOptions": <List>[[]],
1874 "sharedOptions": <String>[], 1824 "sharedOptions": <String>[],
1875 "dartOptions": null, 1825 "dartOptions": null,
1876 "packageRoot": null, 1826 "packageRoot": null,
1877 "hasCompileError": hasCompileError, 1827 "hasCompileError": hasCompileError,
1878 "hasRuntimeError": hasRuntimeError, 1828 "hasRuntimeError": hasRuntimeError,
1879 "hasStaticWarning" : hasStaticWarning, 1829 "hasStaticWarning": hasStaticWarning,
1880 "otherScripts": <String>[], 1830 "otherScripts": <String>[],
1881 "isMultitest": isMultitest, 1831 "isMultitest": isMultitest,
1882 "isMultiHtmlTest": false, 1832 "isMultiHtmlTest": false,
1883 "subtestNames": <String>[], 1833 "subtestNames": <String>[],
1884 "isolateStubs": '', 1834 "isolateStubs": '',
1885 "containsDomImport": false, 1835 "containsDomImport": false,
1886 }; 1836 };
1887 } 1837 }
1888 } 1838 }
1889 1839
1890
1891 /// Used for testing packages in on off settings, i.e., we pass in the actual 1840 /// Used for testing packages in on off settings, i.e., we pass in the actual
1892 /// directory that we want to test. 1841 /// directory that we want to test.
1893 class PKGTestSuite extends StandardTestSuite { 1842 class PKGTestSuite extends StandardTestSuite {
1843 PKGTestSuite(Map configuration, Path directoryPath)
1844 : super(configuration, directoryPath.filename, directoryPath,
1845 ["$directoryPath/.status"],
1846 isTestFilePredicate: (f) => f.endsWith('_test.dart'),
1847 recursive: true);
1894 1848
1895 PKGTestSuite(Map configuration, Path directoryPath) 1849 void enqueueBrowserTest(List<Command> baseCommands, Path packageRoot,
1896 : super(configuration, 1850 TestInformation info, String testName, expectations) {
1897 directoryPath.filename, 1851 String runtime = configuration['runtime'];
1898 directoryPath, 1852 Path filePath = info.filePath;
1899 ["$directoryPath/.status"], 1853 Path dir = filePath.directoryPath;
1900 isTestFilePredicate: (f) => f.endsWith('_test.dart'), 1854 String nameNoExt = filePath.filenameWithoutExtension;
1901 recursive: true); 1855 Path customHtmlPath = dir.append('$nameNoExt.html');
1856 File customHtml = new File(customHtmlPath.toNativePath());
1857 if (!customHtml.existsSync()) {
1858 super.enqueueBrowserTest(
1859 baseCommands, packageRoot, info, testName, expectations);
1860 } else {
1861 Path relativeHtml = customHtmlPath.relativeTo(TestUtils.dartDir);
1862 List<Command> commands = []..addAll(baseCommands);
1863 var fullPath = _createUrlPathFromFile(customHtmlPath);
1902 1864
1903 void enqueueBrowserTest(List<Command> baseCommands, 1865 commands.add(CommandBuilder.instance.getBrowserTestCommand(
1904 Path packageRoot, 1866 runtime, fullPath, configuration, !isNegative(info)));
1905 TestInformation info, 1867 String testDisplayName = '$suiteName/$testName';
1906 String testName, 1868 enqueueNewTestCase(new BrowserTestCase(
1907 expectations) { 1869 testDisplayName,
1908 String runtime = configuration['runtime']; 1870 commands,
1909 Path filePath = info.filePath; 1871 configuration,
1910 Path dir = filePath.directoryPath; 1872 expectations,
1911 String nameNoExt = filePath.filenameWithoutExtension; 1873 info,
1912 Path customHtmlPath = dir.append('$nameNoExt.html'); 1874 isNegative(info),
1913 File customHtml = new File(customHtmlPath.toNativePath()); 1875 relativeHtml.toNativePath()));
1914 if (!customHtml.existsSync()) {
1915 super.enqueueBrowserTest(baseCommands, packageRoot,
1916 info, testName, expectations);
1917 } else {
1918 Path relativeHtml = customHtmlPath.relativeTo(TestUtils.dartDir);
1919 List<Command> commands = []..addAll(baseCommands);
1920 var fullPath = _createUrlPathFromFile(customHtmlPath);
1921
1922 commands.add(CommandBuilder.instance.getBrowserTestCommand(
1923 runtime, fullPath, configuration, !isNegative(info)));
1924 String testDisplayName = '$suiteName/$testName';
1925 enqueueNewTestCase(new BrowserTestCase(testDisplayName,
1926 commands,
1927 configuration,
1928 expectations,
1929 info,
1930 isNegative(info),
1931 relativeHtml.toNativePath()));
1932
1933 }
1934 } 1876 }
1877 }
1935 } 1878 }
1936 1879
1937
1938 /// A DartcCompilationTestSuite will run dartc on all of the tests. 1880 /// A DartcCompilationTestSuite will run dartc on all of the tests.
1939 /// 1881 ///
1940 /// Usually, the result of a dartc run is determined by the output of 1882 /// Usually, the result of a dartc run is determined by the output of
1941 /// dartc in connection with annotations in the test file. 1883 /// dartc in connection with annotations in the test file.
1942 class DartcCompilationTestSuite extends StandardTestSuite { 1884 class DartcCompilationTestSuite extends StandardTestSuite {
1943 List<String> _testDirs; 1885 List<String> _testDirs;
1944 1886
1945 DartcCompilationTestSuite(Map configuration, 1887 DartcCompilationTestSuite(
1946 String suiteName, 1888 Map configuration,
1947 String directoryPath, 1889 String suiteName,
1948 List<String> this._testDirs, 1890 String directoryPath,
1949 List<String> expectations) 1891 List<String> this._testDirs,
1950 : super(configuration, 1892 List<String> expectations)
1951 suiteName, 1893 : super(configuration, suiteName, new Path(directoryPath), expectations);
1952 new Path(directoryPath),
1953 expectations);
1954 1894
1955 List<String> additionalOptions(Path filePath) { 1895 List<String> additionalOptions(Path filePath) {
1956 return ['--fatal-warnings', '--fatal-type-errors']; 1896 return ['--fatal-warnings', '--fatal-type-errors'];
1957 } 1897 }
1958 1898
1959 Future enqueueTests() { 1899 Future enqueueTests() {
1960 var group = new FutureGroup(); 1900 var group = new FutureGroup();
1961 1901
1962 for (String testDir in _testDirs) { 1902 for (String testDir in _testDirs) {
1963 Directory dir = new Directory(suiteDir.append(testDir).toNativePath()); 1903 Directory dir = new Directory(suiteDir.append(testDir).toNativePath());
1964 if (dir.existsSync()) { 1904 if (dir.existsSync()) {
1965 enqueueDirectory(dir, group); 1905 enqueueDirectory(dir, group);
1966 } 1906 }
1967 } 1907 }
1968 1908
1969 return group.future; 1909 return group.future;
1970 } 1910 }
1971 } 1911 }
1972 1912
1973
1974 class AnalyzeLibraryTestSuite extends DartcCompilationTestSuite { 1913 class AnalyzeLibraryTestSuite extends DartcCompilationTestSuite {
1975 AnalyzeLibraryTestSuite(Map configuration) 1914 AnalyzeLibraryTestSuite(Map configuration)
1976 : super(configuration, 1915 : super(configuration, 'analyze_library', 'sdk', ['lib'],
1977 'analyze_library', 1916 ['tests/lib/analyzer/analyze_library.status']);
1978 'sdk',
1979 ['lib'],
1980 ['tests/lib/analyzer/analyze_library.status']);
1981 1917
1982 List<String> additionalOptions(Path filePath, {bool showSdkWarnings}) { 1918 List<String> additionalOptions(Path filePath, {bool showSdkWarnings}) {
1983 var options = super.additionalOptions(filePath); 1919 var options = super.additionalOptions(filePath);
1984 // NOTE: This flag has been deprecated. 1920 // NOTE: This flag has been deprecated.
1985 options.add('--show-sdk-warnings'); 1921 options.add('--show-sdk-warnings');
1986 return options; 1922 return options;
1987 } 1923 }
1988 1924
1989 bool isTestFile(String filename) { 1925 bool isTestFile(String filename) {
1990 // NOTE: We exclude tests and patch files for now. 1926 // NOTE: We exclude tests and patch files for now.
1991 return filename.endsWith(".dart") && 1927 return filename.endsWith(".dart") &&
1992 !filename.endsWith("_test.dart") && 1928 !filename.endsWith("_test.dart") &&
1993 !filename.contains("_internal/js_runtime/lib"); 1929 !filename.contains("_internal/js_runtime/lib");
1994 } 1930 }
1995 1931
1996 bool get listRecursively => true; 1932 bool get listRecursively => true;
1997 } 1933 }
1998 1934
1999
2000 class PkgBuildTestSuite extends TestSuite { 1935 class PkgBuildTestSuite extends TestSuite {
2001 final String statusFilePath; 1936 final String statusFilePath;
2002 1937
2003 PkgBuildTestSuite(Map configuration, String suiteName, this.statusFilePath) 1938 PkgBuildTestSuite(Map configuration, String suiteName, this.statusFilePath)
2004 : super(configuration, suiteName) { 1939 : super(configuration, suiteName) {
2005 assert(configuration['use_sdk']);; 1940 assert(configuration['use_sdk']);
1941 ;
2006 } 1942 }
2007 1943
2008 void forEachTest(void onTest(TestCase testCase), _, [void onDone()]) { 1944 void forEachTest(void onTest(TestCase testCase), _, [void onDone()]) {
2009 bool fileExists(Path path) => new File(path.toNativePath()).existsSync(); 1945 bool fileExists(Path path) => new File(path.toNativePath()).existsSync();
2010 1946
2011 bool dirExists(Path path) 1947 bool dirExists(Path path) =>
2012 => new Directory(path.toNativePath()).existsSync(); 1948 new Directory(path.toNativePath()).existsSync();
2013 1949
2014 enqueueTestCases(Map<String, String> localPackageDirectories, 1950 enqueueTestCases(
2015 Map<String, String> localSampleDirectories, 1951 Map<String, String> localPackageDirectories,
2016 TestExpectations testExpectations) { 1952 Map<String, String> localSampleDirectories,
1953 TestExpectations testExpectations) {
2017 enqueueTestCase(String packageName, String directory) { 1954 enqueueTestCase(String packageName, String directory) {
2018 var absoluteDirectoryPath = new Path(directory); 1955 var absoluteDirectoryPath = new Path(directory);
2019 1956
2020 // Early return if this package is not using pub. 1957 // Early return if this package is not using pub.
2021 if (!fileExists(absoluteDirectoryPath.append('pubspec.yaml'))) { 1958 if (!fileExists(absoluteDirectoryPath.append('pubspec.yaml'))) {
2022 return; 1959 return;
2023 } 1960 }
2024 1961
2025 var directoryPath = 1962 var directoryPath = absoluteDirectoryPath.relativeTo(TestUtils.dartDir);
2026 absoluteDirectoryPath.relativeTo(TestUtils.dartDir);
2027 var testName = "$directoryPath"; 1963 var testName = "$directoryPath";
2028 var displayName = '$suiteName/$testName'; 1964 var displayName = '$suiteName/$testName';
2029 var packageName = directoryPath.filename; 1965 var packageName = directoryPath.filename;
2030 1966
2031 // Collect necessary paths for pubspec.yaml overrides, pub-cache, ... 1967 // Collect necessary paths for pubspec.yaml overrides, pub-cache, ...
2032 var checkoutDir = 1968 var checkoutDir =
2033 createPubPackageBuildsDirectory(absoluteDirectoryPath); 1969 createPubPackageBuildsDirectory(absoluteDirectoryPath);
2034 var cacheDir = new Path(checkoutDir).append("pub-cache").toNativePath(); 1970 var cacheDir = new Path(checkoutDir).append("pub-cache").toNativePath();
2035 var pubspecYamlFile = 1971 var pubspecYamlFile =
2036 new Path(checkoutDir).append('pubspec.yaml').toNativePath(); 1972 new Path(checkoutDir).append('pubspec.yaml').toNativePath();
(...skipping 11 matching lines...) Expand all
2048 packageDirectories.remove(packageName); 1984 packageDirectories.remove(packageName);
2049 } 1985 }
2050 } 1986 }
2051 var dependencyOverrides = 1987 var dependencyOverrides =
2052 buildPubspecDependencyOverrides(packageDirectories); 1988 buildPubspecDependencyOverrides(packageDirectories);
2053 1989
2054 // Build all commands 1990 // Build all commands
2055 var commands = new List<Command>(); 1991 var commands = new List<Command>();
2056 commands.add( 1992 commands.add(
2057 CommandBuilder.instance.getCopyCommand(directory, checkoutDir)); 1993 CommandBuilder.instance.getCopyCommand(directory, checkoutDir));
2058 commands.add(CommandBuilder.instance.getModifyPubspecCommand( 1994 commands.add(CommandBuilder.instance
2059 pubspecYamlFile, dependencyOverrides)); 1995 .getModifyPubspecCommand(pubspecYamlFile, dependencyOverrides));
2060 commands.add(CommandBuilder.instance.getPubCommand( 1996 commands.add(CommandBuilder.instance
2061 "get", pubPath, checkoutDir, cacheDir)); 1997 .getPubCommand("get", pubPath, checkoutDir, cacheDir));
2062 1998
2063 bool containsWebDirectory = dirExists(directoryPath.append('web')); 1999 bool containsWebDirectory = dirExists(directoryPath.append('web'));
2064 bool containsBuildDartFile = 2000 bool containsBuildDartFile =
2065 fileExists(directoryPath.append('build.dart')); 2001 fileExists(directoryPath.append('build.dart'));
2066 if (containsBuildDartFile) { 2002 if (containsBuildDartFile) {
2067 var dartBinary = new File(dartVmBinaryFileName).absolute.path; 2003 var dartBinary = new File(dartVmBinaryFileName).absolute.path;
2068 2004
2069 commands.add(CommandBuilder.instance.getProcessCommand( 2005 commands.add(CommandBuilder.instance.getProcessCommand(
2070 "custom_build", dartBinary, ['build.dart'], 2006 "custom_build",
2071 {'PUB_CACHE': cacheDir}, checkoutDir)); 2007 dartBinary,
2008 ['build.dart'],
2009 {'PUB_CACHE': cacheDir},
2010 checkoutDir));
2072 2011
2073 // We only try to deploy the application if it's a webapp. 2012 // We only try to deploy the application if it's a webapp.
2074 if (containsWebDirectory) { 2013 if (containsWebDirectory) {
2075 commands.add(CommandBuilder.instance.getProcessCommand( 2014 commands.add(CommandBuilder.instance.getProcessCommand(
2076 "custom_deploy", dartBinary, ['build.dart', '--deploy'], 2015 "custom_deploy",
2077 {'PUB_CACHE': cacheDir}, checkoutDir)); 2016 dartBinary,
2017 ['build.dart', '--deploy'],
2018 {'PUB_CACHE': cacheDir},
2019 checkoutDir));
2078 } 2020 }
2079 } else if (containsWebDirectory) { 2021 } else if (containsWebDirectory) {
2080 commands.add(CommandBuilder.instance.getPubCommand( 2022 commands.add(CommandBuilder.instance
2081 "build", pubPath, checkoutDir, cacheDir)); 2023 .getPubCommand("build", pubPath, checkoutDir, cacheDir));
2082 } 2024 }
2083 2025
2084 // Enqueue TestCase 2026 // Enqueue TestCase
2085 var testCase = new TestCase(displayName, 2027 var testCase = new TestCase(displayName, commands, configuration,
2086 commands, configuration, testExpectations.expectations(testName)); 2028 testExpectations.expectations(testName));
2087 enqueueNewTestCase(testCase); 2029 enqueueNewTestCase(testCase);
2088 } 2030 }
2089 2031
2090 localPackageDirectories.forEach(enqueueTestCase); 2032 localPackageDirectories.forEach(enqueueTestCase);
2091 localSampleDirectories.forEach(enqueueTestCase); 2033 localSampleDirectories.forEach(enqueueTestCase);
2092 2034
2093 doTest = null; 2035 doTest = null;
2094 // Notify we're done 2036 // Notify we're done
2095 if (onDone != null) onDone(); 2037 if (onDone != null) onDone();
2096 } 2038 }
2097 2039
2098 doTest = onTest; 2040 doTest = onTest;
2099 List<String> statusFiles = [ 2041 List<String> statusFiles = [
2100 TestUtils.dartDir.join(new Path(statusFilePath)).toNativePath()]; 2042 TestUtils.dartDir.join(new Path(statusFilePath)).toNativePath()
2043 ];
2101 ReadTestExpectations(statusFiles, configuration).then((expectations) { 2044 ReadTestExpectations(statusFiles, configuration).then((expectations) {
2102 Future.wait([discoverPackagesInRepository(), 2045 Future.wait([
2103 discoverSamplesInRepository()]).then((List results) { 2046 discoverPackagesInRepository(),
2047 discoverSamplesInRepository()
2048 ]).then((List results) {
2104 Map packageDirectories = results[0]; 2049 Map packageDirectories = results[0];
2105 Map sampleDirectories = results[1]; 2050 Map sampleDirectories = results[1];
2106 enqueueTestCases(packageDirectories, sampleDirectories, expectations); 2051 enqueueTestCases(packageDirectories, sampleDirectories, expectations);
2107 }); 2052 });
2108 }); 2053 });
2109 } 2054 }
2110 } 2055 }
2111 2056
2112
2113 class LastModifiedCache { 2057 class LastModifiedCache {
2114 Map<String, DateTime> _cache = <String, DateTime>{}; 2058 Map<String, DateTime> _cache = <String, DateTime>{};
2115 2059
2116 /** 2060 /**
2117 * Returns the last modified date of the given [uri]. 2061 * Returns the last modified date of the given [uri].
2118 * 2062 *
2119 * The return value will be cached for future queries. If [uri] is a local 2063 * The return value will be cached for future queries. If [uri] is a local
2120 * file, it's last modified [Date] will be returned. If the file does not 2064 * file, it's last modified [Date] will be returned. If the file does not
2121 * exist, null will be returned instead. 2065 * exist, null will be returned instead.
2122 * In case [uri] is not a local file, this method will always return 2066 * In case [uri] is not a local file, this method will always return
2123 * the current date. 2067 * the current date.
2124 */ 2068 */
2125 DateTime getLastModified(Uri uri) { 2069 DateTime getLastModified(Uri uri) {
2126 if (uri.scheme == "file") { 2070 if (uri.scheme == "file") {
2127 if (_cache.containsKey(uri.path)) { 2071 if (_cache.containsKey(uri.path)) {
2128 return _cache[uri.path]; 2072 return _cache[uri.path];
2129 } 2073 }
2130 var file = new File(new Path(uri.path).toNativePath()); 2074 var file = new File(new Path(uri.path).toNativePath());
2131 _cache[uri.path] = file.existsSync() ? file.lastModifiedSync() : null; 2075 _cache[uri.path] = file.existsSync() ? file.lastModifiedSync() : null;
2132 return _cache[uri.path]; 2076 return _cache[uri.path];
2133 } 2077 }
2134 return new DateTime.now(); 2078 return new DateTime.now();
2135 } 2079 }
2136 } 2080 }
2137 2081
2138
2139 class ExistsCache { 2082 class ExistsCache {
2140 Map<String, bool> _cache = <String, bool>{}; 2083 Map<String, bool> _cache = <String, bool>{};
2141 2084
2142 /** 2085 /**
2143 * Returns true if the file in [path] exists, false otherwise. 2086 * Returns true if the file in [path] exists, false otherwise.
2144 * 2087 *
2145 * The information will be cached. 2088 * The information will be cached.
2146 */ 2089 */
2147 bool doesFileExist(String path) { 2090 bool doesFileExist(String path) {
2148 if (!_cache.containsKey(path)) { 2091 if (!_cache.containsKey(path)) {
2149 _cache[path] = new File(path).existsSync(); 2092 _cache[path] = new File(path).existsSync();
2150 } 2093 }
2151 return _cache[path]; 2094 return _cache[path];
2152 } 2095 }
2153 } 2096 }
2154 2097
2155
2156 class TestUtils { 2098 class TestUtils {
2157 /** 2099 /**
2158 * Any script using TestUtils must set dartDirUri to a file:// URI 2100 * Any script using TestUtils must set dartDirUri to a file:// URI
2159 * pointing to the root of the Dart checkout. 2101 * pointing to the root of the Dart checkout.
2160 */ 2102 */
2161 static setDartDirUri(uri) { 2103 static setDartDirUri(uri) {
2162 dartDirUri = uri; 2104 dartDirUri = uri;
2163 dartDir = new Path(uri.toFilePath()); 2105 dartDir = new Path(uri.toFilePath());
2164 } 2106 }
2107
2165 static Random rand = new Random.secure(); 2108 static Random rand = new Random.secure();
2166 static Uri dartDirUri; 2109 static Uri dartDirUri;
2167 static Path dartDir; 2110 static Path dartDir;
2168 static LastModifiedCache lastModifiedCache = new LastModifiedCache(); 2111 static LastModifiedCache lastModifiedCache = new LastModifiedCache();
2169 static ExistsCache existsCache = new ExistsCache(); 2112 static ExistsCache existsCache = new ExistsCache();
2170 static Path currentWorkingDirectory = 2113 static Path currentWorkingDirectory = new Path(Directory.current.path);
2171 new Path(Directory.current.path);
2172 2114
2173 /** 2115 /**
2174 * Generates a random number. 2116 * Generates a random number.
2175 */ 2117 */
2176 static int getRandomNumber() { 2118 static int getRandomNumber() {
2177 return rand.nextInt(0xffffffff); 2119 return rand.nextInt(0xffffffff);
2178 } 2120 }
2179 2121
2180 /** 2122 /**
2181 * Creates a directory using a [relativePath] to an existing 2123 * Creates a directory using a [relativePath] to an existing
(...skipping 21 matching lines...) Expand all
2203 assert(dir.existsSync()); 2145 assert(dir.existsSync());
2204 } 2146 }
2205 return dir; 2147 return dir;
2206 } 2148 }
2207 2149
2208 /** 2150 /**
2209 * Copy a [source] file to a new place. 2151 * Copy a [source] file to a new place.
2210 * Assumes that the directory for [dest] already exists. 2152 * Assumes that the directory for [dest] already exists.
2211 */ 2153 */
2212 static Future copyFile(Path source, Path dest) { 2154 static Future copyFile(Path source, Path dest) {
2213 return new File(source.toNativePath()).openRead() 2155 return new File(source.toNativePath())
2156 .openRead()
2214 .pipe(new File(dest.toNativePath()).openWrite()); 2157 .pipe(new File(dest.toNativePath()).openWrite());
2215 } 2158 }
2216 2159
2217 static Future copyDirectory(String source, String dest) { 2160 static Future copyDirectory(String source, String dest) {
2218 source = new Path(source).toNativePath(); 2161 source = new Path(source).toNativePath();
2219 dest = new Path(dest).toNativePath(); 2162 dest = new Path(dest).toNativePath();
2220 2163
2221 var executable = 'cp'; 2164 var executable = 'cp';
2222 var args = ['-Rp', source, dest]; 2165 var args = ['-Rp', source, dest];
2223 if (Platform.operatingSystem == 'windows') { 2166 if (Platform.operatingSystem == 'windows') {
2224 executable = 'xcopy'; 2167 executable = 'xcopy';
2225 args = [source, dest, '/e', '/i']; 2168 args = [source, dest, '/e', '/i'];
2226 } 2169 }
2227 return Process.run(executable, args).then((ProcessResult result) { 2170 return Process.run(executable, args).then((ProcessResult result) {
2228 if (result.exitCode != 0) { 2171 if (result.exitCode != 0) {
2229 throw new Exception("Failed to execute '$executable " 2172 throw new Exception("Failed to execute '$executable "
2230 "${args.join(' ')}'."); 2173 "${args.join(' ')}'.");
2231 } 2174 }
2232 }); 2175 });
2233 } 2176 }
2234 2177
2235 static Future deleteDirectory(String path) { 2178 static Future deleteDirectory(String path) {
2236 // We are seeing issues with long path names on windows when 2179 // We are seeing issues with long path names on windows when
2237 // deleting them. Use the system tools to delete our long paths. 2180 // deleting them. Use the system tools to delete our long paths.
2238 // See issue 16264. 2181 // See issue 16264.
2239 if (Platform.operatingSystem == 'windows') { 2182 if (Platform.operatingSystem == 'windows') {
2240 var native_path = new Path(path).toNativePath(); 2183 var native_path = new Path(path).toNativePath();
2241 // Running this in a shell sucks, but rmdir is not part of the standard 2184 // Running this in a shell sucks, but rmdir is not part of the standard
2242 // path. 2185 // path.
2243 return Process.run('rmdir', ['/s', '/q', native_path], runInShell: true) 2186 return Process
2244 .then((ProcessResult result) { 2187 .run('rmdir', ['/s', '/q', native_path], runInShell: true)
2245 if (result.exitCode != 0) { 2188 .then((ProcessResult result) {
2246 throw new Exception('Can\'t delete path $native_path. ' 2189 if (result.exitCode != 0) {
2247 'This path might be too long'); 2190 throw new Exception('Can\'t delete path $native_path. '
2248 } 2191 'This path might be too long');
2249 }); 2192 }
2193 });
2250 } else { 2194 } else {
2251 var dir = new Directory(path); 2195 var dir = new Directory(path);
2252 return dir.delete(recursive: true); 2196 return dir.delete(recursive: true);
2253 } 2197 }
2254 } 2198 }
2255 2199
2256 static deleteTempSnapshotDirectory(Map configuration) { 2200 static deleteTempSnapshotDirectory(Map configuration) {
2257 if (configuration['compiler'] == 'dart2app') { 2201 if (configuration['compiler'] == 'dart2app') {
2258 var checked = configuration['checked'] ? '-checked' : ''; 2202 var checked = configuration['checked'] ? '-checked' : '';
2259 var minified = configuration['minified'] ? '-minified' : ''; 2203 var minified = configuration['minified'] ? '-minified' : '';
2260 var csp = configuration['csp'] ? '-csp' : ''; 2204 var csp = configuration['csp'] ? '-csp' : '';
2261 var sdk = configuration['use_sdk'] ? '-sdk' : ''; 2205 var sdk = configuration['use_sdk'] ? '-sdk' : '';
2262 var packages = configuration['use_public_packages'] 2206 var packages =
2263 ? '-public_packages' : ''; 2207 configuration['use_public_packages'] ? '-public_packages' : '';
2264 var dirName = "${configuration['compiler']}" 2208 var dirName = "${configuration['compiler']}"
2265 "$checked$minified$csp$packages$sdk"; 2209 "$checked$minified$csp$packages$sdk";
2266 String generatedPath = "${TestUtils.buildDir(configuration)}" 2210 String generatedPath = "${TestUtils.buildDir(configuration)}"
2267 "/generated_compilations/$dirName"; 2211 "/generated_compilations/$dirName";
2268 TestUtils.deleteDirectory(generatedPath); 2212 TestUtils.deleteDirectory(generatedPath);
2269 } 2213 }
2270 } 2214 }
2271 2215
2272 static Path debugLogfile() { 2216 static Path debugLogfile() {
2273 return new Path(".debug.log"); 2217 return new Path(".debug.log");
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2321 args = ['--generate-code-with-compile-time-errors', '--test-mode']; 2265 args = ['--generate-code-with-compile-time-errors', '--test-mode'];
2322 if (configuration["checked"]) { 2266 if (configuration["checked"]) {
2323 args.add('--enable-checked-mode'); 2267 args.add('--enable-checked-mode');
2324 } 2268 }
2325 // args.add("--verbose"); 2269 // args.add("--verbose");
2326 if (!isBrowserRuntime(configuration['runtime'])) { 2270 if (!isBrowserRuntime(configuration['runtime'])) {
2327 args.add("--allow-mock-compilation"); 2271 args.add("--allow-mock-compilation");
2328 args.add("--categories=all"); 2272 args.add("--categories=all");
2329 } 2273 }
2330 } 2274 }
2331 if ((compiler == "dart2js") && 2275 if ((compiler == "dart2js") && configuration["minified"]) {
2332 configuration["minified"]) {
2333 args.add("--minify"); 2276 args.add("--minify");
2334 } 2277 }
2335 if (compiler == "dart2js" && configuration["csp"]) { 2278 if (compiler == "dart2js" && configuration["csp"]) {
2336 args.add("--csp"); 2279 args.add("--csp");
2337 } 2280 }
2338 if (compiler == "dart2js" && configuration["cps_ir"]) { 2281 if (compiler == "dart2js" && configuration["cps_ir"]) {
2339 args.add("--use-cps-ir"); 2282 args.add("--use-cps-ir");
2340 } 2283 }
2341 if (compiler == "dart2analyzer") { 2284 if (compiler == "dart2analyzer") {
2342 args.add("--show-package-warnings"); 2285 args.add("--show-package-warnings");
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2408 throw 'Unrecognized mode configuration: ${configuration['mode']}'; 2351 throw 'Unrecognized mode configuration: ${configuration['mode']}';
2409 } 2352 }
2410 var arch = configuration['arch'].toUpperCase(); 2353 var arch = configuration['arch'].toUpperCase();
2411 var normal = '$mode$arch'; 2354 var normal = '$mode$arch';
2412 var cross = '${mode}X$arch'; 2355 var cross = '${mode}X$arch';
2413 var outDir = outputDir(configuration); 2356 var outDir = outputDir(configuration);
2414 var normalDir = new Directory(new Path('$outDir$normal').toNativePath()); 2357 var normalDir = new Directory(new Path('$outDir$normal').toNativePath());
2415 var crossDir = new Directory(new Path('$outDir$cross').toNativePath()); 2358 var crossDir = new Directory(new Path('$outDir$cross').toNativePath());
2416 if (normalDir.existsSync() && crossDir.existsSync()) { 2359 if (normalDir.existsSync() && crossDir.existsSync()) {
2417 throw "You can't have both $normalDir and $crossDir, we don't know which" 2360 throw "You can't have both $normalDir and $crossDir, we don't know which"
2418 " binary to use"; 2361 " binary to use";
2419 } 2362 }
2420 if (crossDir.existsSync()) { 2363 if (crossDir.existsSync()) {
2421 return cross; 2364 return cross;
2422 } 2365 }
2423 return normal; 2366 return normal;
2424 } 2367 }
2425 2368
2426 /** 2369 /**
2427 * Gets extra options under [key] passed to the testing script. 2370 * Gets extra options under [key] passed to the testing script.
2428 */ 2371 */
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 "tests_co19_src_LayoutTests_fast_canvas_webgl": "co19_canvas_webgl", 2404 "tests_co19_src_LayoutTests_fast_canvas_webgl": "co19_canvas_webgl",
2462 "tests_co19_src_LibTest_core_AbstractClassInstantiationError_" 2405 "tests_co19_src_LibTest_core_AbstractClassInstantiationError_"
2463 "AbstractClassInstantiationError_": "co19_abstract_class_", 2406 "AbstractClassInstantiationError_": "co19_abstract_class_",
2464 "tests_co19_src_LibTest_core_IntegerDivisionByZeroException_" 2407 "tests_co19_src_LibTest_core_IntegerDivisionByZeroException_"
2465 "IntegerDivisionByZeroException_": "co19_division_by_zero", 2408 "IntegerDivisionByZeroException_": "co19_division_by_zero",
2466 "tests_co19_src_WebPlatformTest_html_dom_documents_dom-tree-accessors_": 2409 "tests_co19_src_WebPlatformTest_html_dom_documents_dom-tree-accessors_":
2467 "co19_dom_accessors_", 2410 "co19_dom_accessors_",
2468 "tests_co19_src_WebPlatformTest_html_semantics_embedded-content_" 2411 "tests_co19_src_WebPlatformTest_html_semantics_embedded-content_"
2469 "media-elements_": "co19_media_elements", 2412 "media-elements_": "co19_media_elements",
2470 "tests_co19_src_WebPlatformTest_html_semantics_": "co19_semantics_", 2413 "tests_co19_src_WebPlatformTest_html_semantics_": "co19_semantics_",
2471
2472 "tests_co19_src_WebPlatformTest_html-templates_additions-to-" 2414 "tests_co19_src_WebPlatformTest_html-templates_additions-to-"
2473 "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_", 2415 "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
2474 "tests_co19_src_WebPlatformTest_html-templates_definitions_" 2416 "tests_co19_src_WebPlatformTest_html-templates_definitions_"
2475 "template-contents-owner": "co19_htmltemplates_contents", 2417 "template-contents-owner": "co19_htmltemplates_contents",
2476 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" 2418 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
2477 "templates_additions-to-": "co19_htmltemplates_add_", 2419 "templates_additions-to-": "co19_htmltemplates_add_",
2478 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" 2420 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
2479 "templates_appending-to-a-template_": "co19_htmltemplates_append_", 2421 "templates_appending-to-a-template_": "co19_htmltemplates_append_",
2480 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" 2422 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
2481 "templates_clearing-the-stack-back-to-a-given-context_": 2423 "templates_clearing-the-stack-back-to-a-given-context_":
2482 "co19_htmltemplates_clearstack_", 2424 "co19_htmltemplates_clearstack_",
2483 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" 2425 "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
2484 "templates_creating-an-element-for-the-token_": 2426 "templates_creating-an-element-for-the-token_":
2485 "co19_htmltemplates_create_", 2427 "co19_htmltemplates_create_",
2486 "tests_co19_src_WebPlatformTest_html-templates_template-element" 2428 "tests_co19_src_WebPlatformTest_html-templates_template-element"
2487 "_template-": "co19_htmltemplates_element-", 2429 "_template-": "co19_htmltemplates_element-",
2488 "tests_co19_src_WebPlatformTest_html-templates_": "co19_htmltemplate_", 2430 "tests_co19_src_WebPlatformTest_html-templates_": "co19_htmltemplate_",
2489
2490 "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_": 2431 "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_":
2491 "co19_shadow-trees_", 2432 "co19_shadow-trees_",
2492 "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_": 2433 "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_":
2493 "co19_shadowdom_", 2434 "co19_shadowdom_",
2494 "tests_co19_src_WebPlatformTest_shadow-dom_html-elements-in-" 2435 "tests_co19_src_WebPlatformTest_shadow-dom_html-elements-in-"
2495 "shadow-trees_": "co19_shadow_html_", 2436 "shadow-trees_": "co19_shadow_html_",
2496 "tests_co19_src_WebPlatformTest_html_webappapis_system-state-and-" 2437 "tests_co19_src_WebPlatformTest_html_webappapis_system-state-and-"
2497 "capabilities_the-navigator-object": "co19_webappapis_navigator_", 2438 "capabilities_the-navigator-object": "co19_webappapis_navigator_",
2498 "tests_co19_src_WebPlatformTest_DOMEvents_approved_": "co19_dom_approved_" 2439 "tests_co19_src_WebPlatformTest_DOMEvents_approved_": "co19_dom_approved_"
2499 }; 2440 };
(...skipping 11 matching lines...) Expand all
2511 for (var key in PATH_REPLACEMENTS.keys) { 2452 for (var key in PATH_REPLACEMENTS.keys) {
2512 if (path.startsWith(key)) { 2453 if (path.startsWith(key)) {
2513 path = path.replaceFirst(key, PATH_REPLACEMENTS[key]); 2454 path = path.replaceFirst(key, PATH_REPLACEMENTS[key]);
2514 break; 2455 break;
2515 } 2456 }
2516 } 2457 }
2517 } 2458 }
2518 return path; 2459 return path;
2519 } 2460 }
2520 } 2461 }
OLDNEW
« no previous file with comments | « tools/testing/dart/test_runner.dart ('k') | tools/testing/dart/utils.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698