VirtualBox

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

Last change on this file since 98523 was 98103, checked in by vboxsync, 22 months ago

Copyright year updates by scm.

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