Index: Tools/GardeningServer/scripts/results.js |
diff --git a/Tools/GardeningServer/scripts/results.js b/Tools/GardeningServer/scripts/results.js |
index 52e1735ba32aa30ff1420f8890060c68ac899550..74c50991e5d7d4b1e2b6ad428839484a863d10ac 100644 |
--- a/Tools/GardeningServer/scripts/results.js |
+++ b/Tools/GardeningServer/scripts/results.js |
@@ -27,8 +27,6 @@ var results = results || {}; |
(function() { |
-var kResultsName = 'failing_results.json'; |
- |
var PASS = 'PASS'; |
var TIMEOUT = 'TIMEOUT'; |
var TEXT = 'TEXT'; |
@@ -95,8 +93,6 @@ function possibleSuffixListFor(failureTypeList) |
suffixList.push(kActualTextSuffix); |
suffixList.push(kExpectedTextSuffix); |
suffixList.push(kDiffTextSuffix); |
- // '-wdiff.html', |
- // '-pretty-diff.html', |
} |
failureTypeList.forEach(function(failureType) { |
@@ -140,129 +136,9 @@ function failureTypeList(failureBlob) |
function resultsDirectoryURL(builderName) |
{ |
- return config.layoutTestResultsURL + '/' + config.resultsDirectoryNameFromBuilderName(builderName) + '/results/layout-test-results/'; |
-} |
- |
-function resultsDirectoryURLForBuildNumber(builderName, buildNumber) |
-{ |
- return config.layoutTestResultsURL + '/' + config.resultsDirectoryNameFromBuilderName(builderName) + '/' + buildNumber + '/' ; |
-} |
- |
-function resultsSummaryURL(builderName) |
-{ |
- return resultsDirectoryURL(builderName) + kResultsName; |
+ return config.layoutTestResultsURL + '/' + builderName.replace(/[ .()]/g, '_') + '/results/layout-test-results/'; |
} |
-var g_resultsCache = new base.AsynchronousCache(function(key) { |
- return net.jsonp(key); |
-}); |
- |
-results.ResultAnalyzer = function(resultNode) |
-{ |
- this._isUnexpected = resultNode.is_unexpected; |
- this._actual = resultNode ? failureTypeList(resultNode.actual) : []; |
- this._expected = resultNode ? this._addImpliedExpectations(failureTypeList(resultNode.expected)) : []; |
-}; |
- |
-results.ResultAnalyzer.prototype = { |
- _addImpliedExpectations: function(resultsList) |
- { |
- if (resultsList.indexOf('FAIL') == -1) |
- return resultsList; |
- return resultsList.concat(kFailingResults); |
- }, |
- _hasPass: function(results) |
- { |
- return results.indexOf(PASS) != -1; |
- }, |
- unexpectedResults: function() |
- { |
- return this._actual.filter(function(result) { |
- return this._expected.indexOf(result) == -1; |
- }, this); |
- }, |
- succeeded: function() |
- { |
- return this._hasPass(this._actual); |
- }, |
- flaky: function() |
- { |
- return this._actual.length > 1; |
- }, |
- wontfix: function() |
- { |
- return this._expected.indexOf('WONTFIX') != -1; |
- }, |
- hasUnexpectedFailures: function() |
- { |
- return this._isUnexpected; |
- }, |
-}; |
- |
-function isUnexpectedFailure(resultNode) |
-{ |
- var analyzer = new results.ResultAnalyzer(resultNode); |
- return analyzer.hasUnexpectedFailures() && !analyzer.succeeded() && !analyzer.flaky() && !analyzer.wontfix(); |
-} |
- |
-function isResultNode(node) |
-{ |
- return !!node.actual; |
-} |
- |
-results._joinPath = function(parent, child) |
-{ |
- if (parent.length == 0) |
- return child; |
- return parent + '/' + child; |
-}; |
- |
-results._filterTree = function(tree, isLeaf, predicate) |
-{ |
- var filteredTree = {}; |
- |
- function walkSubtree(subtree, directory) |
- { |
- for (var childName in subtree) { |
- var child = subtree[childName]; |
- var childPath = results._joinPath(directory, childName); |
- if (isLeaf(child)) { |
- if (predicate(child)) |
- filteredTree[childPath] = child; |
- continue; |
- } |
- walkSubtree(child, childPath); |
- } |
- } |
- |
- walkSubtree(tree, ''); |
- return filteredTree; |
-}; |
- |
-results.unexpectedFailures = function(resultsTree) |
-{ |
- return results._filterTree(resultsTree.tests, isResultNode, isUnexpectedFailure); |
-}; |
- |
-function resultsByTest(resultsByBuilder, filter) |
-{ |
- var resultsByTest = {}; |
- |
- Object.keys(resultsByBuilder, function(builderName, resultsTree) { |
- Object.keys(filter(resultsTree), function(testName, resultNode) { |
- resultsByTest[testName] = resultsByTest[testName] || {}; |
- resultsByTest[testName][builderName] = resultNode; |
- }); |
- }); |
- |
- return resultsByTest; |
-} |
- |
-results.unexpectedFailuresByTest = function(resultsByBuilder) |
-{ |
- return resultsByTest(resultsByBuilder, results.unexpectedFailures); |
-}; |
- |
results.failureInfo = function(testName, builderName, result) |
{ |
return { |
@@ -272,150 +148,6 @@ results.failureInfo = function(testName, builderName, result) |
}; |
} |
-// Callback data is [{ buildNumber:, url: }] |
-function historicalResultsLocations(builderName) |
-{ |
- return builders.mostRecentBuildForBuilder(builderName).then(function (mostRecentBuildNumber) { |
- var resultsLocations = []; |
- // Return the builds in reverse chronological order in order to load the most recent data first. |
- for (var buildNumber = mostRecentBuildNumber; buildNumber > mostRecentBuildNumber - 100; --buildNumber) { |
- resultsLocations.push({ |
- 'buildNumber': buildNumber, |
- 'url': resultsDirectoryURLForBuildNumber(builderName, buildNumber) + "failing_results.json" |
- }); |
- } |
- return resultsLocations; |
- }); |
-} |
- |
-// This will repeatedly call continueCallback(revision, resultNode) until it returns false. |
-function walkHistory(builderName, testName, continueCallback) |
-{ |
- var indexOfNextKeyToFetch = 0; |
- var keyList = []; |
- |
- function continueWalk() |
- { |
- if (indexOfNextKeyToFetch >= keyList.length) { |
- processResultNode(0, null); |
- return; |
- } |
- |
- var resultsURL = keyList[indexOfNextKeyToFetch].url; |
- ++indexOfNextKeyToFetch; |
- g_resultsCache.get(resultsURL).then(function(resultsTree) { |
- if (!Object.size(resultsTree)) { |
- continueWalk(); |
- return; |
- } |
- var resultNode = results.resultNodeForTest(resultsTree, testName); |
- var revision = parseInt(resultsTree['blink_revision']); |
- if (isNaN(revision)) |
- revision = 0; |
- processResultNode(revision, resultNode); |
- }); |
- } |
- |
- function processResultNode(revision, resultNode) |
- { |
- var shouldContinue = continueCallback(revision, resultNode); |
- if (!shouldContinue) |
- return; |
- continueWalk(); |
- } |
- |
- historicalResultsLocations(builderName).then(function(resultsLocations) { |
- keyList = resultsLocations; |
- continueWalk(); |
- }); |
-} |
- |
-results.regressionRangeForFailure = function(builderName, testName) { |
- return new Promise(function(resolve, reject) { |
- var oldestFailingRevision = 0; |
- var newestPassingRevision = 0; |
- |
- walkHistory(builderName, testName, function(revision, resultNode) { |
- if (!revision) { |
- resolve([oldestFailingRevision, newestPassingRevision]); |
- return false; |
- } |
- if (!resultNode) { |
- newestPassingRevision = revision; |
- resolve([oldestFailingRevision, newestPassingRevision]); |
- return false; |
- } |
- if (isUnexpectedFailure(resultNode)) { |
- oldestFailingRevision = revision; |
- return true; |
- } |
- if (!oldestFailingRevision) |
- return true; // We need to keep looking for a failing revision. |
- newestPassingRevision = revision; |
- resolve([oldestFailingRevision, newestPassingRevision]); |
- return false; |
- }); |
- }); |
-}; |
- |
-function mergeRegressionRanges(regressionRanges) |
-{ |
- var mergedRange = {}; |
- |
- mergedRange.oldestFailingRevision = 0; |
- mergedRange.newestPassingRevision = 0; |
- |
- Object.keys(regressionRanges, function(builderName, range) { |
- if (!range.oldestFailingRevision && !range.newestPassingRevision) |
- return |
- |
- if (!mergedRange.oldestFailingRevision) |
- mergedRange.oldestFailingRevision = range.oldestFailingRevision; |
- if (!mergedRange.newestPassingRevision) |
- mergedRange.newestPassingRevision = range.newestPassingRevision; |
- |
- if (range.oldestFailingRevision && range.oldestFailingRevision < mergedRange.oldestFailingRevision) |
- mergedRange.oldestFailingRevision = range.oldestFailingRevision; |
- if (range.newestPassingRevision > mergedRange.newestPassingRevision) |
- mergedRange.newestPassingRevision = range.newestPassingRevision; |
- }); |
- |
- return mergedRange; |
-} |
- |
-results.unifyRegressionRanges = function(builderNameList, testName) { |
- var regressionRanges = {}; |
- |
- var rangePromises = []; |
- builderNameList.forEach(function(builderName) { |
- rangePromises.push(results.regressionRangeForFailure(builderName, testName) |
- .then(function(result) { |
- var oldestFailingRevision = result[0]; |
- var newestPassingRevision = result[1]; |
- var range = {}; |
- range.oldestFailingRevision = oldestFailingRevision; |
- range.newestPassingRevision = newestPassingRevision; |
- regressionRanges[builderName] = range; |
- })); |
- }); |
- return Promise.all(rangePromises).then(function() { |
- var mergedRange = mergeRegressionRanges(regressionRanges); |
- return [mergedRange.oldestFailingRevision, mergedRange.newestPassingRevision]; |
- }); |
-}; |
- |
-results.resultNodeForTest = function(resultsTree, testName) |
-{ |
- var testNamePath = testName.split('/'); |
- var currentNode = resultsTree['tests']; |
- testNamePath.forEach(function(segmentName) { |
- if (!currentNode) |
- return; |
- currentNode = (segmentName in currentNode) ? currentNode[segmentName] : null; |
- }); |
- return currentNode; |
-}; |
- |
results.resultKind = function(url) |
{ |
if (/-actual\.[a-z]+$/.test(url)) |
@@ -480,19 +212,4 @@ results.fetchResultsURLs = function(failureInfo) |
}); |
}; |
-results.fetchResultsByBuilder = function(builderNameList) |
-{ |
- var resultsByBuilder = {}; |
- var fetchPromises = []; |
- builderNameList.forEach(function(builderName) { |
- var resultsURL = resultsSummaryURL(builderName); |
- fetchPromises.push(net.jsonp(resultsURL).then(function(resultsTree) { |
- resultsByBuilder[builderName] = resultsTree; |
- })); |
- }); |
- return Promise.all(fetchPromises).then(function() { |
- return resultsByBuilder; |
- }); |
-}; |
- |
})(); |