Index: Tools/GardeningServer/scripts/results.js |
diff --git a/Tools/GardeningServer/scripts/results.js b/Tools/GardeningServer/scripts/results.js |
index b2a4331bd32c00759c084bc8622092d67d5b16fa..6d909aab46c0b383ae7243cdec8ebcf6e209a0f2 100644 |
--- a/Tools/GardeningServer/scripts/results.js |
+++ b/Tools/GardeningServer/scripts/results.js |
@@ -74,9 +74,9 @@ results.kDiffKind = 'diff'; |
results.kUnknownKind = 'unknown'; |
// Types of tests. |
-results.kImageType = 'image' |
-results.kAudioType = 'audio' |
-results.kTextType = 'text' |
+results.kImageType = 'image'; |
+results.kAudioType = 'audio'; |
+results.kTextType = 'text'; |
// FIXME: There are more types of tests. |
function possibleSuffixListFor(failureTypeList) |
@@ -195,8 +195,8 @@ function resultsSummaryURLForBuildNumber(builderName, buildNumber) |
return resultsDirectoryURLForBuildNumber(builderName, buildNumber) + kResultsName; |
} |
-var g_resultsCache = new base.AsynchronousCache(function (key, callback) { |
- net.jsonp(key).then(callback); |
+var g_resultsCache = new base.AsynchronousCache(function(key) { |
+ return net.jsonp(key); |
}); |
results.ResultAnalyzer = base.extends(Object, { |
@@ -313,10 +313,9 @@ results.collectUnexpectedResults = function(dictionaryOfResultNodes) |
}; |
// Callback data is [{ buildNumber:, url: }] |
-function historicalResultsLocations(builderName, callback) |
+function historicalResultsLocations(builderName) |
{ |
var historicalResultsData = []; |
- |
function parseListingDocument(prefixListingDocument) { |
$(prefixListingDocument).find("Prefix").each(function() { |
var buildString = this.textContent.replace(config.resultsDirectoryNameFromBuilderName(builderName) + '/', ''); |
@@ -327,25 +326,30 @@ function historicalResultsLocations(builderName, callback) |
'url': resultsSummaryURLForBuildNumber(builderName, buildNumber) |
}; |
historicalResultsData.unshift(resultsData); |
- } |
+ } |
}); |
var nextMarker = $(prefixListingDocument).find('NextMarker').get(); |
if (nextMarker.length) { |
var nextListingURL = resultsPrefixListingURL(builderName, nextMarker[0].textContent); |
- net.xml(nextListingURL).then(parseListingDocument); |
+ return net.xml(nextListingURL).then(function(doc) { |
+ return parseListingDocument(doc); |
+ }); |
} else { |
- callback(historicalResultsData); |
+ return historicalResultsData; |
} |
} |
- builders.mostRecentBuildForBuilder(builderName, function (mostRecentBuildNumber) { |
+ return builders.mostRecentBuildForBuilder(builderName).then(function (mostRecentBuildNumber) { |
var marker = config.resultsDirectoryNameFromBuilderName(builderName) + "/" + (mostRecentBuildNumber - 100) + "/"; |
var listingURL = resultsPrefixListingURL(builderName, marker); |
- net.xml(listingURL).then(parseListingDocument); |
+ return net.xml(listingURL).then(function(doc) { |
+ return parseListingDocument(doc); |
+ }); |
}); |
} |
-function walkHistory(builderName, testName, callback) |
+// This will repeatedly call continueCallback(revision, resultNode) until it returns false. |
+function walkHistory(builderName, testName, continueCallback) |
{ |
var indexOfNextKeyToFetch = 0; |
var keyList = []; |
@@ -359,13 +363,13 @@ function walkHistory(builderName, testName, callback) |
var resultsURL = keyList[indexOfNextKeyToFetch].url; |
++indexOfNextKeyToFetch; |
- g_resultsCache.get(resultsURL, function(resultsTree) { |
+ g_resultsCache.get(resultsURL).then(function(resultsTree) { |
if ($.isEmptyObject(resultsTree)) { |
continueWalk(); |
return; |
} |
var resultNode = results.resultNodeForTest(resultsTree, testName); |
- var revision = parseInt(resultsTree['blink_revision']) |
+ var revision = parseInt(resultsTree['blink_revision']); |
if (isNaN(revision)) |
revision = 0; |
processResultNode(revision, resultNode); |
@@ -374,42 +378,43 @@ function walkHistory(builderName, testName, callback) |
function processResultNode(revision, resultNode) |
{ |
- var shouldContinue = callback(revision, resultNode); |
+ var shouldContinue = continueCallback(revision, resultNode); |
if (!shouldContinue) |
return; |
continueWalk(); |
} |
- historicalResultsLocations(builderName, function(resultsLocations) { |
+ historicalResultsLocations(builderName).then(function(resultsLocations) { |
keyList = resultsLocations; |
continueWalk(); |
}); |
} |
-results.regressionRangeForFailure = function(builderName, testName, callback) |
-{ |
- var oldestFailingRevision = 0; |
- var newestPassingRevision = 0; |
+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) { |
- callback(oldestFailingRevision, newestPassingRevision); |
- return false; |
- } |
- if (!resultNode) { |
+ 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; |
- callback(oldestFailingRevision, newestPassingRevision); |
+ 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; |
- callback(oldestFailingRevision, newestPassingRevision); |
- return false; |
+ }); |
}); |
}; |
@@ -438,23 +443,24 @@ function mergeRegressionRanges(regressionRanges) |
return mergedRange; |
} |
-results.unifyRegressionRanges = function(builderNameList, testName, callback) |
-{ |
+results.unifyRegressionRanges = function(builderNameList, testName) { |
var regressionRanges = {}; |
- var tracker = new base.RequestTracker(builderNameList.length, function() { |
- var mergedRange = mergeRegressionRanges(regressionRanges); |
- callback(mergedRange.oldestFailingRevision, mergedRange.newestPassingRevision); |
- }); |
- |
+ var rangePromises = []; |
$.each(builderNameList, function(index, builderName) { |
- results.regressionRangeForFailure(builderName, testName, function(oldestFailingRevision, newestPassingRevision) { |
- var range = {}; |
- range.oldestFailingRevision = oldestFailingRevision; |
- range.newestPassingRevision = newestPassingRevision; |
- regressionRanges[builderName] = range; |
- tracker.requestComplete(); |
- }); |
+ 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]; |
}); |
}; |
@@ -501,45 +507,43 @@ function sortResultURLsBySuffix(urls) |
}); |
}); |
if (sortedURLs.length != urls.length) |
- throw "sortResultURLsBySuffix failed to return the same number of URLs." |
+ throw "sortResultURLsBySuffix failed to return the same number of URLs."; |
return sortedURLs; |
} |
-results.fetchResultsURLs = function(failureInfo, callback) |
+results.fetchResultsURLs = function(failureInfo) |
{ |
var testNameStem = base.trimExtension(failureInfo.testName); |
var urlStem = resultsDirectoryURL(failureInfo.builderName); |
var suffixList = possibleSuffixListFor(failureInfo.failureTypeList); |
var resultURLs = []; |
- var tracker = new base.RequestTracker(suffixList.length, function() { |
- callback(sortResultURLsBySuffix(resultURLs)); |
- }); |
+ var probePromises = []; |
$.each(suffixList, function(index, suffix) { |
var url = urlStem + testNameStem + suffix; |
- net.probe(url).then( |
+ probePromises.push(net.probe(url).then( |
function() { |
resultURLs.push(url); |
- tracker.requestComplete(); |
}, |
- function() { |
- tracker.requestComplete(); |
- }); |
+ function() {})); |
+ }); |
+ return Promise.all(probePromises).then(function() { |
+ return sortResultURLsBySuffix(resultURLs); |
}); |
}; |
-results.fetchResultsByBuilder = function(builderNameList, callback) |
+results.fetchResultsByBuilder = function(builderNameList) |
{ |
var resultsByBuilder = {}; |
- var tracker = new base.RequestTracker(builderNameList.length, function() { |
- callback(resultsByBuilder); |
- }); |
+ var fetchPromises = []; |
$.each(builderNameList, function(index, builderName) { |
var resultsURL = resultsSummaryURL(builderName); |
- net.jsonp(resultsURL).then(function(resultsTree) { |
+ fetchPromises.push(net.jsonp(resultsURL).then(function(resultsTree) { |
resultsByBuilder[builderName] = resultsTree; |
- tracker.requestComplete(); |
- }); |
+ })); |
+ }); |
+ return Promise.all(fetchPromises).then(function() { |
+ return resultsByBuilder; |
}); |
}; |