Show image diffs for gpu_tests on flakiness dashboard
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2012 19:36:20 +0000 (19:36 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2012 19:36:20 +0000 (19:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=81848

Patch by Dave Tu <dtu@chromium.org> on 2012-03-27
Reviewed by Ojan Vafai.

Add a new results layout for gpu_tests that pulls the image diffs in
addition to the text output. Also add new gpu_tests builders.

* Tools/TestResultServer/static-dashboards/builders.js: Update
gpu_tests builders.
* Tools/TestResultServer/static-dashboards/dashboard_base.js: Add a
function to check for GPU test type.
* Tools/TestResultServer/static-dashboards/flakiness_dashboard.html:
Add new GPU results layout.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@112303 268f45cc-cd09-0410-ab3c-d52691b4dbfc

ChangeLog
Tools/TestResultServer/static-dashboards/builders.js
Tools/TestResultServer/static-dashboards/dashboard_base.js
Tools/TestResultServer/static-dashboards/flakiness_dashboard.html

index 6dadc71255cf485d7a0127de165fcd2f8e0fa75b..8434a53d9413c66ff214f62793b1c12a592488ef 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2012-03-27  Dave Tu  <dtu@chromium.org>
+
+        Show image diffs for gpu_tests on flakiness dashboard
+        https://bugs.webkit.org/show_bug.cgi?id=81848
+
+        Reviewed by Ojan Vafai.
+
+        Add a new results layout for gpu_tests that pulls the image diffs in
+        addition to the text output. Also add new gpu_tests builders.
+
+        * Tools/TestResultServer/static-dashboards/builders.js: Update
+        gpu_tests builders.
+        * Tools/TestResultServer/static-dashboards/dashboard_base.js: Add a
+        function to check for GPU test type.
+        * Tools/TestResultServer/static-dashboards/flakiness_dashboard.html:
+        Add new GPU results layout.
+
 2012-03-26  Ryosuke Niwa  <rniwa@webkit.org>
 
         Trigger a build on Chromium Linux boxes to see if clean builds succeed or not.
 2012-03-26  Ryosuke Niwa  <rniwa@webkit.org>
 
         Trigger a build on Chromium Linux boxes to see if clean builds succeed or not.
index 5b5af7fd103385fe728c3519202a926de7783eab..a97fa7ae2b7397ac4162bbf35b76970939f1b844 100644 (file)
@@ -51,6 +51,7 @@ var LEGACY_BUILDER_MASTERS_TO_GROUPS = {
     'Chromium': '@DEPS - chromium.org',
     'ChromiumChromiumOS': '@DEPS CrOS - chromium.org',
     'ChromiumGPU': '@DEPS - chromium.org',
     'Chromium': '@DEPS - chromium.org',
     'ChromiumChromiumOS': '@DEPS CrOS - chromium.org',
     'ChromiumGPU': '@DEPS - chromium.org',
+    'ChromiumGPUFYI': '@DEPS FYI - chromium.org',
     'ChromiumWebkit': '@ToT - chromium.org',
     'webkit.org': '@ToT - webkit.org'
 };
     'ChromiumWebkit': '@ToT - chromium.org',
     'webkit.org': '@ToT - webkit.org'
 };
@@ -161,11 +162,15 @@ var CHROMIUM_GPU_FYI_GTESTS_DEPS_BUILDERS = [
     ['Mac Release (ATI)'],
     ['Linux Release (ATI)'],
     ['Linux Release (Intel)'],
     ['Mac Release (ATI)'],
     ['Linux Release (ATI)'],
     ['Linux Release (Intel)'],
+    ['Win7 Audio'],
+    ['Linux Audio'],
 ];
 associateBuildersWithMaster(CHROMIUM_GPU_FYI_GTESTS_DEPS_BUILDERS, CHROMIUM_GPU_FYI_BUILDER_MASTER);
 
 var CHROMIUM_GPU_GTESTS_TOT_BUILDERS = [
 ];
 associateBuildersWithMaster(CHROMIUM_GPU_FYI_GTESTS_DEPS_BUILDERS, CHROMIUM_GPU_FYI_BUILDER_MASTER);
 
 var CHROMIUM_GPU_GTESTS_TOT_BUILDERS = [
-    ['GPU Win7 (dbg) (NVIDIA)', BuilderGroup.DEFAULT_BUILDER],
+    ['GPU Win7 (NVIDIA)', BuilderGroup.DEFAULT_BUILDER],
+    ['GPU Win7 (dbg) (NVIDIA)'],
+    ['GPU Mac'],
     ['GPU Mac (dbg)'],
     ['GPU Linux (dbg) (NVIDIA)'],
 ];
     ['GPU Mac (dbg)'],
     ['GPU Linux (dbg) (NVIDIA)'],
 ];
index 042ae10fc89dedb951452919dad470c42e4e4ecc..e3495955a6560dbba095a3d6b939a6dc65d92446 100644 (file)
@@ -422,6 +422,11 @@ function isLayoutTestResults()
     return g_currentState.testType == 'layout-tests';
 }
 
     return g_currentState.testType == 'layout-tests';
 }
 
+function isGPUTestResults()
+{
+    return g_currentState.testType == 'gpu_tests';
+}
+
 function currentBuilderGroupCategory(opt_state)
 {
     var state = opt_state || g_currentState;
 function currentBuilderGroupCategory(opt_state)
 {
     var state = opt_state || g_currentState;
index eaecf93961ab55e9ef5b4dced45f3cccea8e1737..98f57d7c1d2138e0683d1077caa5921952870a4a 100644 (file)
@@ -262,6 +262,9 @@ pre.expectation {
 .non-webkit-results {
     width: 99%;
 }
 .non-webkit-results {
     width: 99%;
 }
+.gpu-test-results {
+    width: 400px;
+}
 .used-platform {
     float: right;
     color: darkblue;
 .used-platform {
     float: right;
     color: darkblue;
@@ -1213,8 +1216,8 @@ function isFailure(builder, testName, index)
     console.error('Index exceeds number of results: ' + index);
 }
 
     console.error('Index exceeds number of results: ' + index);
 }
 
-// Returns an array of buildNumbers for all builds where this test failed.
-function buildNumbersForFailures(builder, testName)
+// Returns an array of indexes for all builds where this test failed.
+function indexesForFailures(builder, testName)
 {
     var rawResults = g_resultsByBuilder[builder].tests[testName].results;
     var buildNumbers = g_resultsByBuilder[builder].buildNumbers;
 {
     var rawResults = g_resultsByBuilder[builder].tests[testName].results;
     var buildNumbers = g_resultsByBuilder[builder].buildNumbers;
@@ -1224,7 +1227,7 @@ function buildNumbersForFailures(builder, testName)
         var numResults = rawResults[i][RLE.LENGTH];
         if (isFailingResult(rawResults[i][RLE.VALUE])) {
             for (var j = 0; j < numResults; j++)
         var numResults = rawResults[i][RLE.LENGTH];
         if (isFailingResult(rawResults[i][RLE.VALUE])) {
             for (var j = 0; j < numResults; j++)
-                failures.push(buildNumbers[index + j]);
+                failures.push(index + j);
         }
         index += numResults;
     }
         }
         index += numResults;
     }
@@ -1829,16 +1832,17 @@ function htmlForIndividulTestOnAllBuilders(test)
     html += '<div class=expectations test=' + test + '><div>' +
         linkHTMLToToggleState('showExpectations', 'results')
 
     html += '<div class=expectations test=' + test + '><div>' +
         linkHTMLToToggleState('showExpectations', 'results')
 
-    if (isLayoutTestResults()) {
-        html += ' | ' + linkHTMLToToggleState('showLargeExpectations', 'large thumbnails');
+    if (isLayoutTestResults() || isGPUTestResults()) {
+        if (isLayoutTestResults())
+            html += ' | ' + linkHTMLToToggleState('showLargeExpectations', 'large thumbnails');
         if (master == WEBKIT_BUILDER_MASTER) {
             var revision = g_currentState.revision || '';
             html += '<form onsubmit="setQueryParameter(\'revision\', revision.value);' +
                 'return false;">Show results for WebKit revision: ' +
                 '<input name=revision placeholder="e.g. 65540" value="' + revision +
                 '" id=revision-input></form>';
         if (master == WEBKIT_BUILDER_MASTER) {
             var revision = g_currentState.revision || '';
             html += '<form onsubmit="setQueryParameter(\'revision\', revision.value);' +
                 'return false;">Show results for WebKit revision: ' +
                 '<input name=revision placeholder="e.g. 65540" value="' + revision +
                 '" id=revision-input></form>';
-      } else
-        html += ' | <b>Only shows actual results/diffs from the most recent *failure* on each bot.</b>';
+        } else
+            html += ' | <b>Only shows actual results/diffs from the most recent *failure* on each bot.</b>';
     } else {
       html += ' | <span>Results height:<input ' +
           'onchange="setQueryParameter(\'resultsHeight\',this.value)" value="' +
     } else {
       html += ' | <span>Results height:<input ' +
           'onchange="setQueryParameter(\'resultsHeight\',this.value)" value="' +
@@ -2114,31 +2118,59 @@ function expectationsTitle(platform, path, builder)
 
 function loadExpectations(expectationsContainer)
 {
 
 function loadExpectations(expectationsContainer)
 {
+    var test = expectationsContainer.getAttribute('test');
     if (isLayoutTestResults())
     if (isLayoutTestResults())
-        loadExpectationsLayoutTests(expectationsContainer);
+        loadExpectationsLayoutTests(test, expectationsContainer);
     else {
     else {
-        var test = expectationsContainer.getAttribute('test');
         var results = g_testToResultsMap[test];
         for (var i = 0; i < results.length; i++)
         var results = g_testToResultsMap[test];
         for (var i = 0; i < results.length; i++)
-            loadNonWebKitResultsForBuilder(results[i].builder, test, expectationsContainer);
+            if (isGPUTestResults())
+                loadGPUResultsForBuilder(results[i].builder, test, expectationsContainer);
+            else
+                loadNonWebKitResultsForBuilder(results[i].builder, test, expectationsContainer);
     }
 }
 
     }
 }
 
+function loadGPUResultsForBuilder(builder, test, expectationsContainer)
+{
+    var container = document.createElement('div');
+    container.className = 'expectations-container';
+    container.innerHTML = '<div><b>' + builder + '</b></div>';
+    expectationsContainer.appendChild(container);
+
+    var baseUrl = 'http://chromium-browser-gpu-tests.commondatastorage.googleapis.com/runs/'
+    var failureIndex = indexesForFailures(builder, test)[0];
+
+    var buildNumber = g_resultsByBuilder[builder].buildNumbers[failureIndex];
+    var pathToLog = builderMaster(builder).getLogPath(builder, buildNumber) + pathToFailureLog(test);
+
+    var chromeRevision = g_resultsByBuilder[builder].chromeRevision[failureIndex];
+    var builderName = builder.replace(/[^A-Za-z0-9 ]/g, '').replace(/ /g, '_');
+    var resultsUrl = baseUrl + chromeRevision + '_' + builderName + '_/';
+    var filename = test.split(/\./)[1] + '.png';
+
+    appendNonWebKitResults(container, pathToLog, 'non-webkit-results');
+    appendNonWebKitResults(container, resultsUrl + 'gen/' + filename, 'gpu-test-results', 'Generated');
+    appendNonWebKitResults(container, resultsUrl + 'ref/' + filename, 'gpu-test-results', 'Reference');
+    appendNonWebKitResults(container, resultsUrl + 'diff/' + filename, 'gpu-test-results', 'Diff');
+}
+
 function loadNonWebKitResultsForBuilder(builder, test, expectationsContainer)
 {
 function loadNonWebKitResultsForBuilder(builder, test, expectationsContainer)
 {
-    var failures = buildNumbersForFailures(builder, test);
+    var failureIndexes = indexesForFailures(builder, test);
     var container = document.createElement('div');
     container.innerHTML = '<div><b>' + builder + '</b></div>';
     expectationsContainer.appendChild(container);
     var container = document.createElement('div');
     container.innerHTML = '<div><b>' + builder + '</b></div>';
     expectationsContainer.appendChild(container);
-    for (var i = 0; i < failures.length; i++) {
+    for (var i = 0; i < failureIndexes.length; i++) {
         // FIXME: This doesn't seem to work anymore. Did the paths change?
         // Once that's resolved, see if we need to try each GTEST_MODIFIERS prefix as well.
         // FIXME: This doesn't seem to work anymore. Did the paths change?
         // Once that's resolved, see if we need to try each GTEST_MODIFIERS prefix as well.
-        var pathToLog = builderMaster(builder).getLogPath(builder, failures[i]) + pathToFailureLog(test);
-        appendNonWebKitResults(container, pathToLog);
+        var buildNumber = g_resultsByBuilder[builder].buildNumbers[failureIndexes[i]];
+        var pathToLog = builderMaster(builder).getLogPath(builder, buildNumber) + pathToFailureLog(test);
+        appendNonWebKitResults(container, pathToLog, 'non-webkit-results');
     }
 }
 
     }
 }
 
-function appendNonWebKitResults(container, url)
+function appendNonWebKitResults(container, url, itemClassName, opt_title)
 {
     // Use a script tag to detect whether the URL 404s.
     // Need to use a script tag since the URL is cross-domain.
 {
     // Use a script tag to detect whether the URL 404s.
     // Need to use a script tag since the URL is cross-domain.
@@ -2148,12 +2180,22 @@ function appendNonWebKitResults(container, url)
     dummyNode.onload = function() {
         var item = document.createElement('iframe');
         item.src = dummyNode.src;
     dummyNode.onload = function() {
         var item = document.createElement('iframe');
         item.src = dummyNode.src;
-        item.className = 'non-webkit-results';
+        item.className = itemClassName;
         item.style.height = g_currentState.resultsHeight + 'px';
         item.style.height = g_currentState.resultsHeight + 'px';
-        container.appendChild(item);
+
+        if (opt_title) {
+            var childContainer = document.createElement('div');
+            childContainer.style.display = 'inline-block';
+            var title = document.createElement('div');
+            title.textContent = opt_title;
+            childContainer.appendChild(title);
+            childContainer.appendChild(item);
+            container.replaceChild(childContainer, dummyNode);
+        } else
+            container.replaceChild(item, dummyNode);
     }
     dummyNode.onerror = function() {
     }
     dummyNode.onerror = function() {
-        container.parentNode.removeChild(childContainer);
+        container.removeChild(dummyNode);
     }
 
     container.appendChild(dummyNode);
     }
 
     container.appendChild(dummyNode);
@@ -2218,11 +2260,10 @@ function loadBaselinesForTest(expectationsContainers, expectationsContainer, tes
         loadBaselinesForTest(expectationsContainers, expectationsContainer, baseTest(test, suite));
 }
 
         loadBaselinesForTest(expectationsContainers, expectationsContainer, baseTest(test, suite));
 }
 
-function loadExpectationsLayoutTests(expectationsContainer)
+function loadExpectationsLayoutTests(test, expectationsContainer)
 {
     // Map from file extension to container div for expectations of that type.
     var expectationsContainers = {};
 {
     // Map from file extension to container div for expectations of that type.
     var expectationsContainers = {};
-    var test = expectationsContainer.getAttribute('test');
 
     var revisionContainer = document.createElement('div');
     revisionContainer.textContent = "Showing results for: "
 
     var revisionContainer = document.createElement('div');
     revisionContainer.textContent = "Showing results for: "