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 |