Changeset 56809 in vbox for trunk/src/VBox/ValidationKit
- Timestamp:
- Jul 6, 2015 12:32:55 AM (10 years ago)
- Location:
- trunk/src/VBox/ValidationKit/testmanager
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/testmanager/core/testresults.py
r56764 r56809 513 513 # 514 514 515 ksResultsGroupingTypeNone = 'ResultsGroupingTypeNone' 516 ksResultsGroupingTypeTestGroup = 'ResultsGroupingTypeTestGroup' 517 ksResultsGroupingTypeBuildRev = 'ResultsGroupingTypeBuild' 518 ksResultsGroupingTypeTestBox = 'ResultsGroupingTypeTestBox' 519 ksResultsGroupingTypeTestCase = 'ResultsGroupingTypeTestCase' 520 ksResultsGroupingTypeSchedGroup = 'ResultsGroupingTypeSchedGroup' 515 ksResultsGroupingTypeNone = 'ResultsGroupingTypeNone'; 516 ksResultsGroupingTypeTestGroup = 'ResultsGroupingTypeTestGroup'; 517 ksResultsGroupingTypeBuildRev = 'ResultsGroupingTypeBuild'; 518 ksResultsGroupingTypeTestBox = 'ResultsGroupingTypeTestBox'; 519 ksResultsGroupingTypeTestCase = 'ResultsGroupingTypeTestCase'; 520 ksResultsGroupingTypeSchedGroup = 'ResultsGroupingTypeSchedGroup'; 521 522 #kdResultGroupingMapOld = { 523 # ksResultsGroupingTypeNone: ('TestSets', None, None), 524 # ksResultsGroupingTypeTestGroup: ('TestSets', 'TestSets.idTestGroup', None), 525 # ksResultsGroupingTypeTestBox: ('TestSets', 'TestSets.idTestBox', None), 526 # ksResultsGroupingTypeTestCase: ('TestSets', 'TestSets.idTestCase', None), 527 # ksResultsGroupingTypeBuildRev: ('TestSets, Builds', 'Builds.iRevision', 528 # ' AND Builds.idBuild = TestSets.idBuild' 529 # ' AND Builds.tsExpire > TestSets.tsCreated' 530 # ' AND Builds.tsEffective <= TestSets.tsCreated' ), 531 # ksResultsGroupingTypeSchedGroup: ('TestSets, TestBoxes', 'TestBoxes.idSchedGroup', 532 # ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox'), 533 #}; 534 535 ## @name Result sorting options. 536 ## @{ 537 ksResultsSortByRunningAndStart = 'ResultsSortByRunningAndStart'; ##< Default 538 ksResultsSortByBuildRevision = 'ResultsSortByBuildRevision'; 539 ksResultsSortByTestBoxName = 'ResultsSortByTestBoxName'; 540 ksResultsSortByTestBoxOs = 'ResultsSortByTestBoxOs'; 541 ksResultsSortByTestBoxOsVersion = 'ResultsSortByTestBoxOsVersion'; 542 ksResultsSortByTestBoxOsArch = 'ResultsSortByTestBoxOsArch'; 543 ksResultsSortByTestBoxArch = 'ResultsSortByTestBoxArch'; 544 ksResultsSortByTestBoxCpuVendor = 'ResultsSortByTestBoxCpuVendor'; 545 ksResultsSortByTestBoxCpuName = 'ResultsSortByTestBoxCpuName'; 546 ksResultsSortByTestBoxCpuRev = 'ResultsSortByTestBoxCpuRev'; 547 ksResultsSortByTestBoxCpuFeatures = 'ResultsSortByTestBoxCpuFeatures'; 548 ksResultsSortByTestCaseName = 'ResultsSortByTestCaseName'; 549 kasResultsSortBy = { 550 ksResultsSortByRunningAndStart, 551 ksResultsSortByBuildRevision, 552 ksResultsSortByTestBoxName, 553 ksResultsSortByTestBoxOs, 554 ksResultsSortByTestBoxOsVersion, 555 ksResultsSortByTestBoxOsArch, 556 ksResultsSortByTestBoxArch, 557 ksResultsSortByTestBoxCpuVendor, 558 ksResultsSortByTestBoxCpuName, 559 ksResultsSortByTestBoxCpuRev, 560 ksResultsSortByTestBoxCpuFeatures, 561 ksResultsSortByTestCaseName, 562 }; 563 ## Used by the WUI for generating the drop down. 564 kaasResultsSortByTitles = ( 565 ( ksResultsSortByRunningAndStart, 'Running & Start TS' ), 566 ( ksResultsSortByBuildRevision, 'Build Revision' ), 567 ( ksResultsSortByTestBoxName, 'TestBox Name' ), 568 ( ksResultsSortByTestBoxOs, 'O/S' ), 569 ( ksResultsSortByTestBoxOsVersion, 'O/S Version' ), 570 ( ksResultsSortByTestBoxOsArch, 'O/S & Architecture' ), 571 ( ksResultsSortByTestBoxArch, 'Architecture' ), 572 ( ksResultsSortByTestBoxCpuVendor, 'CPU Vendor' ), 573 ( ksResultsSortByTestBoxCpuName, 'CPU Vendor & Name' ), 574 ( ksResultsSortByTestBoxCpuRev, 'CPU Vendor & Revision' ), 575 ( ksResultsSortByTestBoxCpuFeatures, 'CPU Features' ), 576 ( ksResultsSortByTestCaseName, 'Test Case Name' ), 577 ); 578 ## @} 579 580 ## Default sort by map. 581 kdResultSortByMap= { 582 ksResultsSortByRunningAndStart: ('', None, None, ''), 583 ksResultsSortByBuildRevision: ( 584 # Sorting tables. 585 ', Builds', 586 # Sorting table join(s). 587 ' AND TestSets.idBuild = Builds.idBuild' 588 ' AND Builds.tsExpire >= TestSets.tsCreated' 589 ' AND Builds.tsEffective <= TestSets.tsCreated', 590 # Start of ORDER BY statement. 591 ' Builds.iRevision DESC', 592 # Extra columns to fetch for the above ORDER BY to work in a SELECT DISTINCT statement. 593 '' ), 594 ksResultsSortByTestBoxName: ( 595 ', TestBoxes', 596 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 597 ' TestBoxes.sName DESC', 598 '' ), 599 ksResultsSortByTestBoxOsArch: ( 600 ', TestBoxes', 601 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 602 ' TestBoxes.sOs, TestBoxes.sCpuArch', 603 '' ), 604 ksResultsSortByTestBoxOs: ( 605 ', TestBoxes', 606 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 607 ' TestBoxes.sOs', 608 '' ), 609 ksResultsSortByTestBoxOsVersion: ( 610 ', TestBoxes', 611 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 612 ' TestBoxes.sOs, TestBoxes.sOsVersion DESC', 613 '' ), 614 ksResultsSortByTestBoxArch: ( 615 ', TestBoxes', 616 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 617 ' TestBoxes.sCpuArch', 618 '' ), 619 ksResultsSortByTestBoxCpuVendor: ( 620 ', TestBoxes', 621 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 622 ' TestBoxes.sCpuVendor', 623 '' ), 624 ksResultsSortByTestBoxCpuName: ( 625 ', TestBoxes', 626 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 627 ' TestBoxes.sCpuVendor, TestBoxes.sCpuName', 628 '' ), 629 ksResultsSortByTestBoxCpuRev: ( 630 ', TestBoxes', 631 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 632 ' TestBoxes.sCpuVendor, TestBoxes.lCpuRevision DESC', 633 ', TestBoxes.lCpuRevision' ), 634 ksResultsSortByTestBoxCpuFeatures: ( 635 ', TestBoxes', 636 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 637 ' TestBoxes.fCpuHwVirt DESC, TestBoxes.fCpuNestedPaging DESC, TestBoxes.fCpu64BitGuest DESC, TestBoxes.cCpus DESC', 638 ', TestBoxes.cCpus' ), 639 ksResultsSortByTestCaseName: ( 640 ', TestCases', 641 ' AND TestSets.idGenTestCase = TestCases.idGenTestCase', 642 ' TestCases.sName', 643 '' ), 644 }; 521 645 522 646 kdResultGroupingMap = { 523 ksResultsGroupingTypeNone: ('TestSets', None, None), 524 ksResultsGroupingTypeTestGroup: ('TestSets', 'TestSets.idTestGroup', None), 525 ksResultsGroupingTypeTestBox: ('TestSets', 'TestSets.idTestBox', None), 526 ksResultsGroupingTypeTestCase: ('TestSets', 'TestSets.idTestCase', None), 527 ksResultsGroupingTypeBuildRev: ('TestSets, Builds', 'Builds.iRevision', 528 ' AND Builds.idBuild = TestSets.idBuild' 529 ' AND Builds.tsExpire > TestSets.tsCreated' 530 ' AND Builds.tsEffective <= TestSets.tsCreated' ), 531 ksResultsGroupingTypeSchedGroup: ('TestSets, TestBoxes', 'TestBoxes.idSchedGroup', 532 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox'), 533 } 647 ksResultsGroupingTypeNone: ( 648 # Grouping tables; # Grouping field; # Grouping where addition. # Sort by overrides. 649 'TestSets', None, None, {} 650 ), 651 ksResultsGroupingTypeTestGroup: ('TestSets', 'TestSets.idTestGroup', None, {}), 652 ksResultsGroupingTypeTestBox: ('TestSets', 'TestSets.idTestBox', None, {}), 653 ksResultsGroupingTypeTestCase: ('TestSets', 'TestSets.idTestCase', None, {}), 654 ksResultsGroupingTypeBuildRev: ( 655 'TestSets, Builds', 656 'Builds.iRevision', 657 ' AND Builds.idBuild = TestSets.idBuild' 658 ' AND Builds.tsExpire > TestSets.tsCreated' 659 ' AND Builds.tsEffective <= TestSets.tsCreated', 660 { ksResultsSortByBuildRevision: ( '', None, ' Builds.iRevision DESC' ), } 661 ), 662 ksResultsGroupingTypeSchedGroup: ( 663 'TestSets, TestBoxes', 664 'TestBoxes.idSchedGroup', 665 ' AND TestSets.idGenTestBox = TestBoxes.idGenTestBox', 666 { ksResultsSortByTestBoxName: ( '', None, ' TestBoxes.sName DESC', '' ), 667 ksResultsSortByTestBoxOsArch: ( '', None, ' TestBoxes.sOs, TestBoxes.sCpuArch', '' ), 668 ksResultsSortByTestBoxOs: ( '', None, ' TestBoxes.sOs', '' ), 669 ksResultsSortByTestBoxOsVersion: ( '', None, ' TestBoxes.sOs, TestBoxes.sOsVersion DESC', '' ), 670 ksResultsSortByTestBoxArch: ( '', None, ' TestBoxes.sCpuArch', '' ), 671 ksResultsSortByTestBoxCpuVendor: ( '', None, ' TestBoxes.sCpuVendor', '' ), 672 ksResultsSortByTestBoxCpuName: ( '', None, ' TestBoxes.sCpuVendor, TestBoxes.sCpuName', '' ), 673 ksResultsSortByTestBoxCpuRev: ( 674 '', None, ' TestBoxes.sCpuVendor, TestBoxes.lCpuRevision DESC', ', TestBoxes.lCpuRevision' ), 675 ksResultsSortByTestBoxCpuFeatures: ( 676 ' TestBoxes.fCpuHwVirt DESC, TestBoxes.fCpuNestedPaging DESC, TestBoxes.fCpu64BitGuest DESC, ' 677 + 'TestBoxes.cCpus DESC', 678 ', TestBoxes.cCpus' ), } 679 ), 680 }; 681 534 682 535 683 def _getTimePeriodQueryPart(self, tsNow, sInterval): … … 555 703 return sRet 556 704 557 def fetchResultsForListing(self, iStart, cMaxRows, tsNow, sInterval, enmResult sGroupingType, iResultsGroupingValue,558 fOnlyFailures):705 def fetchResultsForListing(self, iStart, cMaxRows, tsNow, sInterval, enmResultSortBy, 706 enmResultsGroupingType, iResultsGroupingValue, fOnlyFailures): 559 707 """ 560 708 Fetches TestResults table content. … … 574 722 # Get SQL query parameters 575 723 # 576 if enmResultsGroupingType is None: 577 raise TMExceptionBase('Unknown grouping type') 578 if enmResultsGroupingType not in self.kdResultGroupingMap: 579 raise TMExceptionBase('Unknown grouping type') 580 sTables, sGroupingField, sGroupingCondition = self.kdResultGroupingMap[enmResultsGroupingType] 724 if enmResultsGroupingType is None or enmResultsGroupingType not in self.kdResultGroupingMap: 725 raise TMExceptionBase('Unknown grouping type'); 726 if enmResultSortBy is None or enmResultSortBy not in self.kasResultsSortBy: 727 raise TMExceptionBase('Unknown sorting'); 728 sGroupingTables, sGroupingField, sGroupingCondition, dSortingOverrides = self.kdResultGroupingMap[enmResultsGroupingType]; 729 if enmResultSortBy in dSortingOverrides: 730 sSortingTables, sSortingWhere, sSortingOrderBy, sSortingColumns = dSortingOverrides[enmResultSortBy]; 731 else: 732 sSortingTables, sSortingWhere, sSortingOrderBy, sSortingColumns = self.kdResultSortByMap[enmResultSortBy]; 581 733 582 734 # … … 613 765 ' TestSuiteBits.idBuild AS idBuildTestSuite,\n' \ 614 766 ' TestSuiteBits.iRevision AS iRevisionTestSuite,\n' \ 615 ' (TestSets.tsDone IS NULL) SortRunningFirst \n' \767 ' (TestSets.tsDone IS NULL) SortRunningFirst' + sSortingColumns + '\n' \ 616 768 'FROM BuildCategories,\n' \ 617 769 ' Builds,\n' \ … … 629 781 ' TestSets.idGenTestCase AS idGenTestCase,\n' \ 630 782 ' TestSets.idGenTestCaseArgs AS idGenTestCaseArgs\n' \ 631 ' FROM ' + s Tables + '\n' \783 ' FROM ' + sGroupingTables + sSortingTables + '\n' \ 632 784 ' WHERE ' + self._getTimePeriodQueryPart(tsNow, sInterval); 633 785 if fOnlyFailures: … … 638 790 if sGroupingCondition is not None: 639 791 sQuery += sGroupingCondition.replace(' AND ', ' AND '); 640 sQuery += ' ORDER BY (TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n' \ 792 if sSortingWhere is not None: 793 sQuery += sSortingWhere.replace(' AND ', ' AND '); 794 sQuery += ' ORDER BY '; 795 if sSortingOrderBy is not None: 796 sQuery += sSortingOrderBy + ',\n '; 797 sQuery += '(TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n' \ 641 798 ' LIMIT %s OFFSET %s\n' % (cMaxRows, iStart,); 642 799 … … 653 810 ' AND TestSets.idGenTestCase = TestCases.idGenTestCase\n' \ 654 811 ' AND TestSets.idGenTestCaseArgs = TestCaseArgs.idGenTestCaseArgs\n' \ 655 'ORDER BY (TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n' 812 'ORDER BY '; 813 if sSortingOrderBy is not None: 814 sQuery += sSortingOrderBy + ',\n '; 815 sQuery += '(TestSets.tsDone IS NULL) DESC, TestSets.idTestSet DESC\n'; 656 816 657 817 # … … 686 846 if enmResultsGroupingType not in self.kdResultGroupingMap: 687 847 raise TMExceptionBase('Unknown grouping type') 688 s Tables, sGroupingField, sGroupingCondition = self.kdResultGroupingMap[enmResultsGroupingType]848 sGroupingTables, sGroupingField, sGroupingCondition, _ = self.kdResultGroupingMap[enmResultsGroupingType]; 689 849 690 850 # … … 692 852 # 693 853 sQuery = 'SELECT COUNT(idTestSet)\n' \ 694 'FROM ' + s Tables + '\n' \854 'FROM ' + sGroupingTables + '\n' \ 695 855 'WHERE ' + self._getTimePeriodQueryPart(tsNow, sInterval); 696 856 if fOnlyFailures: -
trunk/src/VBox/ValidationKit/testmanager/webui/wuimain.py
r56806 r56809 142 142 ## @} 143 143 144 ## @name Test result listing parameters. 145 ## @{ 146 ## If this param is specified, then show only results for this member when results grouped by some parameter. 147 ksParamGroupMemberId = 'GroupMemberId' 148 ## Optional parameter for indicating whether to restrict the listing to failures only. 149 ksParamOnlyFailures = 'OnlyFailures' 150 ## Result listing sorting. 151 ksParamTestResultsSortBy = 'enmSortBy' 152 ## @} 153 144 154 ## Effective time period. one of the first column values in kaoResultPeriods. 145 155 ksParamEffectivePeriod = 'sEffectivePeriod' 146 147 ## If this param is specified, then show only results for this member when results grouped by some parameter.148 ksParamGroupMemberId = 'GroupMemberId'149 150 ## Optional parameter for indicating whether to restrict the listing to failures only.151 ksParamOnlyFailures = 'OnlyFailures'152 156 153 157 ## Test result period values. … … 296 300 # 297 301 302 def _generateSortBySelector(self, dParams, sPreamble, sPostamble): 303 """ 304 Generate HTML code for the sort by selector. 305 """ 306 if self.ksParamTestResultsSortBy in dParams: 307 enmResultSortBy = dParams[self.ksParamTestResultsSortBy]; 308 del dParams[self.ksParamTestResultsSortBy]; 309 else: 310 enmResultSortBy = TestResultLogic.ksResultsSortByRunningAndStart; 311 312 sHtmlSortBy = '<form name="TimeForm" method="GET"> Sort by\n'; 313 sHtmlSortBy += sPreamble; 314 sHtmlSortBy += '\n <select name="%s" onchange="window.location=' % (self.ksParamTestResultsSortBy,); 315 sHtmlSortBy += '\'?%s&%s=\' + ' % (webutils.encodeUrlParams(dParams), self.ksParamTestResultsSortBy) 316 sHtmlSortBy += 'this.options[this.selectedIndex].value;" title="Sorting by">\n' 317 318 fSelected = False; 319 for enmCode, sTitle in TestResultLogic.kaasResultsSortByTitles: 320 if enmCode == enmResultSortBy: 321 fSelected = True; 322 sHtmlSortBy += ' <option value="%s"%s>%s</option>\n' \ 323 % (enmCode, ' selected="selected"' if enmCode == enmResultSortBy else '', sTitle,); 324 assert fSelected; 325 sHtmlSortBy += ' </select>\n'; 326 sHtmlSortBy += sPostamble; 327 sHtmlSortBy += '\n</form>\n' 328 return sHtmlSortBy; 329 298 330 def _generateStatusSelector(self, dParams, fOnlyFailures): 299 331 """ … … 318 350 if WuiDispatcherBase.ksParamPageNo in dParams: 319 351 del dParams[WuiDispatcherBase.ksParamPageNo] 320 321 352 322 353 sHtmlTimeSelector = '<form name="TimeForm" method="GET">\n' … … 546 577 # Generate the elements. 547 578 sHtmlStatusSelector = self._generateStatusSelector(self.getParameters(), fOnlyFailures); 579 sHtmlSortBySelector = self._generateSortBySelector(self.getParameters(), '', sHtmlStatusSelector); 548 580 sHtmlPeriodSelector = self._generateResultPeriodSelector(self.getParameters(), sCurPeriod) 549 581 sHtmlTimeWalker = self._generateTimeWalker(self.getParameters(), tsEffective, sCurPeriod); … … 564 596 '</tr>\n' \ 565 597 '<tr>\n' \ 566 ' <td width=30%>' + sHtmlS tatusSelector + '</td>\n' \598 ' <td width=30%>' + sHtmlSortBySelector + '</td>\n' \ 567 599 ' <td width=40% align=center>\n' + sHtmlPager + '</td>\n' \ 568 600 ' <td width=30% align=right>\n' + sHtmlItemsPerPageSelector + '</td>\n'\ … … 638 670 oListContentType is a child of WuiListContentBase. 639 671 """ 640 cItemsPerPage = self.getIntParam(self.ksParamItemsPerPage, iMin = 2, iMax = 9999, iDefault = 128) 641 iPage = self.getIntParam(self.ksParamPageNo, iMin = 0, iMax = 999999, iDefault = 0) 642 tsEffective = self.getEffectiveDateParam() 643 iGroupMemberId = self.getIntParam(self.ksParamGroupMemberId, iMin = -1, iMax = 999999, iDefault = -1) 672 cItemsPerPage = self.getIntParam(self.ksParamItemsPerPage, iMin = 2, iMax = 9999, iDefault = 128); 673 iPage = self.getIntParam(self.ksParamPageNo, iMin = 0, iMax = 999999, iDefault = 0); 674 tsEffective = self.getEffectiveDateParam(); 675 iGroupMemberId = self.getIntParam(self.ksParamGroupMemberId, iMin = -1, iMax = 999999, iDefault = -1); 644 676 fOnlyFailures = self.getBoolParam(self.ksParamOnlyFailures, fDefault = False); 677 enmResultSortBy = self.getStringParam(self.ksParamTestResultsSortBy, 678 asValidValues = TestResultLogic.kasResultsSortBy, 679 sDefault = TestResultLogic.ksResultsSortByRunningAndStart); 645 680 646 681 # Get testing results period and validate it 647 asValidValues = [x for (x, _, _) in self.kaoResultPeriods]682 asValidValues = [x for (x, _, _) in self.kaoResultPeriods] 648 683 sCurPeriod = self.getStringParam(self.ksParamEffectivePeriod, asValidValues = asValidValues, 649 684 sDefault = self.ksResultPeriodDefault) … … 727 762 tsNow = tsEffective, 728 763 sInterval = sCurPeriod, 764 enmResultSortBy = enmResultSortBy, 729 765 enmResultsGroupingType = enmResultsGroupingType, 730 766 iResultsGroupingValue = idMember, 731 fOnlyFailures = fOnlyFailures) 732 767 fOnlyFailures = fOnlyFailures); 733 768 cEntriesMax = max(cEntriesMax, cEntries) 734 769
Note:
See TracChangeset
for help on using the changeset viewer.