| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 break; | 123 break; |
| 124 default: | 124 default: |
| 125 // FIXME: Add support for the rest of the result types. | 125 // FIXME: Add support for the rest of the result types. |
| 126 // '-expected.html', | 126 // '-expected.html', |
| 127 // '-expected-mismatch.html', | 127 // '-expected-mismatch.html', |
| 128 // ... and possibly more. | 128 // ... and possibly more. |
| 129 break; | 129 break; |
| 130 } | 130 } |
| 131 }); | 131 }); |
| 132 | 132 |
| 133 return base.uniquifyArray(suffixList); | 133 return suffixList.unique(); |
| 134 } | 134 } |
| 135 | 135 |
| 136 function failureTypeList(failureBlob) | 136 function failureTypeList(failureBlob) |
| 137 { | 137 { |
| 138 return failureBlob.split(' '); | 138 return failureBlob.split(' '); |
| 139 }; | 139 }; |
| 140 | 140 |
| 141 function resultsDirectoryURL(builderName) | 141 function resultsDirectoryURL(builderName) |
| 142 { | 142 { |
| 143 return config.layoutTestResultsURL + '/' + config.resultsDirectoryNameFromBu
ilderName(builderName) + '/results/layout-test-results/'; | 143 return config.layoutTestResultsURL + '/' + config.resultsDirectoryNameFromBu
ilderName(builderName) + '/results/layout-test-results/'; |
| 144 } | 144 } |
| 145 | 145 |
| 146 function resultsDirectoryURLForBuildNumber(builderName, buildNumber) | 146 function resultsDirectoryURLForBuildNumber(builderName, buildNumber) |
| 147 { | 147 { |
| 148 return config.layoutTestResultsURL + '/' + config.resultsDirectoryNameFromBu
ilderName(builderName) + '/' + buildNumber + '/' ; | 148 return config.layoutTestResultsURL + '/' + config.resultsDirectoryNameFromBu
ilderName(builderName) + '/' + buildNumber + '/' ; |
| 149 } | 149 } |
| 150 | 150 |
| 151 function resultsSummaryURL(builderName) | 151 function resultsSummaryURL(builderName) |
| 152 { | 152 { |
| 153 return resultsDirectoryURL(builderName) + kResultsName; | 153 return resultsDirectoryURL(builderName) + kResultsName; |
| 154 } | 154 } |
| 155 | 155 |
| 156 var g_resultsCache = new base.AsynchronousCache(function(key) { | 156 var g_resultsCache = new base.AsynchronousCache(function(key) { |
| 157 return net.jsonp(key); | 157 return net.jsonp(key); |
| 158 }); | 158 }); |
| 159 | 159 |
| 160 results.ResultAnalyzer = base.extends(Object, { | 160 results.ResultAnalyzer = function(resultNode) |
| 161 init: function(resultNode) | 161 { |
| 162 { | 162 this._isUnexpected = resultNode.is_unexpected; |
| 163 this._isUnexpected = resultNode.is_unexpected; | 163 this._actual = resultNode ? failureTypeList(resultNode.actual) : []; |
| 164 this._actual = resultNode ? failureTypeList(resultNode.actual) : []; | 164 this._expected = resultNode ? this._addImpliedExpectations(failureTypeList(r
esultNode.expected)) : []; |
| 165 this._expected = resultNode ? this._addImpliedExpectations(failureTypeLi
st(resultNode.expected)) : []; | 165 }; |
| 166 }, | 166 |
| 167 results.ResultAnalyzer.prototype = { |
| 167 _addImpliedExpectations: function(resultsList) | 168 _addImpliedExpectations: function(resultsList) |
| 168 { | 169 { |
| 169 if (resultsList.indexOf('FAIL') == -1) | 170 if (resultsList.indexOf('FAIL') == -1) |
| 170 return resultsList; | 171 return resultsList; |
| 171 return resultsList.concat(kFailingResults); | 172 return resultsList.concat(kFailingResults); |
| 172 }, | 173 }, |
| 173 _hasPass: function(results) | 174 _hasPass: function(results) |
| 174 { | 175 { |
| 175 return results.indexOf(PASS) != -1; | 176 return results.indexOf(PASS) != -1; |
| 176 }, | 177 }, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 188 { | 189 { |
| 189 return this._actual.length > 1; | 190 return this._actual.length > 1; |
| 190 }, | 191 }, |
| 191 wontfix: function() | 192 wontfix: function() |
| 192 { | 193 { |
| 193 return this._expected.indexOf('WONTFIX') != -1; | 194 return this._expected.indexOf('WONTFIX') != -1; |
| 194 }, | 195 }, |
| 195 hasUnexpectedFailures: function() | 196 hasUnexpectedFailures: function() |
| 196 { | 197 { |
| 197 return this._isUnexpected; | 198 return this._isUnexpected; |
| 198 } | 199 }, |
| 199 }); | 200 }; |
| 200 | 201 |
| 201 function isUnexpectedFailure(resultNode) | 202 function isUnexpectedFailure(resultNode) |
| 202 { | 203 { |
| 203 var analyzer = new results.ResultAnalyzer(resultNode); | 204 var analyzer = new results.ResultAnalyzer(resultNode); |
| 204 return analyzer.hasUnexpectedFailures() && !analyzer.succeeded() && !analyze
r.flaky() && !analyzer.wontfix(); | 205 return analyzer.hasUnexpectedFailures() && !analyzer.succeeded() && !analyze
r.flaky() && !analyzer.wontfix(); |
| 205 } | 206 } |
| 206 | 207 |
| 207 function isResultNode(node) | 208 function isResultNode(node) |
| 208 { | 209 { |
| 209 return !!node.actual; | 210 return !!node.actual; |
| 210 } | 211 } |
| 211 | 212 |
| 213 results._joinPath = function(parent, child) |
| 214 { |
| 215 if (parent.length == 0) |
| 216 return child; |
| 217 return parent + '/' + child; |
| 218 }; |
| 219 |
| 220 results._filterTree = function(tree, isLeaf, predicate) |
| 221 { |
| 222 var filteredTree = {}; |
| 223 |
| 224 function walkSubtree(subtree, directory) |
| 225 { |
| 226 for (var childName in subtree) { |
| 227 var child = subtree[childName]; |
| 228 var childPath = results._joinPath(directory, childName); |
| 229 if (isLeaf(child)) { |
| 230 if (predicate(child)) |
| 231 filteredTree[childPath] = child; |
| 232 continue; |
| 233 } |
| 234 walkSubtree(child, childPath); |
| 235 } |
| 236 } |
| 237 |
| 238 walkSubtree(tree, ''); |
| 239 return filteredTree; |
| 240 }; |
| 241 |
| 212 results.unexpectedFailures = function(resultsTree) | 242 results.unexpectedFailures = function(resultsTree) |
| 213 { | 243 { |
| 214 return base.filterTree(resultsTree.tests, isResultNode, isUnexpectedFailure)
; | 244 return results._filterTree(resultsTree.tests, isResultNode, isUnexpectedFail
ure); |
| 215 }; | 245 }; |
| 216 | 246 |
| 217 function resultsByTest(resultsByBuilder, filter) | 247 function resultsByTest(resultsByBuilder, filter) |
| 218 { | 248 { |
| 219 var resultsByTest = {}; | 249 var resultsByTest = {}; |
| 220 | 250 |
| 221 Object.keys(resultsByBuilder, function(builderName, resultsTree) { | 251 Object.keys(resultsByBuilder, function(builderName, resultsTree) { |
| 222 Object.keys(filter(resultsTree), function(testName, resultNode) { | 252 Object.keys(filter(resultsTree), function(testName, resultNode) { |
| 223 resultsByTest[testName] = resultsByTest[testName] || {}; | 253 resultsByTest[testName] = resultsByTest[testName] || {}; |
| 224 resultsByTest[testName][builderName] = resultNode; | 254 resultsByTest[testName][builderName] = resultNode; |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 if (/\.wav$/.test(url)) | 434 if (/\.wav$/.test(url)) |
| 405 return results.kAudioType; | 435 return results.kAudioType; |
| 406 return results.kTextType; | 436 return results.kTextType; |
| 407 } | 437 } |
| 408 | 438 |
| 409 function sortResultURLsBySuffix(urls) | 439 function sortResultURLsBySuffix(urls) |
| 410 { | 440 { |
| 411 var sortedURLs = []; | 441 var sortedURLs = []; |
| 412 kPreferredSuffixOrder.forEach(function(suffix) { | 442 kPreferredSuffixOrder.forEach(function(suffix) { |
| 413 urls.forEach(function(url) { | 443 urls.forEach(function(url) { |
| 414 if (!base.endsWith(url, suffix)) | 444 if (!url.endsWith(suffix)) |
| 415 return; | 445 return; |
| 416 sortedURLs.push(url); | 446 sortedURLs.push(url); |
| 417 }); | 447 }); |
| 418 }); | 448 }); |
| 419 if (sortedURLs.length != urls.length) | 449 if (sortedURLs.length != urls.length) |
| 420 throw "sortResultURLsBySuffix failed to return the same number of URLs."
; | 450 throw "sortResultURLsBySuffix failed to return the same number of URLs."
; |
| 421 return sortedURLs; | 451 return sortedURLs; |
| 422 } | 452 } |
| 423 | 453 |
| 454 results._trimExtension = function(url) |
| 455 { |
| 456 var index = url.lastIndexOf('.'); |
| 457 if (index == -1) |
| 458 return url; |
| 459 return url.substr(0, index); |
| 460 } |
| 461 |
| 424 results.fetchResultsURLs = function(failureInfo) | 462 results.fetchResultsURLs = function(failureInfo) |
| 425 { | 463 { |
| 426 var testNameStem = base.trimExtension(failureInfo.testName); | 464 var testNameStem = results._trimExtension(failureInfo.testName); |
| 427 var urlStem = resultsDirectoryURL(failureInfo.builderName); | 465 var urlStem = resultsDirectoryURL(failureInfo.builderName); |
| 428 | 466 |
| 429 var suffixList = possibleSuffixListFor(failureInfo.failureTypeList); | 467 var suffixList = possibleSuffixListFor(failureInfo.failureTypeList); |
| 430 var resultURLs = []; | 468 var resultURLs = []; |
| 431 var probePromises = []; | 469 var probePromises = []; |
| 432 suffixList.forEach(function(suffix) { | 470 suffixList.forEach(function(suffix) { |
| 433 var url = urlStem + testNameStem + suffix; | 471 var url = urlStem + testNameStem + suffix; |
| 434 probePromises.push(net.probe(url).then( | 472 probePromises.push(net.probe(url).then( |
| 435 function() { | 473 function() { |
| 436 resultURLs.push(url); | 474 resultURLs.push(url); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 451 fetchPromises.push(net.jsonp(resultsURL).then(function(resultsTree) { | 489 fetchPromises.push(net.jsonp(resultsURL).then(function(resultsTree) { |
| 452 resultsByBuilder[builderName] = resultsTree; | 490 resultsByBuilder[builderName] = resultsTree; |
| 453 })); | 491 })); |
| 454 }); | 492 }); |
| 455 return Promise.all(fetchPromises).then(function() { | 493 return Promise.all(fetchPromises).then(function() { |
| 456 return resultsByBuilder; | 494 return resultsByBuilder; |
| 457 }); | 495 }); |
| 458 }; | 496 }; |
| 459 | 497 |
| 460 })(); | 498 })(); |
| OLD | NEW |