| 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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 | 94 |
| 95 function pushTextSuffixes() | 95 function pushTextSuffixes() |
| 96 { | 96 { |
| 97 suffixList.push(kActualTextSuffix); | 97 suffixList.push(kActualTextSuffix); |
| 98 suffixList.push(kExpectedTextSuffix); | 98 suffixList.push(kExpectedTextSuffix); |
| 99 suffixList.push(kDiffTextSuffix); | 99 suffixList.push(kDiffTextSuffix); |
| 100 // '-wdiff.html', | 100 // '-wdiff.html', |
| 101 // '-pretty-diff.html', | 101 // '-pretty-diff.html', |
| 102 } | 102 } |
| 103 | 103 |
| 104 $.each(failureTypeList, function(index, failureType) { | 104 failureTypeList.forEach(function(failureType) { |
| 105 switch(failureType) { | 105 switch(failureType) { |
| 106 case IMAGE: | 106 case IMAGE: |
| 107 pushImageSuffixes(); | 107 pushImageSuffixes(); |
| 108 break; | 108 break; |
| 109 case TEXT: | 109 case TEXT: |
| 110 pushTextSuffixes(); | 110 pushTextSuffixes(); |
| 111 break; | 111 break; |
| 112 case AUDIO: | 112 case AUDIO: |
| 113 pushAudioSuffixes(); | 113 pushAudioSuffixes(); |
| 114 break; | 114 break; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 | 215 |
| 216 results.unexpectedFailures = function(resultsTree) | 216 results.unexpectedFailures = function(resultsTree) |
| 217 { | 217 { |
| 218 return base.filterTree(resultsTree.tests, isResultNode, isUnexpectedFailure)
; | 218 return base.filterTree(resultsTree.tests, isResultNode, isUnexpectedFailure)
; |
| 219 }; | 219 }; |
| 220 | 220 |
| 221 function resultsByTest(resultsByBuilder, filter) | 221 function resultsByTest(resultsByBuilder, filter) |
| 222 { | 222 { |
| 223 var resultsByTest = {}; | 223 var resultsByTest = {}; |
| 224 | 224 |
| 225 $.each(resultsByBuilder, function(builderName, resultsTree) { | 225 Object.keys(resultsByBuilder, function(builderName, resultsTree) { |
| 226 $.each(filter(resultsTree), function(testName, resultNode) { | 226 Object.keys(filter(resultsTree), function(testName, resultNode) { |
| 227 resultsByTest[testName] = resultsByTest[testName] || {}; | 227 resultsByTest[testName] = resultsByTest[testName] || {}; |
| 228 resultsByTest[testName][builderName] = resultNode; | 228 resultsByTest[testName][builderName] = resultNode; |
| 229 }); | 229 }); |
| 230 }); | 230 }); |
| 231 | 231 |
| 232 return resultsByTest; | 232 return resultsByTest; |
| 233 } | 233 } |
| 234 | 234 |
| 235 results.unexpectedFailuresByTest = function(resultsByBuilder) | 235 results.unexpectedFailuresByTest = function(resultsByBuilder) |
| 236 { | 236 { |
| 237 return resultsByTest(resultsByBuilder, results.unexpectedFailures); | 237 return resultsByTest(resultsByBuilder, results.unexpectedFailures); |
| 238 }; | 238 }; |
| 239 | 239 |
| 240 results.failureInfoForTestAndBuilder = function(resultsByTest, testName, builder
Name) | 240 results.failureInfoForTestAndBuilder = function(resultsByTest, testName, builder
Name) |
| 241 { | 241 { |
| 242 var failureInfoForTest = { | 242 var failureInfoForTest = { |
| 243 'testName': testName, | 243 'testName': testName, |
| 244 'builderName': builderName, | 244 'builderName': builderName, |
| 245 'failureTypeList': failureTypeList(resultsByTest[testName][builderName].
actual), | 245 'failureTypeList': failureTypeList(resultsByTest[testName][builderName].
actual), |
| 246 }; | 246 }; |
| 247 | 247 |
| 248 return failureInfoForTest; | 248 return failureInfoForTest; |
| 249 }; | 249 }; |
| 250 | 250 |
| 251 results.collectUnexpectedResults = function(dictionaryOfResultNodes) | 251 results.collectUnexpectedResults = function(dictionaryOfResultNodes) |
| 252 { | 252 { |
| 253 var collectedResults = []; | 253 var collectedResults = []; |
| 254 $.each(dictionaryOfResultNodes, function(key, resultNode) { | 254 Object.keys(dictionaryOfResultNodes, function(key, resultNode) { |
| 255 var analyzer = new results.ResultAnalyzer(resultNode); | 255 var analyzer = new results.ResultAnalyzer(resultNode); |
| 256 collectedResults = collectedResults.concat(analyzer.unexpectedResults())
; | 256 collectedResults = collectedResults.concat(analyzer.unexpectedResults())
; |
| 257 }); | 257 }); |
| 258 return base.uniquifyArray(collectedResults); | 258 return base.uniquifyArray(collectedResults); |
| 259 }; | 259 }; |
| 260 | 260 |
| 261 // Callback data is [{ buildNumber:, url: }] | 261 // Callback data is [{ buildNumber:, url: }] |
| 262 function historicalResultsLocations(builderName) | 262 function historicalResultsLocations(builderName) |
| 263 { | 263 { |
| 264 return builders.mostRecentBuildForBuilder(builderName).then(function (mostRe
centBuildNumber) { | 264 return builders.mostRecentBuildForBuilder(builderName).then(function (mostRe
centBuildNumber) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 283 function continueWalk() | 283 function continueWalk() |
| 284 { | 284 { |
| 285 if (indexOfNextKeyToFetch >= keyList.length) { | 285 if (indexOfNextKeyToFetch >= keyList.length) { |
| 286 processResultNode(0, null); | 286 processResultNode(0, null); |
| 287 return; | 287 return; |
| 288 } | 288 } |
| 289 | 289 |
| 290 var resultsURL = keyList[indexOfNextKeyToFetch].url; | 290 var resultsURL = keyList[indexOfNextKeyToFetch].url; |
| 291 ++indexOfNextKeyToFetch; | 291 ++indexOfNextKeyToFetch; |
| 292 g_resultsCache.get(resultsURL).then(function(resultsTree) { | 292 g_resultsCache.get(resultsURL).then(function(resultsTree) { |
| 293 if ($.isEmptyObject(resultsTree)) { | 293 if (!Object.size(resultsTree)) { |
| 294 continueWalk(); | 294 continueWalk(); |
| 295 return; | 295 return; |
| 296 } | 296 } |
| 297 var resultNode = results.resultNodeForTest(resultsTree, testName); | 297 var resultNode = results.resultNodeForTest(resultsTree, testName); |
| 298 var revision = parseInt(resultsTree['blink_revision']); | 298 var revision = parseInt(resultsTree['blink_revision']); |
| 299 if (isNaN(revision)) | 299 if (isNaN(revision)) |
| 300 revision = 0; | 300 revision = 0; |
| 301 processResultNode(revision, resultNode); | 301 processResultNode(revision, resultNode); |
| 302 }); | 302 }); |
| 303 } | 303 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 }); | 344 }); |
| 345 }; | 345 }; |
| 346 | 346 |
| 347 function mergeRegressionRanges(regressionRanges) | 347 function mergeRegressionRanges(regressionRanges) |
| 348 { | 348 { |
| 349 var mergedRange = {}; | 349 var mergedRange = {}; |
| 350 | 350 |
| 351 mergedRange.oldestFailingRevision = 0; | 351 mergedRange.oldestFailingRevision = 0; |
| 352 mergedRange.newestPassingRevision = 0; | 352 mergedRange.newestPassingRevision = 0; |
| 353 | 353 |
| 354 $.each(regressionRanges, function(builderName, range) { | 354 Object.keys(regressionRanges, function(builderName, range) { |
| 355 if (!range.oldestFailingRevision && !range.newestPassingRevision) | 355 if (!range.oldestFailingRevision && !range.newestPassingRevision) |
| 356 return | 356 return |
| 357 | 357 |
| 358 if (!mergedRange.oldestFailingRevision) | 358 if (!mergedRange.oldestFailingRevision) |
| 359 mergedRange.oldestFailingRevision = range.oldestFailingRevision; | 359 mergedRange.oldestFailingRevision = range.oldestFailingRevision; |
| 360 if (!mergedRange.newestPassingRevision) | 360 if (!mergedRange.newestPassingRevision) |
| 361 mergedRange.newestPassingRevision = range.newestPassingRevision; | 361 mergedRange.newestPassingRevision = range.newestPassingRevision; |
| 362 | 362 |
| 363 if (range.oldestFailingRevision && range.oldestFailingRevision < mergedR
ange.oldestFailingRevision) | 363 if (range.oldestFailingRevision && range.oldestFailingRevision < mergedR
ange.oldestFailingRevision) |
| 364 mergedRange.oldestFailingRevision = range.oldestFailingRevision; | 364 mergedRange.oldestFailingRevision = range.oldestFailingRevision; |
| 365 if (range.newestPassingRevision > mergedRange.newestPassingRevision) | 365 if (range.newestPassingRevision > mergedRange.newestPassingRevision) |
| 366 mergedRange.newestPassingRevision = range.newestPassingRevision; | 366 mergedRange.newestPassingRevision = range.newestPassingRevision; |
| 367 }); | 367 }); |
| 368 | 368 |
| 369 return mergedRange; | 369 return mergedRange; |
| 370 } | 370 } |
| 371 | 371 |
| 372 results.unifyRegressionRanges = function(builderNameList, testName) { | 372 results.unifyRegressionRanges = function(builderNameList, testName) { |
| 373 var regressionRanges = {}; | 373 var regressionRanges = {}; |
| 374 | 374 |
| 375 var rangePromises = []; | 375 var rangePromises = []; |
| 376 $.each(builderNameList, function(index, builderName) { | 376 builderNameList.forEach(function(builderName) { |
| 377 rangePromises.push(results.regressionRangeForFailure(builderName, testNa
me) | 377 rangePromises.push(results.regressionRangeForFailure(builderName, testNa
me) |
| 378 .then(function(result) { | 378 .then(function(result) { |
| 379 var oldestFailingRevision = result[0]; | 379 var oldestFailingRevision = result[0]; |
| 380 var newestPassingRevision = result[1]; | 380 var newestPassingRevision = result[1]; |
| 381 var range = {}; | 381 var range = {}; |
| 382 range.oldestFailingRevision = oldestFailingRevisi
on; | 382 range.oldestFailingRevision = oldestFailingRevisi
on; |
| 383 range.newestPassingRevision = newestPassingRevisi
on; | 383 range.newestPassingRevision = newestPassingRevisi
on; |
| 384 regressionRanges[builderName] = range; | 384 regressionRanges[builderName] = range; |
| 385 })); | 385 })); |
| 386 }); | 386 }); |
| 387 return Promise.all(rangePromises).then(function() { | 387 return Promise.all(rangePromises).then(function() { |
| 388 var mergedRange = mergeRegressionRanges(regressionRanges); | 388 var mergedRange = mergeRegressionRanges(regressionRanges); |
| 389 return [mergedRange.oldestFailingRevision, mergedRange.newestPassingRevi
sion]; | 389 return [mergedRange.oldestFailingRevision, mergedRange.newestPassingRevi
sion]; |
| 390 }); | 390 }); |
| 391 }; | 391 }; |
| 392 | 392 |
| 393 results.resultNodeForTest = function(resultsTree, testName) | 393 results.resultNodeForTest = function(resultsTree, testName) |
| 394 { | 394 { |
| 395 var testNamePath = testName.split('/'); | 395 var testNamePath = testName.split('/'); |
| 396 var currentNode = resultsTree['tests']; | 396 var currentNode = resultsTree['tests']; |
| 397 $.each(testNamePath, function(index, segmentName) { | 397 testNamePath.forEach(function(segmentName) { |
| 398 if (!currentNode) | 398 if (!currentNode) |
| 399 return; | 399 return; |
| 400 currentNode = (segmentName in currentNode) ? currentNode[segmentName] :
null; | 400 currentNode = (segmentName in currentNode) ? currentNode[segmentName] :
null; |
| 401 }); | 401 }); |
| 402 return currentNode; | 402 return currentNode; |
| 403 }; | 403 }; |
| 404 | 404 |
| 405 results.resultKind = function(url) | 405 results.resultKind = function(url) |
| 406 { | 406 { |
| 407 if (/-actual\.[a-z]+$/.test(url)) | 407 if (/-actual\.[a-z]+$/.test(url)) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 418 if (/\.png$/.test(url)) | 418 if (/\.png$/.test(url)) |
| 419 return results.kImageType; | 419 return results.kImageType; |
| 420 if (/\.wav$/.test(url)) | 420 if (/\.wav$/.test(url)) |
| 421 return results.kAudioType; | 421 return results.kAudioType; |
| 422 return results.kTextType; | 422 return results.kTextType; |
| 423 } | 423 } |
| 424 | 424 |
| 425 function sortResultURLsBySuffix(urls) | 425 function sortResultURLsBySuffix(urls) |
| 426 { | 426 { |
| 427 var sortedURLs = []; | 427 var sortedURLs = []; |
| 428 $.each(kPreferredSuffixOrder, function(i, suffix) { | 428 kPreferredSuffixOrder.forEach(function(suffix) { |
| 429 $.each(urls, function(j, url) { | 429 urls.forEach(function(url) { |
| 430 if (!base.endsWith(url, suffix)) | 430 if (!base.endsWith(url, suffix)) |
| 431 return; | 431 return; |
| 432 sortedURLs.push(url); | 432 sortedURLs.push(url); |
| 433 }); | 433 }); |
| 434 }); | 434 }); |
| 435 if (sortedURLs.length != urls.length) | 435 if (sortedURLs.length != urls.length) |
| 436 throw "sortResultURLsBySuffix failed to return the same number of URLs."
; | 436 throw "sortResultURLsBySuffix failed to return the same number of URLs."
; |
| 437 return sortedURLs; | 437 return sortedURLs; |
| 438 } | 438 } |
| 439 | 439 |
| 440 results.fetchResultsURLs = function(failureInfo) | 440 results.fetchResultsURLs = function(failureInfo) |
| 441 { | 441 { |
| 442 var testNameStem = base.trimExtension(failureInfo.testName); | 442 var testNameStem = base.trimExtension(failureInfo.testName); |
| 443 var urlStem = resultsDirectoryURL(failureInfo.builderName); | 443 var urlStem = resultsDirectoryURL(failureInfo.builderName); |
| 444 | 444 |
| 445 var suffixList = possibleSuffixListFor(failureInfo.failureTypeList); | 445 var suffixList = possibleSuffixListFor(failureInfo.failureTypeList); |
| 446 var resultURLs = []; | 446 var resultURLs = []; |
| 447 var probePromises = []; | 447 var probePromises = []; |
| 448 $.each(suffixList, function(index, suffix) { | 448 suffixList.forEach(function(suffix) { |
| 449 var url = urlStem + testNameStem + suffix; | 449 var url = urlStem + testNameStem + suffix; |
| 450 probePromises.push(net.probe(url).then( | 450 probePromises.push(net.probe(url).then( |
| 451 function() { | 451 function() { |
| 452 resultURLs.push(url); | 452 resultURLs.push(url); |
| 453 }, | 453 }, |
| 454 function() {})); | 454 function() {})); |
| 455 }); | 455 }); |
| 456 return Promise.all(probePromises).then(function() { | 456 return Promise.all(probePromises).then(function() { |
| 457 return sortResultURLsBySuffix(resultURLs); | 457 return sortResultURLsBySuffix(resultURLs); |
| 458 }); | 458 }); |
| 459 }; | 459 }; |
| 460 | 460 |
| 461 results.fetchResultsByBuilder = function(builderNameList) | 461 results.fetchResultsByBuilder = function(builderNameList) |
| 462 { | 462 { |
| 463 var resultsByBuilder = {}; | 463 var resultsByBuilder = {}; |
| 464 var fetchPromises = []; | 464 var fetchPromises = []; |
| 465 $.each(builderNameList, function(index, builderName) { | 465 builderNameList.forEach(function(builderName) { |
| 466 var resultsURL = resultsSummaryURL(builderName); | 466 var resultsURL = resultsSummaryURL(builderName); |
| 467 fetchPromises.push(net.jsonp(resultsURL).then(function(resultsTree) { | 467 fetchPromises.push(net.jsonp(resultsURL).then(function(resultsTree) { |
| 468 resultsByBuilder[builderName] = resultsTree; | 468 resultsByBuilder[builderName] = resultsTree; |
| 469 })); | 469 })); |
| 470 }); | 470 }); |
| 471 return Promise.all(fetchPromises).then(function() { | 471 return Promise.all(fetchPromises).then(function() { |
| 472 return resultsByBuilder; | 472 return resultsByBuilder; |
| 473 }); | 473 }); |
| 474 }; | 474 }; |
| 475 | 475 |
| 476 })(); | 476 })(); |
| OLD | NEW |