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