VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py@ 77922

Last change on this file since 77922 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.9 KB
Line 
1# -*- coding: utf-8 -*-
2# $Id: wuiadmintestcase.py 76553 2019-01-01 01:45:53Z vboxsync $
3
4"""
5Test Manager WUI - Test Cases.
6"""
7
8__copyright__ = \
9"""
10Copyright (C) 2012-2019 Oracle Corporation
11
12This file is part of VirtualBox Open Source Edition (OSE), as
13available from http://www.virtualbox.org. This file is free software;
14you can redistribute it and/or modify it under the terms of the GNU
15General Public License (GPL) as published by the Free Software
16Foundation, in version 2 as it comes in the "COPYING" file of the
17VirtualBox OSE distribution. VirtualBox OSE is distributed in the
18hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19
20The contents of this file may alternatively be used under the terms
21of the Common Development and Distribution License Version 1.0
22(CDDL) only, as it comes in the "COPYING.CDDL" file of the
23VirtualBox OSE distribution, in which case the provisions of the
24CDDL are applicable instead of those of the GPL.
25
26You may elect to license modified versions of this file under the
27terms and conditions of either the GPL or the CDDL or both.
28"""
29__version__ = "$Revision: 76553 $"
30
31
32# Validation Kit imports.
33from common import utils, webutils;
34from testmanager.webui.wuicontentbase import WuiFormContentBase, WuiListContentBase, WuiContentBase, WuiTmLink, WuiRawHtml;
35from testmanager.core.db import isDbTimestampInfinity;
36from testmanager.core.testcase import TestCaseDataEx, TestCaseData, TestCaseDependencyLogic;
37from testmanager.core.globalresource import GlobalResourceData, GlobalResourceLogic;
38
39
40
41class WuiTestCaseDetailsLink(WuiTmLink):
42 """ Test case details link by ID. """
43
44 def __init__(self, idTestCase, sName = WuiContentBase.ksShortDetailsLink, fBracketed = False, tsNow = None):
45 from testmanager.webui.wuiadmin import WuiAdmin;
46 dParams = {
47 WuiAdmin.ksParamAction: WuiAdmin.ksActionTestCaseDetails,
48 TestCaseData.ksParam_idTestCase: idTestCase,
49 };
50 if tsNow is not None:
51 dParams[WuiAdmin.ksParamEffectiveDate] = tsNow; ## ??
52 WuiTmLink.__init__(self, sName, WuiAdmin.ksScriptName, dParams, fBracketed = fBracketed);
53 self.idTestCase = idTestCase;
54
55
56class WuiTestCaseList(WuiListContentBase):
57 """
58 WUI test case list content generator.
59 """
60
61 def __init__(self, aoEntries, iPage, cItemsPerPage, tsEffective, fnDPrint, oDisp, aiSelectedSortColumns = None):
62 WuiListContentBase.__init__(self, aoEntries, iPage, cItemsPerPage, tsEffective, sTitle = 'Test Cases',
63 fnDPrint = fnDPrint, oDisp = oDisp, aiSelectedSortColumns = aiSelectedSortColumns);
64 self._asColumnHeaders = \
65 [
66 'Name', 'Active', 'Timeout', 'Base Command / Variations', 'Validation Kit Files',
67 'Test Case Prereqs', 'Global Rsrces', 'Note', 'Actions'
68 ];
69 self._asColumnAttribs = \
70 [
71 '', '', 'align="center"', '', '',
72 'valign="top"', 'valign="top"', 'align="center"', 'align="center"'
73 ];
74
75 def _formatListEntry(self, iEntry):
76 oEntry = self._aoEntries[iEntry];
77 from testmanager.webui.wuiadmin import WuiAdmin;
78
79 aoRet = \
80 [
81 oEntry.sName.replace('-', u'\u2011'),
82 'Enabled' if oEntry.fEnabled else 'Disabled',
83 utils.formatIntervalSeconds(oEntry.cSecTimeout),
84 ];
85
86 # Base command and variations.
87 fNoGang = True;
88 fNoSubName = True;
89 fAllDefaultTimeouts = True;
90 for oVar in oEntry.aoTestCaseArgs:
91 if fNoSubName and oVar.sSubName is not None and oVar.sSubName.strip():
92 fNoSubName = False;
93 if oVar.cGangMembers > 1:
94 fNoGang = False;
95 if oVar.cSecTimeout is not None:
96 fAllDefaultTimeouts = False;
97
98 sHtml = ' <table class="tminnertbl" width=100%>\n' \
99 ' <tr>\n' \
100 ' ';
101 if not fNoSubName:
102 sHtml += '<th class="tmtcasubname">Sub-name</th>';
103 if not fNoGang:
104 sHtml += '<th class="tmtcagangsize">Gang Size</th>';
105 if not fAllDefaultTimeouts:
106 sHtml += '<th class="tmtcatimeout">Timeout</th>';
107 sHtml += '<th>Additional Arguments</b></th>\n' \
108 ' </tr>\n'
109 for oTmp in oEntry.aoTestCaseArgs:
110 sHtml += '<tr>';
111 if not fNoSubName:
112 sHtml += '<td>%s</td>' % (webutils.escapeElem(oTmp.sSubName) if oTmp.sSubName is not None else '');
113 if not fNoGang:
114 sHtml += '<td>%d</td>' % (oTmp.cGangMembers,)
115 if not fAllDefaultTimeouts:
116 sHtml += '<td>%s</td>' \
117 % (utils.formatIntervalSeconds(oTmp.cSecTimeout) if oTmp.cSecTimeout is not None else 'Default',)
118 sHtml += u'<td>%s</td></tr>' \
119 % ( webutils.escapeElem(oTmp.sArgs.replace('-', u'\u2011')) if oTmp.sArgs else u'\u2011',);
120 sHtml += '</tr>\n';
121 sHtml += ' </table>'
122
123 aoRet.append([oEntry.sBaseCmd.replace('-', u'\u2011'), WuiRawHtml(sHtml)]);
124
125 # Next.
126 aoRet += [ oEntry.sValidationKitZips if oEntry.sValidationKitZips is not None else '', ];
127
128 # Show dependency on other testcases
129 if oEntry.aoDepTestCases not in (None, []):
130 sHtml = ' <ul class="tmshowall">\n'
131 for sTmp in oEntry.aoDepTestCases:
132 sHtml += ' <li class="tmshowall"><a href="%s?%s=%s&%s=%s">%s</a></li>\n' \
133 % (WuiAdmin.ksScriptName,
134 WuiAdmin.ksParamAction, WuiAdmin.ksActionTestCaseEdit,
135 TestCaseData.ksParam_idTestCase, sTmp.idTestCase,
136 sTmp.sName)
137 sHtml += ' </ul>\n'
138 else:
139 sHtml = '<ul class="tmshowall"><li class="tmshowall">None</li></ul>\n'
140 aoRet.append(WuiRawHtml(sHtml));
141
142 # Show dependency on global resources
143 if oEntry.aoDepGlobalResources not in (None, []):
144 sHtml = ' <ul class="tmshowall">\n'
145 for sTmp in oEntry.aoDepGlobalResources:
146 sHtml += ' <li class="tmshowall"><a href="%s?%s=%s&%s=%s">%s</a></li>\n' \
147 % (WuiAdmin.ksScriptName,
148 WuiAdmin.ksParamAction, WuiAdmin.ksActionGlobalRsrcShowEdit,
149 GlobalResourceData.ksParam_idGlobalRsrc, sTmp.idGlobalRsrc,
150 sTmp.sName)
151 sHtml += ' </ul>\n'
152 else:
153 sHtml = '<ul class="tmshowall"><li class="tmshowall">None</li></ul>\n'
154 aoRet.append(WuiRawHtml(sHtml));
155
156 # Comment (note).
157 aoRet.append(self._formatCommentCell(oEntry.sComment));
158
159 # Show actions that can be taken.
160 aoActions = [ WuiTmLink('Details', WuiAdmin.ksScriptName,
161 { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestCaseDetails,
162 TestCaseData.ksParam_idGenTestCase: oEntry.idGenTestCase }), ];
163 if self._oDisp is None or not self._oDisp.isReadOnlyUser():
164 if isDbTimestampInfinity(oEntry.tsExpire):
165 aoActions.append(WuiTmLink('Modify', WuiAdmin.ksScriptName,
166 { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestCaseEdit,
167 TestCaseData.ksParam_idTestCase: oEntry.idTestCase }));
168 aoActions.append(WuiTmLink('Clone', WuiAdmin.ksScriptName,
169 { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestCaseClone,
170 TestCaseData.ksParam_idGenTestCase: oEntry.idGenTestCase }));
171 if isDbTimestampInfinity(oEntry.tsExpire):
172 aoActions.append(WuiTmLink('Remove', WuiAdmin.ksScriptName,
173 { WuiAdmin.ksParamAction: WuiAdmin.ksActionTestCaseDoRemove,
174 TestCaseData.ksParam_idTestCase: oEntry.idTestCase },
175 sConfirm = 'Are you sure you want to remove test case #%d?' % (oEntry.idTestCase,)));
176 aoRet.append(aoActions);
177
178 return aoRet;
179
180
181class WuiTestCase(WuiFormContentBase):
182 """
183 WUI user account content generator.
184 """
185
186 def __init__(self, oData, sMode, oDisp):
187 assert isinstance(oData, TestCaseDataEx);
188
189 if sMode == WuiFormContentBase.ksMode_Add:
190 sTitle = 'New Test Case';
191 elif sMode == WuiFormContentBase.ksMode_Edit:
192 sTitle = 'Edit Test Case - %s (#%s)' % (oData.sName, oData.idTestCase);
193 else:
194 assert sMode == WuiFormContentBase.ksMode_Show;
195 sTitle = 'Test Case - %s (#%s)' % (oData.sName, oData.idTestCase);
196 WuiFormContentBase.__init__(self, oData, sMode, 'TestCase', oDisp, sTitle);
197
198 # Read additional bits form the DB.
199 oDepLogic = TestCaseDependencyLogic(oDisp.getDb());
200 self._aoAllTestCases = oDepLogic.getApplicableDepTestCaseData(-1 if oData.idTestCase is None else oData.idTestCase);
201 self._aoAllGlobalRsrcs = GlobalResourceLogic(oDisp.getDb()).getAll();
202
203 def _populateForm(self, oForm, oData):
204 oForm.addIntRO (TestCaseData.ksParam_idTestCase, oData.idTestCase, 'Test Case ID')
205 oForm.addTimestampRO(TestCaseData.ksParam_tsEffective, oData.tsEffective, 'Last changed')
206 oForm.addTimestampRO(TestCaseData.ksParam_tsExpire, oData.tsExpire, 'Expires (excl)')
207 oForm.addIntRO (TestCaseData.ksParam_uidAuthor, oData.uidAuthor, 'Changed by UID')
208 oForm.addIntRO (TestCaseData.ksParam_idGenTestCase, oData.idGenTestCase, 'Test Case generation ID')
209 oForm.addText (TestCaseData.ksParam_sName, oData.sName, 'Name')
210 oForm.addText (TestCaseData.ksParam_sDescription, oData.sDescription, 'Description')
211 oForm.addCheckBox (TestCaseData.ksParam_fEnabled, oData.fEnabled, 'Enabled')
212 oForm.addLong (TestCaseData.ksParam_cSecTimeout,
213 utils.formatIntervalSeconds2(oData.cSecTimeout), 'Default timeout')
214 oForm.addWideText (TestCaseData.ksParam_sTestBoxReqExpr, oData.sTestBoxReqExpr, 'TestBox requirements (python)');
215 oForm.addWideText (TestCaseData.ksParam_sBuildReqExpr, oData.sBuildReqExpr, 'Build requirement (python)');
216 oForm.addWideText (TestCaseData.ksParam_sBaseCmd, oData.sBaseCmd, 'Base command')
217 oForm.addText (TestCaseData.ksParam_sValidationKitZips, oData.sValidationKitZips, 'Test suite files')
218
219 oForm.addListOfTestCaseArgs(TestCaseDataEx.ksParam_aoTestCaseArgs, oData.aoTestCaseArgs, 'Argument variations')
220
221 aoTestCaseDeps = [];
222 for oTestCase in self._aoAllTestCases:
223 if oTestCase.idTestCase == oData.idTestCase:
224 continue;
225 fSelected = False;
226 for oDep in oData.aoDepTestCases:
227 if oDep.idTestCase == oTestCase.idTestCase:
228 fSelected = True;
229 break;
230 aoTestCaseDeps.append([oTestCase.idTestCase, fSelected, oTestCase.sName]);
231 oForm.addListOfTestCases(TestCaseDataEx.ksParam_aoDepTestCases, aoTestCaseDeps, 'Depends on test cases')
232
233 aoGlobalResrcDeps = [];
234 for oGlobalRsrc in self._aoAllGlobalRsrcs:
235 fSelected = False;
236 for oDep in oData.aoDepGlobalResources:
237 if oDep.idGlobalRsrc == oGlobalRsrc.idGlobalRsrc:
238 fSelected = True;
239 break;
240 aoGlobalResrcDeps.append([oGlobalRsrc.idGlobalRsrc, fSelected, oGlobalRsrc.sName]);
241 oForm.addListOfResources(TestCaseDataEx.ksParam_aoDepGlobalResources, aoGlobalResrcDeps, 'Depends on resources')
242
243 oForm.addMultilineText(TestCaseDataEx.ksParam_sComment, oData.sComment, 'Comment');
244
245 oForm.addSubmit();
246
247 return True;
248
Note: See TracBrowser for help on using the repository browser.

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