Index: tools/status_clean.dart |
diff --git a/tools/status_clean.dart b/tools/status_clean.dart |
index c5198b93639ca28a6846b97a64dc3c524d27b356..474b8c2f3b4c636e41672815616a5b7347f335dd 100644 |
--- a/tools/status_clean.dart |
+++ b/tools/status_clean.dart |
@@ -10,40 +10,55 @@ import "dart:io"; |
import "testing/dart/multitest.dart"; |
import "testing/dart/status_file_parser.dart"; |
import "testing/dart/test_suite.dart" |
- show multiHtmlTestGroupRegExp, multiTestRegExp, multiHtmlTestRegExp, |
- TestUtils; |
+ show |
+ multiHtmlTestGroupRegExp, |
+ multiTestRegExp, |
+ multiHtmlTestRegExp, |
+ TestUtils; |
import "testing/dart/utils.dart" show Path; |
// [STATUS_TUPLES] is a list of (suite-name, directory, status-file)-tuples. |
final STATUS_TUPLES = [ |
- ["corelib", "tests/corelib", "tests/corelib/corelib.status"], |
- ["html", "tests/html", "tests/html/html.status"], |
- ["isolate", "tests/isolate", "tests/isolate/isolate.status"], |
- ["language", "tests/language", "tests/language/language.status"], |
- ["language", "tests/language", "tests/language/language_analyzer2.status"], |
- ["language","tests/language", "tests/language/language_analyzer.status"], |
- ["language","tests/language", "tests/language/language_dart2js.status"], |
- ["lib", "tests/lib", "tests/lib/lib.status"], |
- ["standalone", "tests/standalone", "tests/standalone/standalone.status"], |
- ["pkg", "pkg", "pkg/pkg.status"], |
- ["pkgbuild", ".", "pkg/pkgbuild.status"], |
- ["utils", "tests/utils", "tests/utils/utils.status"], |
- ["samples", "samples", "samples/samples.status"], |
- ["analyze_library", "sdk", "tests/lib/analyzer/analyze_library.status"], |
- ["dart2js_extra", "tests/compiler/dart2js_extra", |
- "tests/compiler/dart2js_extra/dart2js_extra.status"], |
- ["dart2js_native", "tests/compiler/dart2js_native", |
- "tests/compiler/dart2js_native/dart2js_native.status"], |
- ["dart2js", "tests/compiler/dart2js", |
- "tests/compiler/dart2js/dart2js.status"], |
- ["benchmark_smoke", "tests/benchmark_smoke", |
- "tests/benchmark_smoke/benchmark_smoke.status"], |
- ["co19", "tests/co19/src", "tests/co19/co19-analyzer2.status"], |
- ["co19", "tests/co19/src", "tests/co19/co19-analyzer.status"], |
- ["co19", "tests/co19/src", "tests/co19/co19-dart2js.status"], |
- ["co19", "tests/co19/src", "tests/co19/co19-co19.status"], |
- ["co19", "tests/co19/src", "tests/co19/co19-dartium.status"], |
- ["co19", "tests/co19/src", "tests/co19/co19-runtime.status"], |
+ ["corelib", "tests/corelib", "tests/corelib/corelib.status"], |
+ ["html", "tests/html", "tests/html/html.status"], |
+ ["isolate", "tests/isolate", "tests/isolate/isolate.status"], |
+ ["language", "tests/language", "tests/language/language.status"], |
+ ["language", "tests/language", "tests/language/language_analyzer2.status"], |
+ ["language", "tests/language", "tests/language/language_analyzer.status"], |
+ ["language", "tests/language", "tests/language/language_dart2js.status"], |
+ ["lib", "tests/lib", "tests/lib/lib.status"], |
+ ["standalone", "tests/standalone", "tests/standalone/standalone.status"], |
+ ["pkg", "pkg", "pkg/pkg.status"], |
+ ["pkgbuild", ".", "pkg/pkgbuild.status"], |
+ ["utils", "tests/utils", "tests/utils/utils.status"], |
+ ["samples", "samples", "samples/samples.status"], |
+ ["analyze_library", "sdk", "tests/lib/analyzer/analyze_library.status"], |
+ [ |
+ "dart2js_extra", |
+ "tests/compiler/dart2js_extra", |
+ "tests/compiler/dart2js_extra/dart2js_extra.status" |
+ ], |
+ [ |
+ "dart2js_native", |
+ "tests/compiler/dart2js_native", |
+ "tests/compiler/dart2js_native/dart2js_native.status" |
+ ], |
+ [ |
+ "dart2js", |
+ "tests/compiler/dart2js", |
+ "tests/compiler/dart2js/dart2js.status" |
+ ], |
+ [ |
+ "benchmark_smoke", |
+ "tests/benchmark_smoke", |
+ "tests/benchmark_smoke/benchmark_smoke.status" |
+ ], |
+ ["co19", "tests/co19/src", "tests/co19/co19-analyzer2.status"], |
+ ["co19", "tests/co19/src", "tests/co19/co19-analyzer.status"], |
+ ["co19", "tests/co19/src", "tests/co19/co19-dart2js.status"], |
+ ["co19", "tests/co19/src", "tests/co19/co19-co19.status"], |
+ ["co19", "tests/co19/src", "tests/co19/co19-dartium.status"], |
+ ["co19", "tests/co19/src", "tests/co19/co19-runtime.status"], |
]; |
void main(List<String> args) { |
@@ -107,16 +122,16 @@ class StatusFileNonExistentTestRemover extends StatusFileProcessor { |
}); |
} |
- bool _testExists(String filePath, |
- List<String> testFiles, |
- String directory, |
- TestRule rule) { |
+ bool _testExists(String filePath, List<String> testFiles, String directory, |
+ TestRule rule) { |
// TODO: Unify this regular expression matching with status_file_parser.dart |
List<RegExp> getRuleRegex(String name) { |
- return name.split("/") |
+ return name |
+ .split("/") |
.map((name) => new RegExp(name.replaceAll('*', '.*'))) |
.toList(); |
} |
+ |
bool matchRegexp(List<RegExp> patterns, String str) { |
var parts = str.split("/"); |
if (patterns.length > parts.length) { |
@@ -135,8 +150,8 @@ class StatusFileNonExistentTestRemover extends StatusFileProcessor { |
return testFiles.any((String file) { |
// TODO: Use test_suite.dart's [buildTestCaseDisplayName] instead. |
var filePath = new Path(file).relativeTo(new Path(directory)); |
- String baseTestName = _concat("${filePath.directoryPath}", |
- "${filePath.filenameWithoutExtension}"); |
+ String baseTestName = _concat( |
+ "${filePath.directoryPath}", "${filePath.filenameWithoutExtension}"); |
List<String> testNames = []; |
for (var name in multiTestDetector.getMultitestNames(file)) { |
@@ -148,21 +163,20 @@ class StatusFileNonExistentTestRemover extends StatusFileProcessor { |
testNames.add(baseTestName); |
} |
- return testNames.any( |
- (String testName) => matchRegexp(rulePattern, testName)); |
+ return testNames |
+ .any((String testName) => matchRegexp(rulePattern, testName)); |
}); |
} |
- Set<int> _analyzeStatusFile(String directory, |
- String filePath, |
- List<Section> sections) { |
+ Set<int> _analyzeStatusFile( |
+ String directory, String filePath, List<Section> sections) { |
var invalidLines = new Set<int>(); |
var dartFiles = testFileLister.listTestFiles(directory); |
for (var section in sections) { |
for (var rule in section.testRules) { |
if (!_testExists(filePath, dartFiles, directory, rule)) { |
print("Invalid rule: ${rule.name} in file " |
- "$filePath:${rule.lineNumber}"); |
+ "$filePath:${rule.lineNumber}"); |
invalidLines.add(rule.lineNumber); |
} |
} |
@@ -181,7 +195,7 @@ class StatusFileNonExistentTestRemover extends StatusFileProcessor { |
} |
var outputFile = new File("$statusFilePath.fixed"); |
outputFile.writeAsStringSync(outputLines.join("\n")); |
- } |
+ } |
String _concat(String base, String part) { |
if (base == "") return part; |
@@ -197,15 +211,14 @@ class StatusFileDeflaker extends StatusFileProcessor { |
return _readSections(filePath).then((List<Section> sections) { |
return _generatedDeflakedLines(suiteName, sections) |
.then((Map<int, String> fixedLines) { |
- if (fixedLines.length > 0) { |
- return _writeFixedStatusFile(filePath, fixedLines); |
- } |
+ if (fixedLines.length > 0) { |
+ return _writeFixedStatusFile(filePath, fixedLines); |
+ } |
}); |
}); |
} |
- Future _generatedDeflakedLines(String suiteName, |
- List<Section> sections) { |
+ Future _generatedDeflakedLines(String suiteName, List<Section> sections) { |
var fixedLines = new Map<int, String>(); |
return Future.forEach(sections, (Section section) { |
return Future.forEach(section.testRules, (rule) { |
@@ -214,10 +227,8 @@ class StatusFileDeflaker extends StatusFileProcessor { |
}).then((_) => fixedLines); |
} |
- Future _maybeFixStatusfileLine(String suiteName, |
- Section section, |
- TestRule rule, |
- Map<int, String> fixedLines) { |
+ Future _maybeFixStatusfileLine(String suiteName, Section section, |
+ TestRule rule, Map<int, String> fixedLines) { |
print("Processing ${section.statusFile.location}: ${rule.lineNumber}"); |
// None of our status file lines have expressions, so we pass {} here. |
var notedOutcomes = rule.expression |
@@ -231,9 +242,9 @@ class StatusFileDeflaker extends StatusFileProcessor { |
// TODO: [rule.name] is actually a pattern not just a testname. We should |
// find all possible testnames this rule matches against and unify the |
// outcomes of these tests. |
- return _testOutcomeFetcher.outcomesOf(suiteName, section, rule.name) |
- .then((Set<Expectation> actualOutcomes) { |
- |
+ return _testOutcomeFetcher |
+ .outcomesOf(suiteName, section, rule.name) |
+ .then((Set<Expectation> actualOutcomes) { |
var outcomesThatNeverHappened = new Set<Expectation>(); |
for (Expectation notedOutcome in notedOutcomes) { |
bool found = false; |
@@ -251,11 +262,11 @@ class StatusFileDeflaker extends StatusFileProcessor { |
if (outcomesThatNeverHappened.length > 0 && actualOutcomes.length > 0) { |
// Print the change to stdout. |
print("${rule.name} " |
- "(${section.statusFile.location}:${rule.lineNumber}):"); |
+ "(${section.statusFile.location}:${rule.lineNumber}):"); |
print(" Actual outcomes: ${actualOutcomes.toList()}"); |
print(" Outcomes in status file: ${notedOutcomes.toList()}"); |
print(" Outcomes in status file that never happened : " |
- "${outcomesThatNeverHappened.toList()}\n"); |
+ "${outcomesThatNeverHappened.toList()}\n"); |
// Build the fixed status file line. |
fixedLines[rule.lineNumber] = |
@@ -279,13 +290,12 @@ class StatusFileDeflaker extends StatusFileProcessor { |
var output = outputLines.join("\n"); |
var outputFile = new File("$filePath.deflaked"); |
outputFile.writeAsStringSync(output); |
- } |
+ } |
} |
class MultiTestDetector { |
- final multiTestsCache = new Map<String,List<String>>(); |
- final multiHtmlTestsCache = new Map<String,List<String>>(); |
- |
+ final multiTestsCache = new Map<String, List<String>>(); |
+ final multiHtmlTestsCache = new Map<String, List<String>>(); |
List<String> getMultitestNames(String file) { |
List<String> names = []; |
@@ -317,8 +327,9 @@ class MultiTestDetector { |
var content = new File(file).readAsStringSync(); |
if (multiHtmlTestRegExp.hasMatch(content)) { |
- var matchesIter = multiHtmlTestGroupRegExp.allMatches(content).iterator; |
- while(matchesIter.moveNext()) { |
+ var matchesIter = |
+ multiHtmlTestGroupRegExp.allMatches(content).iterator; |
+ while (matchesIter.moveNext()) { |
String fullMatch = matchesIter.current.group(0); |
subtestNames.add(fullMatch.substring(fullMatch.indexOf("'") + 1)); |
} |
@@ -339,10 +350,11 @@ class TestFileLister { |
return _filesCache.putIfAbsent(directory, () { |
var dir = new Directory(directory); |
// Cannot test for _test.dart because co19 tests don't have that ending. |
- var dartFiles = dir.listSync(recursive: true) |
+ var dartFiles = dir |
+ .listSync(recursive: true) |
.where((fe) => fe is File) |
- .where((file) => file.path.endsWith(".dart") || |
- file.path.endsWith("_test.html")) |
+ .where((file) => |
+ file.path.endsWith(".dart") || file.path.endsWith("_test.html")) |
.map((file) => file.path) |
.toList(); |
return dartFiles; |
@@ -350,7 +362,6 @@ class TestFileLister { |
} |
} |
- |
/* |
* [TestOutcomeFetcher] will fetch test results from a server using a REST-like |
* interface. |
@@ -363,53 +374,60 @@ class TestOutcomeFetcher { |
Future<Set<Expectation>> outcomesOf( |
String suiteName, Section section, String testName) { |
- var pathComponents = ['json', 'test-outcomes', 'outcomes', |
- Uri.encodeComponent("$suiteName/$testName")]; |
+ var pathComponents = [ |
+ 'json', |
+ 'test-outcomes', |
+ 'outcomes', |
+ Uri.encodeComponent("$suiteName/$testName") |
+ ]; |
var path = pathComponents.join('/') + '/'; |
var url = new Uri(scheme: 'http', host: SERVER, port: PORT, path: path); |
- return _client.getUrl(url) |
- .then((HttpClientRequest request) => request.close()) |
- .then((HttpClientResponse response) { |
- return response.transform(UTF8.decoder).transform(JSON.decoder).first |
- .then((List testResults) { |
- var setOfActualOutcomes = new Set<Expectation>(); |
- |
- try { |
- for (var result in testResults) { |
- var config = result['configuration']; |
- var testResult = result['test_result']; |
- var outcome = testResult['outcome']; |
- |
- // These variables are derived variables and will be set in |
- // tools/testing/dart/test_options.dart. |
- // [Mostly due to the fact that we don't have an unary ! |
- // operator in status file expressions.] |
- config['unchecked'] = !config['checked']; |
- config['unminified'] = !config['minified']; |
- config['nocsp'] = !config['csp']; |
- config['browser'] = |
- TestUtils.isBrowserRuntime(config['runtime']); |
- config['analyzer'] = |
- TestUtils.isCommandLineAnalyzer(config['compiler']); |
- config['jscl'] = |
- TestUtils.isJsCommandLineRuntime(config['runtime']); |
- |
- if (section.condition == null || |
- section.condition.evaluate(config)) { |
- setOfActualOutcomes.add(Expectation.byName(outcome)); |
- } |
- } |
- return setOfActualOutcomes; |
- } catch (error) { |
- print("Warning: Error occured while processing testoutcomes" |
- ": $error"); |
- return []; |
- } |
- }).catchError((error) { |
- print("Warning: Error occured while fetching testoutcomes: $error"); |
- return []; |
- }); |
+ return _client |
+ .getUrl(url) |
+ .then((HttpClientRequest request) => request.close()) |
+ .then((HttpClientResponse response) { |
+ return response |
+ .transform(UTF8.decoder) |
+ .transform(JSON.decoder) |
+ .first |
+ .then((List testResults) { |
+ var setOfActualOutcomes = new Set<Expectation>(); |
+ |
+ try { |
+ for (var result in testResults) { |
+ var config = result['configuration']; |
+ var testResult = result['test_result']; |
+ var outcome = testResult['outcome']; |
+ |
+ // These variables are derived variables and will be set in |
+ // tools/testing/dart/test_options.dart. |
+ // [Mostly due to the fact that we don't have an unary ! |
+ // operator in status file expressions.] |
+ config['unchecked'] = !config['checked']; |
+ config['unminified'] = !config['minified']; |
+ config['nocsp'] = !config['csp']; |
+ config['browser'] = TestUtils.isBrowserRuntime(config['runtime']); |
+ config['analyzer'] = |
+ TestUtils.isCommandLineAnalyzer(config['compiler']); |
+ config['jscl'] = |
+ TestUtils.isJsCommandLineRuntime(config['runtime']); |
+ |
+ if (section.condition == null || |
+ section.condition.evaluate(config)) { |
+ setOfActualOutcomes.add(Expectation.byName(outcome)); |
+ } |
+ } |
+ return setOfActualOutcomes; |
+ } catch (error) { |
+ print("Warning: Error occured while processing testoutcomes" |
+ ": $error"); |
+ return []; |
+ } |
+ }).catchError((error) { |
+ print("Warning: Error occured while fetching testoutcomes: $error"); |
+ return []; |
+ }); |
}); |
} |
} |