Title: [94540] trunk/Tools
Revision
94540
Author
[email protected]
Date
2011-09-05 16:18:00 -0700 (Mon, 05 Sep 2011)

Log Message

Add a tab to garden-o-matic for viewing expected failures
https://bugs.webkit.org/show_bug.cgi?id=67619

Reviewed by Dimitri Glazkov.

This patch adds a basic tab to garden-o-matic that shows all the tests
failing on the bots, including the expected failures.  This patch
mostly involves refactoring existing classes to allow new subclasses.

This view is useful for when gardeners mark tests as expected to fail
and then rebaseline them later.

* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/garden-o-matic.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/model.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary-mock.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications_unittests.js:

Modified Paths

Diff

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js (94539 => 94540)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js	2011-09-05 23:18:00 UTC (rev 94540)
@@ -67,7 +67,11 @@
     },
 });
 
-controllers.UnexpectedFailures = base.extends(Object, {
+var FailureStreamController = base.extends(Object, {
+    _resultsFilter: null,
+    _keyFor: function(failureAnalysis) { throw "Not implemented!"; },
+    _createFailureView: function(failureAnalysis) { throw "Not implemented!"; },
+
     init: function(view)
     {
         this._view = view;
@@ -75,20 +79,10 @@
     },
     update: function(failureAnalysis)
     {
-        var key = failureAnalysis.newestPassingRevision + "+" + failureAnalysis.oldestFailingRevision;
+        var key = this._keyFor(failureAnalysis);
         var failure = this._testFailures.get(key);
-        var impliedFirstFailingRevision = failureAnalysis.newestPassingRevision + 1;
         if (!failure) {
-            failure = new ui.notifications.TestsFailing();
-            model.commitDataListForRevisionRange(impliedFirstFailingRevision, failureAnalysis.oldestFailingRevision).forEach(function(commitData) {
-                var suspiciousCommit = failure.addCommitData(commitData);
-                $(suspiciousCommit).bind('rollout', function() {
-                    this.onRollout(commitData.revision, failure.testNameList());
-                }.bind(this));
-                $(failure).bind('blame', function() {
-                    this.onBlame(failure, commitData);
-                }.bind(this));
-            }, this);
+            failure = this._createFailureView(failureAnalysis);
             this._view.add(failure);
             $(failure).bind('examine', function() {
                 this.onExamine(failure);
@@ -98,8 +92,8 @@
             }.bind(this));
         }
         failure.addFailureAnalysis(failureAnalysis);
-        failure.updateBuilderResults(model.buildersInFlightForRevision(impliedFirstFailingRevision));
         this._testFailures.update(key, failure);
+        return failure;
     },
     purge: function() {
         this._testFailures.purge(function(failure) {
@@ -114,7 +108,7 @@
 
         var testNameList = failures.testNameList();
         var failuresByTest = base.filterDictionary(
-            results.unexpectedFailuresByTest(model.state.resultsByBuilder),
+            this._resultsFilter(model.state.resultsByBuilder),
             function(key) {
                 return testNameList.indexOf(key) != -1;
             });
@@ -135,7 +129,40 @@
             // FIXME: We should have a better dialog than this!
             alert('Rebaseline done! Please land with "webkit-patch land-cowboy".');
         });
+    }
+});
+
+controllers.UnexpectedFailures = base.extends(FailureStreamController, {
+    _resultsFilter: results.expectedOrUnexpectedFailuresByTest,
+
+    _impliedFirstFailingRevision: function(failureAnalysis)
+    {
+        return failureAnalysis.newestPassingRevision + 1;
     },
+    _keyFor: function(failureAnalysis)
+    {
+        return failureAnalysis.newestPassingRevision + "+" + failureAnalysis.oldestFailingRevision;
+    },
+    _createFailureView: function(failureAnalysis)
+    {
+        var failure = new ui.notifications.FailingTestsSummary();
+        model.commitDataListForRevisionRange(this._impliedFirstFailingRevision(failureAnalysis), failureAnalysis.oldestFailingRevision).forEach(function(commitData) {
+            var suspiciousCommit = failure.addCommitData(commitData);
+            $(suspiciousCommit).bind('rollout', function() {
+                this.onRollout(commitData.revision, failure.testNameList());
+            }.bind(this));
+            $(failure).bind('blame', function() {
+                this.onBlame(failure, commitData);
+            }.bind(this));
+        }, this);
+
+        return failure;
+    },
+    update: function(failureAnalysis)
+    {
+        var failure = FailureStreamController.prototype.update.call(this, failureAnalysis);
+        failure.updateBuilderResults(model.buildersInFlightForRevision(this._impliedFirstFailingRevision(failureAnalysis)));
+    },
     onBlame: function(failure, commitData)
     {
         failure.pinToCommitData(commitData);
@@ -151,6 +178,19 @@
     }
 });
 
+controllers.Failures = base.extends(FailureStreamController, {
+    _resultsFilter: results.expectedOrUnexpectedFailuresByTest,
+
+    _keyFor: function(failureAnalysis)
+    {
+        return base.dirName(failureAnalysis.testName);
+    },
+    _createFailureView: function(failureAnalysis)
+    {
+        return new ui.notifications.FailingTests();
+    },
+});
+
 controllers.FailingBuilders = base.extends(Object, {
     init: function(view)
     {

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/garden-o-matic.js (94539 => 94540)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/garden-o-matic.js	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/garden-o-matic.js	2011-09-05 23:18:00 UTC (rev 94540)
@@ -30,7 +30,9 @@
 var g_updateTimerId = 0;
 var g_buildersFailing = null;
 
-var g_unexpectedFailures = null;
+var g_unexpectedFailuresController = null;
+var g_failuresController = null;
+
 var g_failingBuilders = null;
 
 function update()
@@ -43,10 +45,12 @@
     builders.buildersFailingStepRequredForTestCoverage(g_failingBuilders.update.bind(g_failingBuilders));
 
     base.callInParallel([model.updateRecentCommits, model.updateResultsByBuilder], function() {
-        model.analyzeUnexpectedFailures(g_unexpectedFailures.update.bind(g_unexpectedFailures), function() {
-            g_unexpectedFailures.purge();
+        model.analyzeUnexpectedFailures(g_unexpectedFailuresController.update.bind(g_unexpectedFailuresController), function() {
+            g_unexpectedFailuresController.purge();
             updating.dismiss();
         });
+
+        model.analyzeExpectedOrUnexpectedFailures(g_failuresController.update.bind(g_failuresController));
     });
 }
 
@@ -60,9 +64,12 @@
     _onebar_ = new ui.onebar();
     onebar.attach();
 
-    var actions = new ui.notifications.Stream();
-    g_unexpectedFailures = new controllers.UnexpectedFailures(actions);
+    var unexpectedFailuresView = new ui.notifications.Stream();
+    g_unexpectedFailuresController = new controllers.UnexpectedFailures(unexpectedFailuresView);
 
+    var failuresView = new ui.notifications.Stream();
+    g_failuresController = new controllers.Failures(failuresView);
+
     g_info = new ui.notifications.Stream();
     g_failingBuilders = new controllers.FailingBuilders(g_info);
 
@@ -74,8 +81,11 @@
     var summary = onebar.summary();
     summary.appendChild(updateButton);
     summary.appendChild(g_info);
-    summary.appendChild(actions);
+    summary.appendChild(unexpectedFailuresView);
 
+    var failures = onebar.failures();
+    failures.appendChild(failuresView);
+
     update();
 });
 

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/model.js (94539 => 94540)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/model.js	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/model.js	2011-09-05 23:18:00 UTC (rev 94540)
@@ -207,4 +207,20 @@
     });
 };
 
+model.analyzeExpectedOrUnexpectedFailures = function(callback)
+{
+    var expectedFailures = results.expectedOrUnexpectedFailuresByTest(model.state.resultsByBuilder);
+    $.each(expectedFailures, function(testName, resultNodesByBuilder) {
+        var failureAnalysis = {
+            'testName': testName,
+            'resultNodesByBuilder': resultNodesByBuilder,
+        };
+
+        // FIXME: Consider looking at the history to see how long this test
+        // has been failing.
+
+        callback(failureAnalysis);
+    });
+};
+
 })();

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary-mock.js (94539 => 94540)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary-mock.js	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary-mock.js	2011-09-05 23:18:00 UTC (rev 94540)
@@ -116,11 +116,11 @@
 var currentRevision = 66666;
 var currentMinutesAgo = 0;
 
-function createTestsFailing(commitDataCount, failureAnalysisCount, builderFailureCount)
+function createFailingTestsSummary(commitDataCount, failureAnalysisCount, builderFailureCount)
 {
-    var testsFailing = new ui.notifications.TestsFailing();
+    var failingTestsSummary = new ui.notifications.FailingTestsSummary();
     for (var i = 0; i < commitDataCount; ++i)
-        testsFailing.addCommitData({
+        failingTestsSummary.addCommitData({
             time: minutesAgo(currentMinutesAgo++),
             revision: currentRevision++,
             title: bugTitles.cycle(),
@@ -128,11 +128,11 @@
             reviewer: people.cycle()
         });
     for (var i = 0; i < failureAnalysisCount; ++i)
-        testsFailing.addFailureAnalysis({
+        failingTestsSummary.addFailureAnalysis({
             testName: testNames.cycle(),
             resultNodesByBuilder: createResultNodesByBuilder(builderFailureCount)
         });
-    return testsFailing;
+    return failingTestsSummary;
 }
 
 function createBuildersFailing(failingBuilderCount)
@@ -154,9 +154,9 @@
     var button = document.body.insertBefore(document.createElement('button'), document.body.firstChild);
     button.textContent = 'update';
 
-    actions.add(createTestsFailing(3, 4, 1));
-    actions.add(createTestsFailing(3, 1, 3));
-    actions.add(createTestsFailing(1, 20, 1));
+    actions.add(createFailingTestsSummary(3, 4, 1));
+    actions.add(createFailingTestsSummary(3, 1, 3));
+    actions.add(createFailingTestsSummary(1, 20, 1));
     actions.add(createBuildersFailing(1));
     actions.add(createBuildersFailing(8));
 });

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications.js (94539 => 94540)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications.js	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications.js	2011-09-05 23:18:00 UTC (rev 94540)
@@ -135,7 +135,6 @@
     init: function()
     {
         this._time = this._how.appendChild(new ui.RelativeTime());
-        this._where = this._how.appendChild(new ui.failures.FailureGrid());
         this._problem = this._what.appendChild(document.createElement('div'));
         this._problem.className = 'problem';
         this._effects = this._problem.appendChild(document.createElement('ul'));
@@ -149,7 +148,7 @@
     }
 });
 
-ui.notifications.TestsFailing = base.extends(ui.notifications.Failure, {
+ui.notifications.FailingTests = base.extends(ui.notifications.Failure, {
     init: function() {
         // FIXME: Convert actions to a link from test!
         this._problem.appendChild(new ui.actions.List([
@@ -157,7 +156,6 @@
             new ui.actions.Rebaseline(),
         ]));
         this._testNameList = [];
-        this._commitDataPinned = false;
     },
     testNameList: function()
     {
@@ -167,21 +165,54 @@
     {
         return this._testNameList.indexOf(failureAnalysis.testName) != -1;
     },
-    updateBuilderResults: function(resultNodesByBuilder)
-    {
-        this._where.add(resultNodesByBuilder);
-    },
     addFailureAnalysis: function(failureAnalysis)
     {
         if (this.containsFailureAnalysis(failureAnalysis))
-            return;
+            return false;
         this._testNameList.push(failureAnalysis.testName);
-        this.updateBuilderResults(failureAnalysis.resultNodesByBuilder);
         $(this._effects).empty();
         this._forEachTestGroup(function (testGroup) {
             this._effects.appendChild(new ui.notifications.FailingTestGroup(testGroup))
         }.bind(this));
+        return true;
     },
+    _forEachTestGroup: function(callback)
+    {
+        var testsByDirectory = {};
+        this._testNameList.forEach(function(testName) {
+            var directory = base.dirName(testName);
+            testsByDirectory[directory] = testsByDirectory[directory] || [];
+            testsByDirectory[directory].push(testName);
+        });
+        var individualTests = [];
+        Object.keys(testsByDirectory).forEach(function(directory) {
+            var testsInDirectory = testsByDirectory[directory];
+            var count = testsInDirectory.length;
+            if (count <= kMaxTestsPerGroup) {
+                individualTests = individualTests.concat(testsInDirectory);
+                return;
+            }
+            callback(directory + ' (' + count + ' tests)');
+        });
+        individualTests.forEach(callback);
+    }
+});
+
+ui.notifications.FailingTestsSummary = base.extends(ui.notifications.FailingTests, {
+    init: function() {
+        this._where = this._how.appendChild(new ui.failures.FailureGrid());
+        this._commitDataPinned = false;
+    },
+    updateBuilderResults: function(resultNodesByBuilder)
+    {
+        this._where.add(resultNodesByBuilder);
+    },
+    addFailureAnalysis: function(failureAnalysis)
+    {
+        if (!ui.notifications.FailingTests.prototype.addFailureAnalysis.call(this, failureAnalysis))
+            return false;
+        this.updateBuilderResults(failureAnalysis.resultNodesByBuilder);
+    },
     pinToCommitData: function(commitData)
     {
         if (this._commitDataPinned)
@@ -203,26 +234,6 @@
             this._time.setDate(commitDataDate);
         }
         return this._causes.appendChild(new ui.notifications.SuspiciousCommit(commitData));
-    },
-    _forEachTestGroup: function(callback)
-    {
-        var testsByDirectory = {};
-        this._testNameList.forEach(function(testName) {
-            var directory = base.dirName(testName);
-            testsByDirectory[directory] = testsByDirectory[directory] || [];
-            testsByDirectory[directory].push(testName);
-        });
-        var individualTests = [];
-        Object.keys(testsByDirectory).forEach(function(directory) {
-            var testsInDirectory = testsByDirectory[directory];
-            var count = testsInDirectory.length;
-            if (count <= kMaxTestsPerGroup) {
-                individualTests = individualTests.concat(testsInDirectory);
-                return;
-            }
-            callback(directory + ' (' + count + ' tests)');
-        });
-        individualTests.forEach(callback);
     }
 });
 
@@ -230,11 +241,9 @@
     init: function()
     {
         this._problem.insertBefore(document.createTextNode('Build Failed:'), this._problem.firstChild);
-        $(this._where).detach();
     },
     setFailingBuilders: function(builderNameList)
     {
-        // FIXME: Populate this._where with failing builders.
         $(this._effects).empty().append(builderNameList.map(function(builderName) {
             var effect = document.createElement('li');
             effect.className = 'builder-name';

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications_unittests.js (94539 => 94540)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications_unittests.js	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications_unittests.js	2011-09-05 23:18:00 UTC (rev 94540)
@@ -98,18 +98,8 @@
         '</ul>');
 });
 
-test('TestsFailing', 13, function() {
-    var testFailures = new ui.notifications.TestsFailing();
-    deepEqual(Object.getOwnPropertyNames(testFailures.__proto__), [
-        "init",
-        "testNameList",
-        "updateBuilderResults",
-        "addFailureAnalysis",
-        "pinToCommitData",
-        "_forEachTestGroup",
-        "containsFailureAnalysis",
-        "addCommitData"
-    ]);
+test('FailingTestsSummary', 12, function() {
+    var testFailures = new ui.notifications.FailingTestsSummary();
     equal(testFailures.tagName, 'LI');
     equal(testFailures.innerHTML,
         '<div class="how">' +
@@ -304,8 +294,8 @@
         '</div>');
 });
 
-test('TestsFailing (grouping)', 1, function() {
-    var testFailures = new ui.notifications.TestsFailing();
+test('FailingTestsSummary (grouping)', 1, function() {
+    var testFailures = new ui.notifications.FailingTestsSummary();
     testFailures.addFailureAnalysis({testName: 'path/to/test1.html', resultNodesByBuilder: {}});
     testFailures.addFailureAnalysis({testName: 'path/to/test2.html', resultNodesByBuilder: {}});
     testFailures.addFailureAnalysis({testName: 'path/to/test3.html', resultNodesByBuilder: {}});

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js (94539 => 94540)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js	2011-09-05 23:18:00 UTC (rev 94540)
@@ -60,14 +60,17 @@
                 '<li><a href="" +
                 '<li><a href="" +
                 '<li><a href="" +
+                '<li><a href="" +
             '</ul>' +
             '<div id="summary"></div>' +
             '<div id="results"></div>' +
-            '<div id="commits">Coming soon...</div>';
+            '<div id="commits">Coming soon...</div>' +
+            '<div id="failures"></div>';
         this._tabNames = [
             'summary',
             'results',
-            'commits,'
+            'commits',
+            'failures',
         ]
         this._tabs = $(this).tabs({
             disabled: [1, 2],
@@ -89,6 +92,10 @@
     {
         return this.tabNamed('results');
     },
+    failures: function()
+    {
+        return this.tabNamed('failures');
+    },
     select: function(tabName)
     {
         var tabIndex = this._tabNames.indexOf(tabName);

Modified: trunk/Tools/ChangeLog (94539 => 94540)


--- trunk/Tools/ChangeLog	2011-09-05 22:58:10 UTC (rev 94539)
+++ trunk/Tools/ChangeLog	2011-09-05 23:18:00 UTC (rev 94540)
@@ -1,5 +1,27 @@
 2011-09-05  Adam Barth  <[email protected]>
 
+        Add a tab to garden-o-matic for viewing expected failures
+        https://bugs.webkit.org/show_bug.cgi?id=67619
+
+        Reviewed by Dimitri Glazkov.
+
+        This patch adds a basic tab to garden-o-matic that shows all the tests
+        failing on the bots, including the expected failures.  This patch
+        mostly involves refactoring existing classes to allow new subclasses.
+
+        This view is useful for when gardeners mark tests as expected to fail
+        and then rebaseline them later.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/garden-o-matic.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/model.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary-mock.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications_unittests.js:
+
+2011-09-05  Adam Barth  <[email protected]>
+
         Fix global variable leak in garden-o-matic
         https://bugs.webkit.org/show_bug.cgi?id=67617
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to