Home | History | Annotate | Download | only in scripts
      1 /*
      2  * Copyright (C) 2011 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 (function() {
     27 
     28 function minutesAgo(minutes)
     29 {
     30     var time = new Date();
     31     time.setMinutes(time.getMinutes() - minutes);
     32     return time;
     33 }
     34 
     35 function Cycler(items, repeat)
     36 {
     37     this._index = 0;
     38     this._repeat = repeat || 1;
     39     this._repeated = 0;
     40     this._items = items;
     41 }
     42 
     43 Cycler.prototype = {
     44     _updateRepeat: function()
     45     {
     46         if (++this._repeated >= this._repeat) {
     47             this._repeated = this._repeat;
     48             return false;
     49         }
     50         return true;
     51     },
     52     _updateIndex: function()
     53     {
     54         if (this._updateRepeat())
     55             return;
     56         if (++this._index >= this._items.length)
     57             this._index = 0;
     58     },
     59     cycle: function()
     60     {
     61         var result = this._items[this._index];
     62         this._updateIndex();
     63         return result;
     64     }
     65 }
     66 
     67 var people = new Cycler([
     68     'Eustace Bagge',
     69     'Dick Dastardly',
     70     'Major Glory',
     71     'Barney Rubble',
     72     'Bunny Bravo',
     73     'Race Bannon',
     74 ]);
     75 
     76 var bugTitles = new Cycler([
     77     'Unreviewed. Chromium rebaselines for r93794. * ...',
     78     'Fix build when GCC 4.2 is not installed. * ... ',
     79     '[Qt] Unreviewed gardening. * platform/qt/Skipped: Skip new tests until ...',
     80     'garden-o-matic needs a way to report where and how tests are failing in ... ',
     81     'REGRESSION(r90971): Fix an assertion failure with textarea placeholder. ...',
     82     'Incorrect layout of :before and :after content, with display table, ...',
     83     ' JSHTMLImageElement (and associated Node) is abandoned when image load is ... '
     84 ]);
     85 
     86 var testNames = new Cycler([
     87     'fast/ruby/text-emphasis.html',
     88     'plugins/destroy-during-npp-new.html',
     89     'tables/mozilla/bugs/bug60749.html',
     90     'tables/mozilla/bugs/bug51727.html',
     91     'tables/mozilla/bugs/bug33855.html',
     92     'tables/mozilla/bugs/bug52506.htm',
     93     'tables/mozilla/bugs/bug18359.html',
     94     'tables/mozilla/bugs/bug46368-1.html',
     95     'tables/mozilla/bugs/bug46368-2.html',
     96     'tables/mozilla/bugs/bug52505.html'
     97 ]);
     98 
     99 var builders = new Cycler(Object.keys(config.currentBuilders()), 3);
    100 
    101 var expectations = new Cycler([
    102     'TEXT',
    103     'IMAGE+TEXT',
    104     'TIMEOUT',
    105     'CRASH'
    106 ], 4);
    107 
    108 function createResultNodesByBuilder(builderFailureCount)
    109 {
    110     var result = {};
    111     for(var i = 0; i < builderFailureCount; ++i)
    112         result[builders.cycle()] = { actual: expectations.cycle() };
    113     return result;
    114 }
    115 
    116 var currentRevision = 66666;
    117 var currentMinutesAgo = 0;
    118 
    119 function createFailingTestsSummary(commitDataCount, failureAnalysisCount, builderFailureCount)
    120 {
    121     var failingTestsSummary = new ui.notifications.FailingTestsSummary();
    122     for (var i = 0; i < commitDataCount; ++i)
    123         failingTestsSummary.addCommitData({
    124             time: minutesAgo(currentMinutesAgo++),
    125             revision: currentRevision++,
    126             summary: bugTitles.cycle(),
    127             author: people.cycle(),
    128             reviewer: people.cycle()
    129         });
    130     for (var i = 0; i < failureAnalysisCount; ++i)
    131         failingTestsSummary.addFailureAnalysis({
    132             testName: testNames.cycle(),
    133             resultNodesByBuilder: createResultNodesByBuilder(builderFailureCount)
    134         });
    135     return failingTestsSummary;
    136 }
    137 
    138 function createBuildersFailing(failingBuilderCount)
    139 {
    140     var buildersFailing = new ui.notifications.BuildersFailing();
    141     builderNameList = [];
    142     for (var i = 0; i < failingBuilderCount; ++i)
    143         builderNameList.push(builders.cycle());
    144     buildersFailing.setFailingBuilders(builderNameList);
    145     return buildersFailing
    146 }
    147 
    148 $(document).ready(function() {
    149 
    150     var actions = new ui.notifications.Stream();
    151     document.body.insertBefore(actions, document.body.firstChild);
    152 
    153     // FIXME: This should be an Action object.
    154     var button = document.body.insertBefore(document.createElement('button'), document.body.firstChild);
    155     button.textContent = 'update';
    156 
    157     actions.add(createFailingTestsSummary(3, 4, 1));
    158     actions.add(createFailingTestsSummary(3, 1, 3));
    159     actions.add(createFailingTestsSummary(1, 20, 1));
    160     actions.add(createBuildersFailing(1));
    161     actions.add(createBuildersFailing(8));
    162 });
    163 
    164 })();
    165