Chromium Code Reviews| Index: Tools/TestResultServer/static-dashboards/flakiness_dashboard.js |
| diff --git a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js |
| index 3120ed478b34b09b27b5176c8aab6b6983606783..9759c2c5a2c4c0f3f7fbf496da47787d33028334 100644 |
| --- a/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js |
| +++ b/Tools/TestResultServer/static-dashboards/flakiness_dashboard.js |
| @@ -542,7 +542,7 @@ function classNameForFailureString(failure) |
| return failure.replace(/(\+|\ )/, ''); |
| } |
| -function htmlForTestResults(test) |
| +function htmlForTestResults(test, blinkRevisions) |
| { |
| var html = ''; |
| var testResults = test.rawResults.concat(); |
| @@ -551,6 +551,10 @@ function htmlForTestResults(test) |
| var master = builders.master(builder); |
| var buildNumbers = g_resultsByBuilder[builder].buildNumbers; |
| + var cells = []; |
| + for (var idx = 0; idx < blinkRevisions.length; idx++) |
|
ojan
2014/06/29 03:38:49
nit: s/idx/index
pdr.
2014/06/29 20:51:34
Done.
|
| + cells.push({revision: blinkRevisions[idx]}); |
| + |
| var indexToReplaceCurrentResult = -1; |
| var indexToReplaceCurrentTime = -1; |
| for (var i = 0; i < buildNumbers.length; i++) { |
| @@ -579,9 +583,39 @@ function htmlForTestResults(test) |
| innerHTML = currentTime || ' '; |
| } |
| - html += '<td title="' + resultString + '. Click for more info." class="results ' + classNameForFailureString(resultString) + |
| + var blink = parseInt(g_resultsByBuilder[builder][results.BLINK_REVISIONS][i], 10); |
|
ojan
2014/06/29 03:38:48
nit: s/blink/blinkRevision
pdr.
2014/06/29 20:51:34
Done.
|
| + |
| + // Locate the empty cell corresponding to this blink revision. |
| + var cellIndex = -1; |
| + for (var idx = 0; idx < cells.length && cellIndex == -1; idx++) { |
|
ojan
2014/06/29 03:38:49
I think this would read more straightforward if yo
pdr.
2014/06/29 20:51:34
Done.
|
| + if (cells[idx].revision == blink && !cells[idx].html) |
| + cellIndex = idx; |
| + } |
| + |
| + cells[cellIndex].className = classNameForFailureString(resultString); |
| + cells[cellIndex].html = '<td title="' + resultString + '. Click for more info." class="results ' + cells[cellIndex].className + |
| '" onclick=\'showPopupForBuild(event, "' + builder + '",' + i + ',"' + test.test + '")\'>' + innerHTML; |
| } |
| + |
| + // Set nextClassName on all cells. |
|
ojan
2014/06/29 03:38:49
Nit: unhelpful comment.
pdr.
2014/06/29 20:51:34
Done.
|
| + for (var idx = 1; idx < cells.length; idx++) |
| + cells[idx].nextClassName = cells[idx - 1].className || cells[idx - 1].nextClassName; |
| + |
| + // Set prevClassName on all cells. |
|
ojan
2014/06/29 03:38:49
Nit: unhelpful comment.
pdr.
2014/06/29 20:51:34
Done.
|
| + for (var idx = cells.length - 2; idx >= 0; --idx) |
| + cells[idx].prevClassName = cells[idx + 1].className || cells[idx + 1].prevClassName; |
| + |
| + var numResultsToShow = buildNumbers.length; |
| + for (var idx = cells.length - 1; idx >= (cells.length - numResultsToShow); --idx) { |
| + if (cells[idx].html) { |
| + html += cells[idx].html; |
| + } else { |
| + if (cells[idx].nextClassName == cells[idx].prevClassName) |
| + html += '<td class="interpolatedResults results ' + cells[idx].nextClassName + '"> </td>'; |
|
ojan
2014/06/29 03:38:49
Should put a title on these so people can understa
pdr.
2014/06/29 20:51:34
Done.
|
| + else |
| + html += '<td> </td>'; |
| + } |
| + } |
| return html; |
| } |
| @@ -649,7 +683,7 @@ function linkifyBugs(bugs) |
| return html; |
| } |
| -function htmlForSingleTestRow(test, showBuilderNames) |
| +function htmlForSingleTestRow(test, showBuilderNames, revisions) |
| { |
| var headers = tableHeaders(); |
| var html = ''; |
| @@ -667,7 +701,7 @@ function htmlForSingleTestRow(test, showBuilderNames) |
| else if (string.startsWith(header, 'slowest')) |
| html += '<td>' + (test.slowestTime ? test.slowestTime + 's' : ''); |
| else if (string.startsWith(header, 'flakiness')) |
| - html += htmlForTestResults(test); |
| + html += htmlForTestResults(test, revisions); |
| } |
| return html; |
| } |
| @@ -783,6 +817,40 @@ function sortTests(tests, column, order) |
| tests.sort(sortFunctionGetter(resultsProperty, order == BACKWARD)); |
| } |
| +// Return an array of unique blink build revisions across all builders. |
| +// The array contains blink revisions but note that these revisions may not be |
| +// unique: builds of blink@r123,chrome@r567 and blink@r123,chrome@r568 will |
| +// result in two entries of 123 in the returned array. |
| +function blinkBuildRevisions(testResults) |
| +{ |
| + var revisionsCountedSet = {}; |
| + for (var j = 0; j < testResults.length; j++) { |
| + var builder = testResults[j].builder; |
| + var build = g_resultsByBuilder[builder]; |
| + var buildNumbers = build.buildNumbers; |
| + var builderRevisionsCountedSet = {}; |
| + for (var i = 0; i < buildNumbers.length; i++) { |
| + var blinkRevision = build[results.BLINK_REVISIONS][i]; |
| + builderRevisionsCountedSet[blinkRevision] = (builderRevisionsCountedSet[blinkRevision] || 0) + 1; |
| + } |
| + |
| + // Join the builder's revisions with the total revisions for all builders. |
| + for (var revision in builderRevisionsCountedSet) |
| + revisionsCountedSet[revision] = Math.max(revisionsCountedSet[revision] || 0, builderRevisionsCountedSet[revision]); |
| + } |
| + |
| + var revisionsArray = []; |
| + for (var revision in revisionsCountedSet) { |
| + for (var i = revisionsCountedSet[revision] - 1; i >= 0; --i) |
| + revisionsArray.push(revision); |
| + } |
| + |
| + revisionsArray.sort(function(a, b) { |
| + return (a - b); |
| + }); |
| + return revisionsArray; |
| +} |
| + |
| function htmlForIndividualTestOnAllBuilders(test) |
| { |
| processTestRunsForAllBuilders(); |
| @@ -793,10 +861,11 @@ function htmlForIndividualTestOnAllBuilders(test) |
| var html = ''; |
| var shownBuilders = []; |
| + var blinkRevisions = blinkBuildRevisions(testResults); |
| for (var j = 0; j < testResults.length; j++) { |
| shownBuilders.push(testResults[j].builder); |
| var showBuilderNames = true; |
| - html += htmlForSingleTestRow(testResults[j], showBuilderNames); |
| + html += htmlForSingleTestRow(testResults[j], showBuilderNames, blinkRevisions); |
| } |
| var skippedBuilders = [] |
| @@ -1261,8 +1330,9 @@ function generatePageForBuilder(builderName) |
| if (filteredResults.length) { |
| var tableRowsHTML = ''; |
| var showBuilderNames = false; |
| + var blinkRevisions = blinkBuildRevisions(testResults); |
| for (var i = 0; i < filteredResults.length; i++) |
| - tableRowsHTML += htmlForSingleTestRow(filteredResults[i], showBuilderNames) |
| + tableRowsHTML += htmlForSingleTestRow(filteredResults[i], showBuilderNames, blinkRevisions) |
| testsHTML = htmlForTestTable(tableRowsHTML); |
| } else { |
| if (g_history.isLayoutTestResults()) |