VirtualBox

Ignore:
Timestamp:
May 28, 2016 1:38:58 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107546
Message:

testmanager: Added report on faillure reasons, listing first and last build with each.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuireport.py

    r61220 r61254  
    3131
    3232# Validation Kit imports.
    33 from testmanager.webui.wuicontentbase   import WuiContentBase;
    34 from testmanager.webui.wuihlpgraph       import WuiHlpGraphDataTable, WuiHlpBarGraph;
     33from common                             import webutils;
     34from testmanager.webui.wuicontentbase   import WuiContentBase, WuiSvnLinkWithTooltip;
     35from testmanager.webui.wuihlpgraph      import WuiHlpGraphDataTable, WuiHlpBarGraph;
    3536from testmanager.core.report            import ReportModelBase;
    3637
     
    132133    """
    133134
    134     def generateReportBody(self):
    135         # Mockup.
    136         self._sTitle = 'Success rate';
    137         return '<p>Graph showing COUNT(idFailureReason) grouped by time period.</p>' \
    138                '<p>New reasons per period, tracked down to build revision.</p>' \
    139                '<p>Show graph content in table form.</p>';
     135    def _formatEdgeOccurence(self, oTransient):
     136        """
     137        Helper for formatting the transients.
     138        oTransient is of type ReportFailureReasonTransient.
     139        """
     140        sHtml = u'<li>';
     141        if oTransient.fEnter:   sHtml += 'Since ';
     142        else:                   sHtml += 'Till ';
     143        sHtml += WuiSvnLinkWithTooltip(oTransient.iRevision, oTransient.sRepository, fBracketed = 'False').toHtml();
     144        sHtml += u', %s: ' % (self.formatTsShort(oTransient.tsDone),);
     145        sHtml += u'%s / %s' % (webutils.escapeElem(oTransient.oReason.oCategory.sShort),
     146                               webutils.escapeElem(oTransient.oReason.sShort),);
     147        sHtml += u'</li>\n';
     148
     149        return sHtml;
     150
     151
     152    def generateReportBody(self):
     153        self._sTitle = 'Failure reasons';
     154
     155        sHtml = u'';
     156
     157        #
     158        # The array of periods we get have the oldest period first [0].
     159        #
     160        oSet = self._oModel.getFailureReasons();
     161
     162        #
     163        # List failure reasons starting or stopping to appear within the data set.
     164        #
     165        dtFirstLast = {};
     166        for iPeriod, oPeriod in enumerate(oSet.aoPeriods):
     167            for oRow in oPeriod.aoRows:
     168                tIt = dtFirstLast.get(oRow.idFailureReason, (iPeriod, iPeriod));
     169                #sHtml += u'<!-- %d: %d,%d -- %d -->\n' % (oRow.idFailureReason, tIt[0], tIt[1], iPeriod);
     170                dtFirstLast[oRow.idFailureReason] = (tIt[0], iPeriod);
     171
     172        sHtml += '<!-- \n';
     173        for iPeriod, oPeriod in enumerate(oSet.aoPeriods):
     174            sHtml += ' iPeriod=%d tsStart=%s tsEnd=%s\n' % (iPeriod, oPeriod.tsStart, oPeriod.tsEnd,);
     175            sHtml += '             tsMin=%s tsMax=%s\n' % (oPeriod.tsMin, oPeriod.tsMax,);
     176            sHtml += '              %d / %s\n' % (oPeriod.iPeriod, oPeriod.sDesc,)
     177        sHtml += '-->\n';
     178
     179        sHtml += u'<h4>Changes:</h4>\n' \
     180                 u'<ul>\n';
     181        if len(oSet.aoEnterInfo) == 0 and len(oSet.aoLeaveInfo) == 0:
     182            sHtml += u'<li> No changes</li>\n';
     183        else:
     184            for oTransient in oSet.aoEnterInfo:
     185                sHtml += self._formatEdgeOccurence(oTransient);
     186            for oTransient in oSet.aoLeaveInfo:
     187                sHtml += self._formatEdgeOccurence(oTransient);
     188        sHtml += u'</ul>\n';
     189
     190        #
     191        # Graph.
     192        #
     193        if True: # pylint: disable=W0125
     194            aidSorted = sorted(oSet.dReasons, key = lambda idReason: oSet.dTotals[idReason], reverse = True);
     195        else:
     196            aidSorted = sorted(oSet.dReasons,
     197                               key = lambda idReason: '%s / %s' % (oSet.dReasons[idReason].oCategory.sShort,
     198                                                                   oSet.dReasons[idReason].sShort,));
     199
     200        asNames = [];
     201        for idReason in aidSorted:
     202            oReason = oSet.dReasons[idReason];
     203            asNames.append('%s / %s' % (oReason.oCategory.sShort, oReason.sShort,) )
     204        oTable = WuiHlpGraphDataTable('Period', asNames);
     205
     206        for iPeriod, oPeriod in enumerate(reversed(oSet.aoPeriods)):
     207            aiValues = [];
     208            for idReason in aidSorted:
     209                oRow = oPeriod.dById.get(idReason, None);
     210                iValue = oRow.cHits if oRow is not None else 0;
     211                aiValues.append(iValue);
     212            oTable.addRow(oPeriod.sDesc, aiValues);
     213
     214        oGraph = WuiHlpBarGraph('failure-reason', oTable, self._oDisp);
     215        oGraph.setRangeMax(max(oSet.cMaxRowHits + 1, 3));
     216        sHtml += oGraph.renderGraph();
     217
     218        #
     219        # Table form necessary?
     220        #
     221        #sHtml += u'<p>TODO: Show graph content in table form.</p>';
     222
     223        return sHtml;
    140224
    141225
     
    152236        oSuccessRate = WuiReportSuccessRate(self._oModel, self._dParams, fSubReport = True,
    153237                                            fnDPrint = self._fnDPrint, oDisp = self._oDisp);
    154         sHtml += oSuccessRate.show()[1];
     238
     239
     240
     241        oFailureReasons = WuiReportFailureReasons(self._oModel, self._dParams, fSubReport = True,
     242                                                  fnDPrint = self._fnDPrint, oDisp = self._oDisp);
     243        for oReport in [oSuccessRate, oFailureReasons, ]:
     244            (sTitle, sContent) = oReport.show();
     245            sHtml += '<br>'; # drop this layout hack
     246            sHtml += '<div>';
     247            sHtml += '<h3>%s</h3>\n' % (webutils.escapeElem(sTitle),);
     248            sHtml += sContent;
     249            sHtml += '</div>';
    155250
    156251        return sHtml;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette