def _formatListEntry(self, iEntry): from testmanager.webui.wuiadmin import WuiAdmin oEntry = self._aoEntries[iEntry] aoActions = [] if oEntry.sLogUrl is not None: aoActions.append(WuiBuildLogLink(oEntry.sLogUrl, 'Build Log')) dParams = { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildBlacklistAdd, BuildBlacklistData.ksParam_sProduct: oEntry.oCat.sProduct, BuildBlacklistData.ksParam_sBranch: oEntry.oCat.sBranch, BuildBlacklistData.ksParam_asTypes: oEntry.oCat.sType, BuildBlacklistData.ksParam_asOsArches: oEntry.oCat.asOsArches, BuildBlacklistData.ksParam_iFirstRevision: oEntry.iRevision, BuildBlacklistData.ksParam_iLastRevision: oEntry.iRevision } if self._oDisp is None or not self._oDisp.isReadOnlyUser(): aoActions += [ WuiTmLink('Blacklist', WuiAdmin.ksScriptName, dParams), WuiTmLink( 'Details', WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildDetails, BuildData.ksParam_idBuild: oEntry.idBuild, WuiAdmin.ksParamEffectiveDate: self._tsEffectiveDate, }), WuiTmLink( 'Clone', WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildClone, BuildData.ksParam_idBuild: oEntry.idBuild, WuiAdmin.ksParamEffectiveDate: self._tsEffectiveDate, }), ] if isDbTimestampInfinity(oEntry.tsExpire): aoActions += [ WuiTmLink( 'Modify', WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildEdit, BuildData.ksParam_idBuild: oEntry.idBuild }), WuiTmLink( 'Remove', WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildDoRemove, BuildData.ksParam_idBuild: oEntry.idBuild }, sConfirm='Are you sure you want to remove build #%d?' % (oEntry.idBuild, )), ] return [ oEntry.idBuild, oEntry.oCat.sProduct, oEntry.oCat.sBranch, WuiSvnLinkWithTooltip(oEntry.iRevision, oEntry.oCat.sRepository, sName='%s r%s' % ( oEntry.sVersion, oEntry.iRevision, )), oEntry.oCat.sType, ' '.join(oEntry.oCat.asOsArches), 'batch' if oEntry.uidAuthor is None else oEntry.uidAuthor, self.formatTsShort(oEntry.tsCreated), oEntry.sBinaries if not oEntry.fBinariesDeleted else '<Deleted>', aoActions, ]
def showTestCaseResultDetails(self, # pylint: disable=R0914,R0915 oTestResultTree, oTestSet, oBuildEx, oValidationKitEx, oTestBox, oTestGroup, oTestCaseEx, oTestVarEx): """Show detailed result""" def getTcDepsHtmlList(aoTestCaseData): """Get HTML <ul> list of Test Case name items""" if len(aoTestCaseData) > 0: sTmp = '<ul>' for oTestCaseData in aoTestCaseData: sTmp += '<li>%s</li>' % (webutils.escapeElem(oTestCaseData.sName),); sTmp += '</ul>' else: sTmp = 'No items' return sTmp def getGrDepsHtmlList(aoGlobalResourceData): """Get HTML <ul> list of Global Resource name items""" if len(aoGlobalResourceData) > 0: sTmp = '<ul>' for oGlobalResourceData in aoGlobalResourceData: sTmp += '<li>%s</li>' % (webutils.escapeElem(oGlobalResourceData.sName),); sTmp += '</ul>' else: sTmp = 'No items' return sTmp asHtml = [] # Test result + test set details. aoResultRows = [ WuiTmLink(oTestCaseEx.sName, self.oWuiAdmin.ksScriptName, { self.oWuiAdmin.ksParamAction: self.oWuiAdmin.ksActionTestCaseDetails, TestCaseData.ksParam_idTestCase: oTestCaseEx.idTestCase, self.oWuiAdmin.ksParamEffectiveDate: oTestSet.tsConfig, }, fBracketed = False), ]; if oTestCaseEx.sDescription is not None and len(oTestCaseEx.sDescription) > 0: aoResultRows.append([oTestCaseEx.sDescription,]); aoResultRows.append([ 'Status:', WuiRawHtml('<span class="tmspan-status-%s">%s</span>' % (oTestResultTree.enmStatus, oTestResultTree.enmStatus,))]); if oTestResultTree.cErrors > 0: aoResultRows.append(( 'Errors:', oTestResultTree.cErrors )); aoResultRows.append([ 'Elapsed:', oTestResultTree.tsElapsed ]); cSecCfgTimeout = oTestCaseEx.cSecTimeout if oTestVarEx.cSecTimeout is None else oTestVarEx.cSecTimeout; cSecEffTimeout = cSecCfgTimeout * oTestBox.pctScaleTimeout / 100; aoResultRows.append([ 'Timeout:', '%s (%s sec)' % (utils.formatIntervalSeconds(cSecEffTimeout), cSecEffTimeout,) ]); if cSecEffTimeout != cSecCfgTimeout: aoResultRows.append([ 'Cfg Timeout:', '%s (%s sec)' % (utils.formatIntervalSeconds(cSecCfgTimeout), cSecCfgTimeout,) ]); aoResultRows += [ ( 'Started:', WuiTmLink(self.formatTsShort(oTestSet.tsCreated), WuiMain.ksScriptName, { WuiMain.ksParamAction: WuiMain.ksActionResultsUnGrouped, WuiMain.ksParamEffectiveDate: oTestSet.tsCreated, }, fBracketed = False) ), ]; if oTestSet.tsDone is not None: aoResultRows += [ ( 'Done:', WuiTmLink(self.formatTsShort(oTestSet.tsDone), WuiMain.ksScriptName, { WuiMain.ksParamAction: WuiMain.ksActionResultsUnGrouped, WuiMain.ksParamEffectiveDate: oTestSet.tsDone, }, fBracketed = False) ) ]; else: aoResultRows += [( 'Done:', 'Still running...')]; aoResultRows += [( 'Config:', oTestSet.tsConfig )]; if oTestVarEx.cGangMembers > 1: aoResultRows.append([ 'Member No:', '#%s (of %s)' % (oTestSet.iGangMemberNo, oTestVarEx.cGangMembers) ]); aoResultRows += [ ( 'Test Group:', WuiTmLink(oTestGroup.sName, self.oWuiAdmin.ksScriptName, { self.oWuiAdmin.ksParamAction: self.oWuiAdmin.ksActionTestGroupDetails, TestGroupData.ksParam_idTestGroup: oTestGroup.idTestGroup, self.oWuiAdmin.ksParamEffectiveDate: oTestSet.tsConfig, }, fBracketed = False) ), ]; if oTestVarEx.sTestBoxReqExpr is not None: aoResultRows.append([ 'TestBox reqs:', oTestVarEx.sTestBoxReqExpr ]); elif oTestCaseEx.sTestBoxReqExpr is not None or oTestVarEx.sTestBoxReqExpr is not None: aoResultRows.append([ 'TestBox reqs:', oTestCaseEx.sTestBoxReqExpr ]); if oTestVarEx.sBuildReqExpr is not None: aoResultRows.append([ 'Build reqs:', oTestVarEx.sBuildReqExpr ]); elif oTestCaseEx.sBuildReqExpr is not None or oTestVarEx.sBuildReqExpr is not None: aoResultRows.append([ 'Build reqs:', oTestCaseEx.sBuildReqExpr ]); if oTestCaseEx.sValidationKitZips is not None and oTestCaseEx.sValidationKitZips != '@VALIDATIONKIT_ZIP@': aoResultRows.append([ 'Validation Kit:', oTestCaseEx.sValidationKitZips ]); if oTestCaseEx.aoDepTestCases is not None and len(oTestCaseEx.aoDepTestCases) > 0: aoResultRows.append([ 'Prereq. Test Cases:', oTestCaseEx.aoDepTestCases, getTcDepsHtmlList ]); if oTestCaseEx.aoDepGlobalResources is not None and len(oTestCaseEx.aoDepGlobalResources) > 0: aoResultRows.append([ 'Global Resources:', oTestCaseEx.aoDepGlobalResources, getGrDepsHtmlList ]); # Builds. aoBuildRows = []; if oBuildEx is not None: aoBuildRows += [ WuiTmLink('Build', self.oWuiAdmin.ksScriptName, { self.oWuiAdmin.ksParamAction: self.oWuiAdmin.ksActionBuildDetails, BuildData.ksParam_idBuild: oBuildEx.idBuild, self.oWuiAdmin.ksParamEffectiveDate: oTestSet.tsCreated, }, fBracketed = False), ]; self._anchorAndAppendBinaries(oBuildEx.sBinaries, aoBuildRows); aoBuildRows += [ ( 'Revision:', WuiSvnLinkWithTooltip(oBuildEx.iRevision, oBuildEx.oCat.sRepository, fBracketed = False) ), ( 'Product:', oBuildEx.oCat.sProduct ), ( 'Branch:', oBuildEx.oCat.sBranch ), ( 'Type:', oBuildEx.oCat.sType ), ( 'Version:', oBuildEx.sVersion ), ( 'Created:', oBuildEx.tsCreated ), ]; if oBuildEx.uidAuthor is not None: aoBuildRows += [ ( 'Author ID:', oBuildEx.uidAuthor ), ]; if oBuildEx.sLogUrl is not None: aoBuildRows += [ ( 'Log:', WuiBuildLogLink(oBuildEx.sLogUrl, fBracketed = False) ), ]; aoValidationKitRows = []; if oValidationKitEx is not None: aoValidationKitRows += [ WuiTmLink('Validation Kit', self.oWuiAdmin.ksScriptName, { self.oWuiAdmin.ksParamAction: self.oWuiAdmin.ksActionBuildDetails, BuildData.ksParam_idBuild: oValidationKitEx.idBuild, self.oWuiAdmin.ksParamEffectiveDate: oTestSet.tsCreated, }, fBracketed = False), ]; self._anchorAndAppendBinaries(oValidationKitEx.sBinaries, aoValidationKitRows); aoValidationKitRows += [ ( 'Revision:', WuiSvnLink(oValidationKitEx.iRevision, fBracketed = False) ) ]; if oValidationKitEx.oCat.sProduct != 'VBox TestSuite': aoValidationKitRows += [ ( 'Product:', oValidationKitEx.oCat.sProduct ), ]; if oValidationKitEx.oCat.sBranch != 'trunk': aoValidationKitRows += [ ( 'Product:', oValidationKitEx.oCat.sBranch ), ]; if oValidationKitEx.oCat.sType != 'release': aoValidationKitRows += [ ( 'Type:', oValidationKitEx.oCat.sType), ]; if oValidationKitEx.sVersion != '0.0.0': aoValidationKitRows += [ ( 'Version:', oValidationKitEx.sVersion ), ]; aoValidationKitRows += [ ( 'Created:', oValidationKitEx.tsCreated ), ]; if oValidationKitEx.uidAuthor is not None: aoValidationKitRows += [ ( 'Author ID:', oValidationKitEx.uidAuthor ), ]; if oValidationKitEx.sLogUrl is not None: aoValidationKitRows += [ ( 'Log:', WuiBuildLogLink(oValidationKitEx.sLogUrl, fBracketed = False) ), ]; # TestBox. aoTestBoxRows = [ WuiTmLink(oTestBox.sName, self.oWuiAdmin.ksScriptName, { self.oWuiAdmin.ksParamAction: self.oWuiAdmin.ksActionTestBoxDetails, TestBoxData.ksParam_idGenTestBox: oTestSet.idGenTestBox, }, fBracketed = False), ]; if oTestBox.sDescription is not None and len(oTestBox.sDescription) > 0: aoTestBoxRows.append([oTestBox.sDescription, ]); aoTestBoxRows += [ ( 'IP:', oTestBox.ip ), #( 'UUID:', oTestBox.uuidSystem ), #( 'Enabled:', oTestBox.fEnabled ), #( 'Lom Kind:', oTestBox.enmLomKind ), #( 'Lom IP:', oTestBox.ipLom ), ( 'OS/Arch:', '%s.%s' % (oTestBox.sOs, oTestBox.sCpuArch) ), ( 'OS Version:', oTestBox.sOsVersion ), ( 'CPUs:', oTestBox.cCpus ), ]; if oTestBox.sCpuName is not None: aoTestBoxRows.append(['CPU Name', oTestBox.sCpuName.replace(' ', ' ')]); if oTestBox.lCpuRevision is not None: # ASSUMING x86+AMD64 versioning scheme here. uFamily = (oTestBox.lCpuRevision >> 24) & 0xff; uModel = (oTestBox.lCpuRevision >> 8) & 0xffff; uStepping = oTestBox.lCpuRevision & 0xff; aoTestBoxRows += [ ( 'CPU Family', '%u (%#x)' % ( uFamily, uFamily, ) ), ( 'CPU Model', '%u (%#x)' % ( uModel, uModel, ) ), ( 'CPU Stepping', '%u (%#x)' % ( uStepping, uStepping, ) ), ]; asFeatures = [ oTestBox.sCpuVendor, ]; if oTestBox.fCpuHwVirt is True: asFeatures.append(u'HW\u2011Virt'); if oTestBox.fCpuNestedPaging is True: asFeatures.append(u'Nested\u2011Paging'); if oTestBox.fCpu64BitGuest is True: asFeatures.append(u'64\u2011bit\u2011Guest'); if oTestBox.fChipsetIoMmu is True: asFeatures.append(u'I/O\u2011MMU'); aoTestBoxRows += [ ( 'Features:', u' '.join(asFeatures) ), ( 'RAM size:', '%s MB' % (oTestBox.cMbMemory,) ), ( 'Scratch Size:', '%s MB' % (oTestBox.cMbScratch,) ), ( 'Scale Timeout:', '%s%%' % (oTestBox.pctScaleTimeout,) ), ( 'Script Rev:', WuiSvnLink(oTestBox.iTestBoxScriptRev, fBracketed = False) ), ( 'Python:', oTestBox.formatPythonVersion() ), ( 'Pending Command:', oTestBox.enmPendingCmd ), ]; aoRows = [ aoResultRows, aoBuildRows, aoValidationKitRows, aoTestBoxRows, ]; asHtml.append(self._htmlTable(aoRows)); # # Convert the tree to a list of events, values, message and files. # sHtmlEvents = ''; sHtmlEvents += '<table class="tmtbl-events" id="tmtbl-events" width="100%">\n'; sHtmlEvents += ' <tr class="tmheader">\n' \ ' <th>When</th>\n' \ ' <th></th>\n' \ ' <th>Elapsed</th>\n' \ ' <th>Event name</th>\n' \ ' <th colspan="2">Value (status)</th>' \ ' <th></th>\n' \ ' </tr>\n'; sPrettyCmdLine = ' \\<br> \n'.join(webutils.escapeElem(oTestCaseEx.sBaseCmd + ' ' + oTestVarEx.sArgs).split() ); (sTmp, _, cFailures) = self._recursivelyGenerateEvents(oTestResultTree, sPrettyCmdLine, '', 1, 0, oTestSet, 0); sHtmlEvents += sTmp; sHtmlEvents += '</table>\n' # # Put it all together. # sHtml = '<table class="tmtbl-testresult-details-base" width="100%">\n'; sHtml += ' <tr>\n' sHtml += ' <td valign="top" width="20%%">\n%s\n</td>\n' % ' <br>\n'.join(asHtml); sHtml += ' <td valign="top" width="80%" style="padding-left:6px">\n'; sHtml += ' <h2>Events:</h2>\n'; sHtml += ' <form action="#" method="get" id="graph-form">\n' \ ' <input type="hidden" name="%s" value="%s"/>\n' \ ' <input type="hidden" name="%s" value="%u"/>\n' \ ' <input type="hidden" name="%s" value="%u"/>\n' \ ' <input type="hidden" name="%s" value="%u"/>\n' \ ' <input type="hidden" name="%s" value="%u"/>\n' \ % ( WuiMain.ksParamAction, WuiMain.ksActionGraphWiz, WuiMain.ksParamGraphWizTestBoxIds, oTestBox.idTestBox, WuiMain.ksParamGraphWizBuildCatIds, oBuildEx.idBuildCategory, WuiMain.ksParamGraphWizTestCaseIds, oTestSet.idTestCase, WuiMain.ksParamGraphWizSrcTestSetId, oTestSet.idTestSet, ); if oTestSet.tsDone is not None: sHtml += ' <input type="hidden" name="%s" value="%s"/>\n' \ % ( WuiMain.ksParamEffectiveDate, oTestSet.tsDone, ); sHtml += ' <p>\n'; sFormButton = '<button type="submit" onclick="%s">Show graphs</button>' \ % ( webutils.escapeAttr('addDynamicGraphInputs("graph-form", "main", "%s", "%s");' % (WuiMain.ksParamGraphWizWidth, WuiMain.ksParamGraphWizDpi, )) ); sHtml += ' ' + sFormButton + '\n'; sHtml += ' %s %s %s\n' \ % ( WuiTmLink('Log File', '', { WuiMain.ksParamAction: WuiMain.ksActionViewLog, WuiMain.ksParamLogSetId: oTestSet.idTestSet, }), WuiTmLink('Raw Log', '', { WuiMain.ksParamAction: WuiMain.ksActionGetFile, WuiMain.ksParamGetFileSetId: oTestSet.idTestSet, WuiMain.ksParamGetFileDownloadIt: False, }), WuiTmLink('Download Log', '', { WuiMain.ksParamAction: WuiMain.ksActionGetFile, WuiMain.ksParamGetFileSetId: oTestSet.idTestSet, WuiMain.ksParamGetFileDownloadIt: True, }), ); sHtml += ' </p>\n'; if cFailures == 1: sHtml += ' <p>%s</p>\n' % ( WuiTmLink('Jump to failure', '#failure-0'), ) elif cFailures > 1: sHtml += ' <p>Jump to failure: '; if cFailures <= 13: for iFailure in range(0, cFailures): sHtml += ' ' + WuiTmLink('#%u' % (iFailure,), '#failure-%u' % (iFailure,)).toHtml(); else: for iFailure in range(0, 6): sHtml += ' ' + WuiTmLink('#%u' % (iFailure,), '#failure-%u' % (iFailure,)).toHtml(); sHtml += ' ... '; for iFailure in range(cFailures - 6, cFailures): sHtml += ' ' + WuiTmLink('#%u' % (iFailure,), '#failure-%u' % (iFailure,)).toHtml(); sHtml += ' </p>\n'; sHtml += sHtmlEvents; sHtml += ' <p>' + sFormButton + '</p>\n'; sHtml += ' </form>\n'; sHtml += ' </td>\n'; sHtml += ' </tr>\n'; sHtml += '</table>\n'; return ('Test Case result details', sHtml)
def _formatListEntry(self, iEntry): """ Format *show all* table entry """ oEntry = self._aoEntries[iEntry]; from testmanager.webui.wuiadmin import WuiAdmin; oValidationKit = None; if oEntry.idBuildTestSuite is not None: oValidationKit = WuiTmLink('#%d - r%s' % (oEntry.idBuildTestSuite, oEntry.iRevisionTestSuite), WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildDetails, BuildData.ksParam_idBuild: oEntry.idBuildTestSuite }, fBracketed = False); aoTestSetLinks = [ WuiTmLink(oEntry.enmStatus, WuiMain.ksScriptName, { WuiMain.ksParamAction: WuiMain.ksActionTestResultDetails, TestSetData.ksParam_idTestSet: oEntry.idTestSet }, fBracketed = False),]; if oEntry.cErrors > 0: aoTestSetLinks.append(WuiTmLink('- %d error(s)' % (oEntry.cErrors, ), WuiMain.ksScriptName, { WuiMain.ksParamAction: WuiMain.ksActionTestResultDetails, TestSetData.ksParam_idTestSet: oEntry.idTestSet }, sFragmentId = 'failure-0', fBracketed = False)); self._dTestBoxLinkParams[WuiMain.ksParamGroupMemberId] = oEntry.idTestBox; self._dTestCaseLinkParams[WuiMain.ksParamGroupMemberId] = oEntry.idTestCase; self._dRevLinkParams[WuiMain.ksParamGroupMemberId] = oEntry.iRevision; sTestBoxTitle = u''; if oEntry.sCpuVendor is not None: sTestBoxTitle += 'CPU vendor:\t%s\n' % ( oEntry.sCpuVendor, ); if oEntry.sCpuName is not None: sTestBoxTitle += 'CPU name:\t%s\n' % ( ' '.join(oEntry.sCpuName.split()), ); if oEntry.sOsVersion is not None: sTestBoxTitle += 'OS version:\t%s\n' % ( oEntry.sOsVersion, ); asFeatures = []; if oEntry.fCpuHwVirt is True: asFeatures.append(u'HW\u2011Virt'); if oEntry.fCpuNestedPaging is True: asFeatures.append(u'Nested\u2011Paging'); if oEntry.fCpu64BitGuest is True: asFeatures.append(u'64\u2011bit\u2011Guest'); #if oEntry.fChipsetIoMmu is True: asFeatures.append(u'I/O\u2011MMU'); sTestBoxTitle += u'CPU features:\t' + u', '.join(asFeatures); return [ oEntry.tsCreated, [ WuiTmLink('#%d - %s %s (%s)' % (oEntry.idBuild, oEntry.sProduct, oEntry.sVersion, oEntry.sType,), WuiMain.ksScriptName, self._dRevLinkParams, sTitle = '%s' % (oEntry.sBranch,), fBracketed = False), WuiSvnLinkWithTooltip(oEntry.iRevision, 'vbox'), ## @todo add sRepository TestResultListingData WuiTmLink(self.ksShortDetailsLink, WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildDetails, BuildData.ksParam_idBuild: oEntry.idBuild }, fBracketed = False), ], oValidationKit, '%s.%s' % (oEntry.sOs, oEntry.sArch), [ WuiTmLink(oEntry.sTestBoxName, WuiMain.ksScriptName, self._dTestBoxLinkParams, fBracketed = False, sTitle = sTestBoxTitle), WuiTmLink(self.ksShortDetailsLink, WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestBoxDetails, TestBoxData.ksParam_idTestBox: oEntry.idTestBox }, fBracketed = False) ], [ WuiTmLink(oEntry.sTestCaseName, WuiMain.ksScriptName, self._dTestCaseLinkParams, fBracketed = False, sTitle = (oEntry.sBaseCmd + ' ' + oEntry.sArgs) if oEntry.sArgs else oEntry.sBaseCmd), WuiTmLink(self.ksShortDetailsLink, WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestCaseDetails, TestCaseData.ksParam_idTestCase: oEntry.idTestCase }, fBracketed = False), ], oEntry.tsElapsed, aoTestSetLinks ];
def _formatListEntry(self, iEntry): """ Format *show all* table entry """ oEntry = self._aoEntries[iEntry]; from testmanager.webui.wuiadmin import WuiAdmin; from testmanager.webui.wuireport import WuiReportSummaryLink; oValidationKit = None; if oEntry.idBuildTestSuite is not None: oValidationKit = WuiTmLink('r%s' % (oEntry.iRevisionTestSuite,), WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildDetails, BuildData.ksParam_idBuild: oEntry.idBuildTestSuite }, fBracketed = False); aoTestSetLinks = []; aoTestSetLinks.append(WuiTmLink(oEntry.enmStatus, WuiMain.ksScriptName, { WuiMain.ksParamAction: WuiMain.ksActionTestResultDetails, TestSetData.ksParam_idTestSet: oEntry.idTestSet }, fBracketed = False)); if oEntry.cErrors > 0: aoTestSetLinks.append(WuiRawHtml('-')); aoTestSetLinks.append(WuiTmLink('%d error%s' % (oEntry.cErrors, '' if oEntry.cErrors == 1 else 's', ), WuiMain.ksScriptName, { WuiMain.ksParamAction: WuiMain.ksActionTestResultDetails, TestSetData.ksParam_idTestSet: oEntry.idTestSet }, sFragmentId = 'failure-0', fBracketed = False)); self._dTestBoxLinkParams[WuiMain.ksParamGroupMemberId] = oEntry.idTestBox; self._dTestCaseLinkParams[WuiMain.ksParamGroupMemberId] = oEntry.idTestCase; self._dRevLinkParams[WuiMain.ksParamGroupMemberId] = oEntry.iRevision; sTestBoxTitle = u''; if oEntry.sCpuVendor is not None: sTestBoxTitle += 'CPU vendor:\t%s\n' % ( oEntry.sCpuVendor, ); if oEntry.sCpuName is not None: sTestBoxTitle += 'CPU name:\t%s\n' % ( ' '.join(oEntry.sCpuName.split()), ); if oEntry.sOsVersion is not None: sTestBoxTitle += 'OS version:\t%s\n' % ( oEntry.sOsVersion, ); asFeatures = []; if oEntry.fCpuHwVirt is True: asFeatures.append(u'HW\u2011Virt'); if oEntry.fCpuNestedPaging is True: asFeatures.append(u'Nested\u2011Paging'); if oEntry.fCpu64BitGuest is True: asFeatures.append(u'64\u2011bit\u2011Guest'); #if oEntry.fChipsetIoMmu is True: asFeatures.append(u'I/O\u2011MMU'); sTestBoxTitle += u'CPU features:\t' + u', '.join(asFeatures); # Testcase if oEntry.sSubName: sTestCaseName = '%s / %s' % (oEntry.sTestCaseName, oEntry.sSubName,); else: sTestCaseName = oEntry.sTestCaseName; # Reason: aoReasons = []; for oIt in oEntry.aoFailureReasons: sReasonTitle = 'Reason: \t%s\n' % ( oIt.oFailureReason.sShort, ); sReasonTitle += 'Category:\t%s\n' % ( oIt.oFailureReason.oCategory.sShort, ); sReasonTitle += 'Assigned:\t%s\n' % ( self.formatTsShort(oIt.tsFailureReasonAssigned), ); sReasonTitle += 'By User: \t%s\n' % ( oIt.oFailureReasonAssigner.sUsername, ); if oIt.sFailureReasonComment: sReasonTitle += 'Comment: \t%s\n' % ( oIt.sFailureReasonComment, ); if oIt.oFailureReason.iTicket is not None and oIt.oFailureReason.iTicket > 0: sReasonTitle += 'xTracker:\t#%s\n' % ( oIt.oFailureReason.iTicket, ); for i, sUrl in enumerate(oIt.oFailureReason.asUrls): sUrl = sUrl.strip(); if sUrl: sReasonTitle += 'URL#%u: \t%s\n' % ( i, sUrl, ); aoReasons.append(WuiTmLink(oIt.oFailureReason.sShort, WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionFailureReasonDetails, FailureReasonData.ksParam_idFailureReason: oIt.oFailureReason.idFailureReason }, sTitle = sReasonTitle)); return [ oEntry.tsCreated, [ WuiTmLink('%s %s (%s)' % (oEntry.sProduct, oEntry.sVersion, oEntry.sType,), WuiMain.ksScriptName, self._dRevLinkParams, sTitle = '%s' % (oEntry.sBranch,), fBracketed = False), WuiSvnLinkWithTooltip(oEntry.iRevision, 'vbox'), ## @todo add sRepository TestResultListingData WuiTmLink(self.ksShortDetailsLink, WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionBuildDetails, BuildData.ksParam_idBuild: oEntry.idBuild }, fBracketed = False), ], oValidationKit, [ WuiTmLink(oEntry.sTestBoxName, WuiMain.ksScriptName, self._dTestBoxLinkParams, fBracketed = False, sTitle = sTestBoxTitle), WuiTmLink(self.ksShortDetailsLink, WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestBoxDetails, TestBoxData.ksParam_idTestBox: oEntry.idTestBox }, fBracketed = False), WuiReportSummaryLink(ReportModelBase.ksSubTestBox, oEntry.idTestBox, fBracketed = False), ], '%s.%s' % (oEntry.sOs, oEntry.sArch), [ WuiTmLink(sTestCaseName, WuiMain.ksScriptName, self._dTestCaseLinkParams, fBracketed = False, sTitle = (oEntry.sBaseCmd + ' ' + oEntry.sArgs) if oEntry.sArgs else oEntry.sBaseCmd), WuiTmLink(self.ksShortDetailsLink, WuiAdmin.ksScriptName, { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestCaseDetails, TestCaseData.ksParam_idTestCase: oEntry.idTestCase }, fBracketed = False), WuiReportSummaryLink(ReportModelBase.ksSubTestCase, oEntry.idTestCase, fBracketed = False), ], oEntry.tsElapsed, aoTestSetLinks, aoReasons ];