| OLD | NEW |
| 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, |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 isNegative = true; | 438 isNegative = true; |
| 439 } | 439 } |
| 440 } | 440 } |
| 441 | 441 |
| 442 var commonArguments = commonArgumentsFromFile(info.filePath, | 442 var commonArguments = commonArgumentsFromFile(info.filePath, |
| 443 info.optionsFromFile); | 443 info.optionsFromFile); |
| 444 | 444 |
| 445 List<List<String>> vmOptionsList = getVmOptions(info.optionsFromFile); | 445 List<List<String>> vmOptionsList = getVmOptions(info.optionsFromFile); |
| 446 Expect.isFalse(vmOptionsList.isEmpty(), "empty vmOptionsList"); | 446 Expect.isFalse(vmOptionsList.isEmpty(), "empty vmOptionsList"); |
| 447 | 447 |
| 448 // Check for an "ExtraCommand" comment from the file, and generate | |
| 449 // a command for it, if needed. | |
| 450 var optionsFromFile = info.optionsFromFile; | |
| 451 var commands = []; | |
| 452 var command = optionsFromFile['extraCommand']; | |
| 453 var args = optionsFromFile['extraCommandArgs']; | |
| 454 addExtraCommand(command, args, commands); | |
| 455 | |
| 456 List _append(list1,list2) => []..addAll(list1)..addAll(list2); | 448 List _append(list1,list2) => []..addAll(list1)..addAll(list2); |
| 457 | 449 |
| 458 for (var vmOptions in vmOptionsList) { | 450 for (var vmOptions in vmOptionsList) { |
| 459 doTest(new TestCase('$suiteName/$testName', | 451 doTest(new TestCase('$suiteName/$testName', |
| 460 _append(commands, | 452 makeCommands(info, vmOptions, commonArguments), |
| 461 makeCommands(info, vmOptions, commonArguments)), | |
| 462 configuration, | 453 configuration, |
| 463 completeHandler, | 454 completeHandler, |
| 464 expectations, | 455 expectations, |
| 465 isNegative: isNegative, | 456 isNegative: isNegative, |
| 466 info: info)); | 457 info: info)); |
| 467 } | 458 } |
| 468 } | 459 } |
| 469 | 460 |
| 470 List<Command> makeCommands(TestInformation info, var vmOptions, var args) { | 461 List<Command> makeCommands(TestInformation info, var vmOptions, var args) { |
| 471 switch (configuration['compiler']) { | 462 switch (configuration['compiler']) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 case 'dartc': | 507 case 'dartc': |
| 517 var arguments = new List.from(vmOptions); | 508 var arguments = new List.from(vmOptions); |
| 518 arguments.addAll(args); | 509 arguments.addAll(args); |
| 519 return <Command>[new Command(shellPath(), arguments)]; | 510 return <Command>[new Command(shellPath(), arguments)]; |
| 520 | 511 |
| 521 default: | 512 default: |
| 522 throw 'Unknown compiler ${configuration["compiler"]}'; | 513 throw 'Unknown compiler ${configuration["compiler"]}'; |
| 523 } | 514 } |
| 524 } | 515 } |
| 525 | 516 |
| 526 void addExtraCommand(String command, List<String> arguments, List commands) { | |
| 527 if (command == null) return; | |
| 528 // As a special case, a command of "dart" should run with the | |
| 529 // dart VM that we are testing. | |
| 530 if (command == 'dart') { | |
| 531 command = TestUtils.vmFileName(configuration); | |
| 532 } | |
| 533 arguments = | |
| 534 arguments.map((arg)=>arg.replaceAll(r"$dartDir", dartDir.toString())); | |
| 535 commands.add(new Command(command, arguments)); | |
| 536 } | |
| 537 | |
| 538 CreateTest makeTestCaseCreator(Map optionsFromFile) { | 517 CreateTest makeTestCaseCreator(Map optionsFromFile) { |
| 539 return (Path filePath, | 518 return (Path filePath, |
| 540 bool hasCompileError, | 519 bool hasCompileError, |
| 541 bool hasRuntimeError, | 520 bool hasRuntimeError, |
| 542 {bool isNegativeIfChecked: false, | 521 {bool isNegativeIfChecked: false, |
| 543 bool hasFatalTypeErrors: false, | 522 bool hasFatalTypeErrors: false, |
| 544 Set<String> multitestOutcome: null}) { | 523 Set<String> multitestOutcome: null}) { |
| 545 // Cache the test information for each test case. | 524 // Cache the test information for each test case. |
| 546 var info = new TestInformation(filePath, | 525 var info = new TestInformation(filePath, |
| 547 optionsFromFile, | 526 optionsFromFile, |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 Path namePath = new Path(name); | 685 Path namePath = new Path(name); |
| 707 Expect.equals(namePath.extension, 'dart'); | 686 Expect.equals(namePath.extension, 'dart'); |
| 708 String baseName = namePath.filenameWithoutExtension; | 687 String baseName = namePath.filenameWithoutExtension; |
| 709 Path fromPath = filePath.directoryPath.join(namePath); | 688 Path fromPath = filePath.directoryPath.join(namePath); |
| 710 commands.add(_compileCommand( | 689 commands.add(_compileCommand( |
| 711 fromPath.toNativePath(), '$tempDir/$baseName.js', | 690 fromPath.toNativePath(), '$tempDir/$baseName.js', |
| 712 compiler, tempDir, vmOptions)); | 691 compiler, tempDir, vmOptions)); |
| 713 } | 692 } |
| 714 } | 693 } |
| 715 | 694 |
| 716 var extraCommand = optionsFromFile['extraCommand']; | |
| 717 var extraArgs = optionsFromFile['extraCommandArgs']; | |
| 718 addExtraCommand(extraCommand, extraArgs, commands); | |
| 719 | |
| 720 // Construct the command that executes the browser test | 695 // Construct the command that executes the browser test |
| 721 List<String> args; | 696 List<String> args; |
| 722 if (runtime == 'ie' || runtime == 'ff' || runtime == 'chrome' || | 697 if (runtime == 'ie' || runtime == 'ff' || runtime == 'chrome' || |
| 723 runtime == 'safari' || runtime == 'opera' || runtime == 'dartium') { | 698 runtime == 'safari' || runtime == 'opera' || runtime == 'dartium') { |
| 724 args = [dartDir.append('tools/testing/run_selenium.py').toNativePath(), | 699 args = [dartDir.append('tools/testing/run_selenium.py').toNativePath(), |
| 725 '--browser=$runtime', | 700 '--browser=$runtime', |
| 726 '--timeout=${configuration["timeout"] - 2}', | 701 '--timeout=${configuration["timeout"] - 2}', |
| 727 '--out=$htmlPath']; | 702 '--out=$htmlPath']; |
| 728 if (runtime == 'dartium') { | 703 if (runtime == 'dartium') { |
| 729 args.add('--executable=$dartiumFilename'); | 704 args.add('--executable=$dartiumFilename'); |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 RegExp staticCleanRegExp = const RegExp(r"// @static-clean"); | 963 RegExp staticCleanRegExp = const RegExp(r"// @static-clean"); |
| 989 RegExp leadingHashRegExp = const RegExp(r"^#", multiLine: true); | 964 RegExp leadingHashRegExp = const RegExp(r"^#", multiLine: true); |
| 990 RegExp isolateStubsRegExp = const RegExp(r"// IsolateStubs=(.*)"); | 965 RegExp isolateStubsRegExp = const RegExp(r"// IsolateStubs=(.*)"); |
| 991 RegExp domImportRegExp = | 966 RegExp domImportRegExp = |
| 992 const RegExp(r"^#import.*(dart:(dom|html)|html\.dart).*\)", | 967 const RegExp(r"^#import.*(dart:(dom|html)|html\.dart).*\)", |
| 993 multiLine: true); | 968 multiLine: true); |
| 994 RegExp libraryDefinitionRegExp = | 969 RegExp libraryDefinitionRegExp = |
| 995 const RegExp(r"^#library\(", multiLine: true); | 970 const RegExp(r"^#library\(", multiLine: true); |
| 996 RegExp sourceOrImportRegExp = | 971 RegExp sourceOrImportRegExp = |
| 997 const RegExp(r"^#(source|import|resource)\(", multiLine: true); | 972 const RegExp(r"^#(source|import|resource)\(", multiLine: true); |
| 998 RegExp extraCommandRegExp = | |
| 999 const RegExp(r"// ExtraCommand=(.*)", multiLine: true); | |
| 1000 RegExp extraArgsRegExp = | |
| 1001 const RegExp(r"// ExtraCommandArgs=(.*)", multiLine: true); | |
| 1002 | 973 |
| 1003 // Read the entire file into a byte buffer and transform it to a | 974 // Read the entire file into a byte buffer and transform it to a |
| 1004 // String. This will treat the file as ascii but the only parts | 975 // String. This will treat the file as ascii but the only parts |
| 1005 // we are interested in will be ascii in any case. | 976 // we are interested in will be ascii in any case. |
| 1006 RandomAccessFile file = new File.fromPath(filePath).openSync(FileMode.READ); | 977 RandomAccessFile file = new File.fromPath(filePath).openSync(FileMode.READ); |
| 1007 List chars = new List(file.lengthSync()); | 978 List chars = new List(file.lengthSync()); |
| 1008 var offset = 0; | 979 var offset = 0; |
| 1009 while (offset != chars.length) { | 980 while (offset != chars.length) { |
| 1010 offset += file.readListSync(chars, offset, chars.length - offset); | 981 offset += file.readListSync(chars, offset, chars.length - offset); |
| 1011 } | 982 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1028 | 999 |
| 1029 matches = dartOptionsRegExp.allMatches(contents); | 1000 matches = dartOptionsRegExp.allMatches(contents); |
| 1030 for (var match in matches) { | 1001 for (var match in matches) { |
| 1031 if (dartOptions != null) { | 1002 if (dartOptions != null) { |
| 1032 throw new Exception( | 1003 throw new Exception( |
| 1033 'More than one "// DartOptions=" line in test $filePath'); | 1004 'More than one "// DartOptions=" line in test $filePath'); |
| 1034 } | 1005 } |
| 1035 dartOptions = match[1].split(' ').filter((e) => e != ''); | 1006 dartOptions = match[1].split(' ').filter((e) => e != ''); |
| 1036 } | 1007 } |
| 1037 | 1008 |
| 1038 var match = extraCommandRegExp.firstMatch(contents); | |
| 1039 var extraCommand = (match != null) ? match.group(1) : null; | |
| 1040 match = extraArgsRegExp.firstMatch(contents); | |
| 1041 var extraCommandArgs = (match != null) ? match.group(1).split(' ') : []; | |
| 1042 | |
| 1043 matches = staticCleanRegExp.allMatches(contents); | 1009 matches = staticCleanRegExp.allMatches(contents); |
| 1044 for (var match in matches) { | 1010 for (var match in matches) { |
| 1045 if (isStaticClean) { | 1011 if (isStaticClean) { |
| 1046 throw new Exception( | 1012 throw new Exception( |
| 1047 'More than one "// @static-clean=" line in test $filePath'); | 1013 'More than one "// @static-clean=" line in test $filePath'); |
| 1048 } | 1014 } |
| 1049 isStaticClean = true; | 1015 isStaticClean = true; |
| 1050 } | 1016 } |
| 1051 | 1017 |
| 1052 List<String> otherScripts = new List<String>(); | 1018 List<String> otherScripts = new List<String>(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1077 "hasRuntimeError": hasRuntimeError, | 1043 "hasRuntimeError": hasRuntimeError, |
| 1078 "isStaticClean" : isStaticClean, | 1044 "isStaticClean" : isStaticClean, |
| 1079 "otherScripts": otherScripts, | 1045 "otherScripts": otherScripts, |
| 1080 "isMultitest": isMultitest, | 1046 "isMultitest": isMultitest, |
| 1081 "containsLeadingHash": containsLeadingHash, | 1047 "containsLeadingHash": containsLeadingHash, |
| 1082 "isolateStubs": isolateStubs, | 1048 "isolateStubs": isolateStubs, |
| 1083 "containsDomImport": containsDomImport, | 1049 "containsDomImport": containsDomImport, |
| 1084 "isLibraryDefinition": isLibraryDefinition, | 1050 "isLibraryDefinition": isLibraryDefinition, |
| 1085 "containsSourceOrImport": containsSourceOrImport, | 1051 "containsSourceOrImport": containsSourceOrImport, |
| 1086 "numStaticTypeAnnotations": numStaticTypeAnnotations, | 1052 "numStaticTypeAnnotations": numStaticTypeAnnotations, |
| 1087 "numCompileTimeAnnotations": numCompileTimeAnnotations, | 1053 "numCompileTimeAnnotations": numCompileTimeAnnotations }; |
| 1088 "extraCommand": extraCommand, | |
| 1089 "extraCommandArgs": extraCommandArgs}; | |
| 1090 } | 1054 } |
| 1091 | 1055 |
| 1092 List<List<String>> getVmOptions(Map optionsFromFile) { | 1056 List<List<String>> getVmOptions(Map optionsFromFile) { |
| 1093 bool needsVmOptions = Contains(configuration['compiler'], | 1057 bool needsVmOptions = Contains(configuration['compiler'], |
| 1094 const ['none', 'dart2dart', 'dartc']) && | 1058 const ['none', 'dart2dart', 'dartc']) && |
| 1095 Contains(configuration['runtime'], | 1059 Contains(configuration['runtime'], |
| 1096 const ['none', 'vm', 'drt', 'dartium']); | 1060 const ['none', 'vm', 'drt', 'dartium']); |
| 1097 if (!needsVmOptions) return [[]]; | 1061 if (!needsVmOptions) return [[]]; |
| 1098 return optionsFromFile['vmOptions']; | 1062 return optionsFromFile['vmOptions']; |
| 1099 } | 1063 } |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1491 * $noCrash tests are expected to be flaky but not crash | 1455 * $noCrash tests are expected to be flaky but not crash |
| 1492 * $pass tests are expected to pass | 1456 * $pass tests are expected to pass |
| 1493 * $failOk tests are expected to fail that we won't fix | 1457 * $failOk tests are expected to fail that we won't fix |
| 1494 * $fail tests are expected to fail that we should fix | 1458 * $fail tests are expected to fail that we should fix |
| 1495 * $crash tests are expected to crash that we should fix | 1459 * $crash tests are expected to crash that we should fix |
| 1496 * $timeout tests are allowed to timeout | 1460 * $timeout tests are allowed to timeout |
| 1497 """; | 1461 """; |
| 1498 print(report); | 1462 print(report); |
| 1499 } | 1463 } |
| 1500 } | 1464 } |
| OLD | NEW |