Changeset 93607 in webkit


Ignore:
Timestamp:
Aug 23, 2011 9:02:41 AM (13 years ago)
Author:
abarth@webkit.org
Message:

garden-o-matic summary should be able to examine failures
https://bugs.webkit.org/show_bug.cgi?id=66748

Reviewed by Dimitri Glazkov.

This patch refactors a bunch of code from summary.js to independent
controllers in controllers.js. This patch also contains the first
iteration of binding the "examine" event to a the behavior showing the
details view for the tests. There's more work to do here to make this
work properly (and elegantly), but this patch is a start.

  • BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js:
  • BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js:
  • BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
  • BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers/rebaseline.js:
  • BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary.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:
  • BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js:
  • BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/summary.html:
Location:
trunk/Tools
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js

    r93259 r93607  
    7676};
    7777
     78base.filterDictionary = function(dictionary, predicate)
     79{
     80    var result = {};
     81
     82    for (var key in dictionary) {
     83        if (predicate(key))
     84            result[key] = dictionary[key];
     85    }
     86
     87    return result;
     88};
     89
    7890base.filterTree = function(tree, isLeaf, predicate)
    7991{
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js

    r93259 r93607  
    168168});
    169169
     170test("filterDictionary", 3, function() {
     171    var dictionary = {
     172        'foo': 43,
     173        'bar': 11
     174    }
     175    deepEqual(base.filterDictionary(dictionary, function() { return true; }), {
     176        "foo": 43,
     177        "bar": 11
     178    });
     179    deepEqual(base.filterDictionary(dictionary, function() { return false; }), { });
     180    deepEqual(base.filterDictionary(dictionary, function(key) { return key == 'foo'; }), {
     181        "foo": 43
     182    });
     183});
     184
    170185test("filterTree", 2, function() {
    171186    var tree = {
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js

    r93259 r93607  
    2424 */
    2525
    26 var contollers = contollers || {};
     26var controllers = controllers || {};
    2727
    2828(function(){
    2929
    30 contollers.ResultsDetails = base.extends(Object, {
     30controllers.ResultsDetails = base.extends(Object, {
    3131    init: function(view, resultsByTest)
    3232    {
     
    7575});
    7676
     77controllers.UnexpectedFailures = base.extends(Object, {
     78    init: function(view)
     79    {
     80        this._view = view;
     81        this._testFailures = new base.UpdateTracker();
     82    },
     83    update: function(failureAnalysis)
     84    {
     85        var key = failureAnalysis.newestPassingRevision + "+" + failureAnalysis.oldestFailingRevision;
     86        var failure = this._testFailures.get(key);
     87        if (!failure) {
     88            failure = new ui.notifications.TestFailures();
     89            model.commitDataListForRevisionRange(failureAnalysis.newestPassingRevision + 1, failureAnalysis.oldestFailingRevision).forEach(function(commitData) {
     90                failure.addCommitData(commitData);
     91            });
     92            this._view.add(failure);
     93            $(failure).bind('examine', function() {
     94                this.onExamine(failure);
     95            }.bind(this));
     96        }
     97        failure.addFailureAnalysis(failureAnalysis);
     98        this._testFailures.update(key, failure);
     99    },
     100    purge: function() {
     101        this._testFailures.purge(function(failure) {
     102            failure.dismiss();
     103        });
     104    },
     105    onExamine: function(failures)
     106    {
     107        var resultsView = new ui.results.View({
     108            fetchResultsURLs: results.fetchResultsURLs
     109        });
     110
     111        var testNameList = failures.testNameList();
     112        var failuresByTest = results.unexpectedFailuresByTest(model.state.resultsByBuilder)
     113        var controller = new controllers.ResultsDetails(resultsView, base.filterDictionary(failuresByTest, function(key) {
     114            return testNameList.indexOf(testNameList) != -1;
     115        }));
     116
     117        // FIXME: This doesn't belong here. Also, we need some way to call controller.dismiss().
     118        document.body.appendChild(resultsView);
     119    }
     120});
     121
     122controllers.FailingBuilders = base.extends(Object, {
     123    init: function(view)
     124    {
     125        this._view = view;
     126        this._notification = null;
     127    },
     128    update: function(builderNameList)
     129    {
     130        if (builderNameList.length == 0) {
     131            if (this._notification) {
     132                this._notification.dismiss();
     133                this._notification = null;
     134            }
     135            return;
     136        }
     137        if (!this._notification) {
     138            this._notification = new ui.notifications.BuildersFailing();
     139            this._view.add(this._notification);
     140        }
     141        // FIXME: We should provide regression ranges for the failing builders.
     142        // This doesn't seem to happen often enough to worry too much about that, however.
     143        this._notification.setFailingBuilders(builderNameList);
     144    }
     145});
     146
    77147})();
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers/rebaseline.js

    r93236 r93607  
    3232        });
    3333
    34         var failureByTest = results.expectedOrUnexpectedFailuresByTest(model.state.resultsByBuilder);
    35         var controller = new contollers.ResultsDetails(resultsView, failureByTest);
     34        var failuresByTest = results.expectedOrUnexpectedFailuresByTest(model.state.resultsByBuilder);
     35        var controller = new controllers.ResultsDetails(resultsView, failuresByTest);
    3636        document.body.appendChild(resultsView);
    3737    });
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary.js

    r93480 r93607  
    2626(function() {
    2727
    28 var g_actions = new ui.notifications.Stream();
    29 var g_info = new ui.notifications.Stream();
     28var g_info = null;
    3029
    3130var g_updateTimerId = 0;
    32 var g_testFailures = new base.UpdateTracker();
    3331var g_buildersFailing = null;
     32
     33var g_unexpectedFailures = null;
     34var g_failingBuilders = null;
    3435
    3536function update()
    3637{
    3738    // FIXME: This should be a button with a progress element.
    38     var updating = new ui.notifications.Info("Updating ...");
     39    var updating = new ui.notifications.Info('Updating ...');
     40
    3941    g_info.add(updating);
    4042
    41     builders.buildersFailingStepRequredForTestCoverage(function(builderNameList) {
    42         if (builderNameList.length == 0) {
    43             if (g_buildersFailing) {
    44                 g_buildersFailing.dismiss();
    45                 g_buildersFailing = null;
    46             }
    47             return;
    48         }
    49         if (!g_buildersFailing) {
    50             g_buildersFailing = new ui.notifications.BuildersFailing();
    51             g_info.add(g_buildersFailing);
    52         }
    53         // FIXME: We should provide regression ranges for the failing builders.
    54         // This doesn't seem to happen often enough to worry too much about that, however.
    55         g_buildersFailing.setFailingBuilders(builderNameList);
    56     });
     43    builders.buildersFailingStepRequredForTestCoverage(g_failingBuilders.update.bind(g_failingBuilders));
    5744
    5845    base.callInParallel([model.updateRecentCommits, model.updateResultsByBuilder], function() {
    59         model.analyzeUnexpectedFailures(function(failureAnalysis) {
    60             var key = failureAnalysis.newestPassingRevision + "+" + failureAnalysis.oldestFailingRevision;
    61             var failure = g_testFailures.get(key);
    62             if (!failure) {
    63                 failure = new ui.notifications.TestFailures();
    64                 model.commitDataListForRevisionRange(failureAnalysis.newestPassingRevision + 1, failureAnalysis.oldestFailingRevision).forEach(function(commitData) {
    65                     failure.addCommitData(commitData);
    66                 });
    67                 g_actions.add(failure);
    68             }
    69             failure.addFailureAnalysis(failureAnalysis);
    70             g_testFailures.update(key, failure);
    71         }, function() {
    72             g_testFailures.purge(function(failure) {
    73                 failure.dismiss();
    74             });
     46        model.analyzeUnexpectedFailures(g_unexpectedFailures.update.bind(g_unexpectedFailures), function() {
     47            g_unexpectedFailures.purge();
    7548            updating.dismiss();
    7649        });
     
    8053$(document).ready(function() {
    8154    g_updateTimerId = window.setInterval(update, config.kUpdateFrequency);
    82     document.body.insertBefore(g_actions, document.body.firstChild);
     55
     56    var actions = new ui.notifications.Stream();
     57    g_unexpectedFailures = new controllers.UnexpectedFailures(actions);
     58
     59    g_info = new ui.notifications.Stream();
     60    g_failingBuilders = new controllers.FailingBuilders(g_info);
     61
     62    document.body.insertBefore(actions, document.body.firstChild);
    8363    document.body.insertBefore(g_info, document.body.firstChild);
    84     var button = document.body.insertBefore(document.createElement("button"), document.body.firstChild);
     64
     65    // FIXME: This should be an Action object.
     66    var button = document.body.insertBefore(document.createElement('button'), document.body.firstChild);
    8567    button.addEventListener("click", update);
    8668    button.textContent = 'update';
     69
    8770    update();
    8871});
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications.js

    r93522 r93607  
    139139            new ui.actions.Examine()
    140140        ]));
     141        this._testNameList = [];
     142    },
     143    testNameList: function()
     144    {
     145        return this._testNameList;
    141146    },
    142147    containsFailureAnalysis: function(failureAnalysis)
     
    150155        if (this.containsFailureAnalysis(failureAnalysis))
    151156            return;
     157        this._testNameList.push(failureAnalysis.testName);
    152158        return this._effects.appendChild(new ui.notifications.FailingTest(failureAnalysis));
    153159    },
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications_unittests.js

    r93522 r93607  
    9191});
    9292
    93 test('TestFailures', 7, function() {
     93test('TestFailures', 8, function() {
    9494    var testFailures = new ui.notifications.TestFailures();
    9595    equal(testFailures.tagName, 'LI');
     
    135135            '<li><button>Examine</button></li>' +
    136136        '</ul>');
     137    deepEqual(testFailures.testNameList(), ['test']);
    137138    var time = new Date();
    138139    time.setMinutes(time.getMinutes() - 10);
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js

    r93259 r93607  
    5151        fetchResultsURLs: $.noop
    5252    });
    53     var controller = new contollers.ResultsDetails(resultsView, kExampleResultsByTest);
     53    var controller = new controllers.ResultsDetails(resultsView, kExampleResultsByTest);
    5454    controller.showTest("scrollbars/custom-scrollbar-with-incomplete-style.html");
    5555    equal(resultsView.currentTestName(), "scrollbars/custom-scrollbar-with-incomplete-style.html");
  • trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/summary.html

    r93483 r93607  
    4747<script src="scripts/ui/notifications.js"></script>
    4848<script src="scripts/ui/results.js"></script>
     49<script src="scripts/controllers.js"></script>
    4950<script src="scripts/summary.js"></script>
    5051</body>
  • trunk/Tools/ChangeLog

    r93588 r93607  
     12011-08-23  Adam Barth  <abarth@webkit.org>
     2
     3        garden-o-matic summary should be able to examine failures
     4        https://bugs.webkit.org/show_bug.cgi?id=66748
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        This patch refactors a bunch of code from summary.js to independent
     9        controllers in controllers.js.  This patch also contains the first
     10        iteration of binding the "examine" event to a the behavior showing the
     11        details view for the tests.  There's more work to do here to make this
     12        work properly (and elegantly), but this patch is a start.
     13
     14        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js:
     15        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base_unittests.js:
     16        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
     17        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers/rebaseline.js:
     18        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/summary.js:
     19        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications.js:
     20        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/notifications_unittests.js:
     21        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js:
     22        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/summary.html:
     23
    1242011-08-23  Adam Barth  <abarth@webkit.org>
    225
Note: See TracChangeset for help on using the changeset viewer.