| 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;
|
| - });
|
| -};
|
| -
|
| })();
|
|
|