VirtualBox

Changeset 82939 in vbox


Ignore:
Timestamp:
Jan 31, 2020 11:13:38 AM (5 years ago)
Author:
vboxsync
Message:

TestManager: Added revision range filtering.

Location:
trunk/src/VBox/ValidationKit/testmanager
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/testmanager/core/base.py

    r82641 r82939  
    11911191    ksType_UIntNil = 'uint-nil'; ##< unsigned integer value, with nil.
    11921192    ksType_String  = 'string';   ##< string value.
     1193    ksType_Ranges  = 'ranges';   ##< List of (unsigned) integer ranges.
    11931194    ## @}
    11941195
     
    12431244        self.aCriteria = [] # type: list[FilterCriterion]
    12441245
    1245     def _initFromParamsWorker(self, oDisp, oCriterion):
     1246    def _initFromParamsWorker(self, oDisp, oCriterion): # (,FilterCriterion)
    12461247        """ Worker for initFromParams. """
    12471248        if oCriterion.sType == FilterCriterion.ksType_UInt:
     
    12591260                  or sValue[-1] == '\\':
    12601261                    raise TMExceptionBase('Variable %s has an illegal value "%s"!' % (oCriterion.sVarNm, sValue));
     1262        elif oCriterion.sType == FilterCriterion.ksType_Ranges:
     1263            def convertRangeNumber(sValue):
     1264                """ Helper """
     1265                sValue = sValue.strip();
     1266                if sValue and sValue not in ('inf', 'Inf', 'INf', 'INF', 'InF', 'iNf', 'iNF', 'inF',):
     1267                    try:    return int(sValue);
     1268                    except: pass;
     1269                return None;
     1270
     1271            for sRange in oDisp.getStringParam(oCriterion.sVarNm, sDefault = '').split(','):
     1272                sRange = sRange.strip();
     1273                if sRange and sRange != '-' and any(ch.isdigit() for ch in sRange):
     1274                    asValues = sRange.split('-');
     1275                    if len(asValues) == 1:
     1276                        asValues = [asValues[0], asValues[0]];
     1277                    elif len(asValues) > 2:
     1278                        asValues = [asValues[0], asValues[-1]];
     1279                    tTuple = (convertRangeNumber(asValues[0]), convertRangeNumber(asValues[1]));
     1280                    if tTuple[0] is not None and tTuple[1] is not None and tTuple[0] > tTuple[1]:
     1281                        tTuple = (tTuple[1], tTuple[0]);
     1282                    oCriterion.aoSelected.append(tTuple);
    12611283        else:
    12621284            assert False;
  • trunk/src/VBox/ValidationKit/testmanager/core/testresults.py

    r80128 r82939  
    703703    kiBuildTypes            =  3;
    704704    kiRevisions             =  4;
    705     kiFailReasons           =  5;
    706     kiTestCases             =  6;
    707     kiTestCaseMisc          =  7;
    708     kiTestBoxes             =  8
    709     kiOses                  =  9;
    710     kiCpuArches             = 10;
    711     kiCpuVendors            = 11;
    712     kiCpuCounts             = 12;
    713     kiMemory                = 13;
    714     kiTestboxMisc           = 14;
    715     kiPythonVersions        = 15;
    716     kiSchedGroups           = 16;
     705    kiRevisionRange         =  5;
     706    kiFailReasons           =  6;
     707    kiTestCases             =  7;
     708    kiTestCaseMisc          =  8;
     709    kiTestBoxes             =  9;
     710    kiOses                  = 10;
     711    kiCpuArches             = 11;
     712    kiCpuVendors            = 12;
     713    kiCpuCounts             = 13;
     714    kiMemory                = 14;
     715    kiTestboxMisc           = 15;
     716    kiPythonVersions        = 16;
     717    kiSchedGroups           = 17;
    717718
    718719    ## Misc test case / variation name filters.
     
    783784        assert self.aCriteria[self.kiRevisions] is oCrit;
    784785
     786        # Revision Range
     787        oCrit = FilterCriterion('Revision Range', sVarNm = 'rr', sType = FilterCriterion.ksType_Ranges,
     788                                sKind = FilterCriterion.ksKind_ElementOfOrNot, sTable = 'Builds', sColumn = 'iRevision');
     789        self.aCriteria.append(oCrit);
     790        assert self.aCriteria[self.kiRevisionRange] is oCrit;
     791
    785792        # Failure reasons
    786793        oCrit = FilterCriterion('Failure reasons', sVarNm = 'fr', sType = FilterCriterion.ksType_UIntNil,
     
    907914                    if iValue in dConditions:
    908915                        sQuery += '%s   AND %s\n' % (sExtraIndent, dConditions[iValue],);
     916            elif oCrit.sType == FilterCriterion.ksType_Ranges:
     917                assert len(oCrit.aoPossible) == 0;
     918                if oCrit.aoSelected:
     919                    asConditions = [];
     920                    for tRange in oCrit.aoSelected:
     921                        if tRange[0] == tRange[1]:
     922                            asConditions.append('%s.%s = %s' % (oCrit.asTables[0], oCrit.sColumn, tRange[0]));
     923                        elif tRange[1] is None: # 9999-
     924                            asConditions.append('%s.%s >= %s' % (oCrit.asTables[0], oCrit.sColumn, tRange[0]));
     925                        elif tRange[0] is None: # -9999
     926                            asConditions.append('%s.%s <= %s' % (oCrit.asTables[0], oCrit.sColumn, tRange[1]));
     927                        else:
     928                            asConditions.append('%s.%s BETWEEN %s AND %s' % (oCrit.asTables[0], oCrit.sColumn,
     929                                                                             tRange[0], tRange[1]));
     930                    if not oCrit.fInverted:
     931                        sQuery += '%s   AND (%s)\n' % (sExtraIndent, ' OR '.join(asConditions));
     932                    else:
     933                        sQuery += '%s   AND NOT (%s)\n' % (sExtraIndent, ' OR '.join(asConditions));
    909934            else:
    910935                assert len(oCrit.asTables) == 1;
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuimain.py

    r82638 r82939  
    932932        sHtml += u' <dl>\n';
    933933        for oCrit in oFilter.aCriteria:
    934             if oCrit.aoPossible:
     934            if oCrit.aoPossible or oCrit.sType == oCrit.ksType_Ranges:
    935935                if   (    oCrit.oSub is None \
    936936                      and (   oCrit.sState == oCrit.ksState_Selected \
    937                            or len(oCrit.aoPossible) <= 2)) \
     937                           or (len(oCrit.aoPossible) <= 2 and oCrit.sType != oCrit.ksType_Ranges))) \
    938938                  or (    oCrit.oSub is not None \
    939939                      and (   oCrit.sState == oCrit.ksState_Selected \
     
    962962                         % (sClass);
    963963
    964                 for oDesc in oCrit.aoPossible:
    965                     fChecked = oDesc.oValue in oCrit.aoSelected;
    966                     sHtml += u'    <li%s%s><label><input type="checkbox" name="%s" value="%s"%s%s/>%s%s</label>\n' \
    967                            % ( ' class="side-filter-irrelevant"' if oDesc.fIrrelevant else '',
    968                                (' title="%s"' % (webutils.escapeAttr(oDesc.sHover,)) if oDesc.sHover is not None else ''),
    969                                oCrit.sVarNm,
    970                                oDesc.oValue,
    971                                ' checked' if fChecked else '',
    972                                ' onclick="toggleCollapsibleCheckbox(this);"' if oDesc.aoSubs is not None else '',
    973                                webutils.escapeElem(oDesc.sDesc),
    974                                '<span class="side-filter-count"> [%u]</span>' % (oDesc.cTimes) if oDesc.cTimes is not None
    975                                else '', );
    976                     if oDesc.aoSubs is not None:
    977                         sHtml += u'     <ul class="sf-checkbox-%s">\n' % ('collapsible' if fChecked else 'expandable', );
    978                         for oSubDesc in oDesc.aoSubs:
    979                             fSubChecked = oSubDesc.oValue in oCrit.oSub.aoSelected;
    980                             sHtml += u'     <li%s%s><label><input type="checkbox" name="%s" value="%s"%s/>%s%s</label>\n' \
    981                                    % ( ' class="side-filter-irrelevant"' if oSubDesc.fIrrelevant else '',
    982                                        ' title="%s"' % ( webutils.escapeAttr(oSubDesc.sHover,) if oSubDesc.sHover is not None
    983                                                          else ''),
    984                                        oCrit.oSub.sVarNm, oSubDesc.oValue, ' checked' if fSubChecked else '',
    985                                        webutils.escapeElem(oSubDesc.sDesc),
    986                                        '<span class="side-filter-count"> [%u]</span>' % (oSubDesc.cTimes)
    987                                        if oSubDesc.cTimes is not None else '', );
    988 
    989                         sHtml += u'     </ul>\n';
    990                     sHtml += u'    </li>';
     964                if oCrit.sType == oCrit.ksType_Ranges:
     965                    assert not oCrit.oSub;
     966                    assert not oCrit.aoPossible;
     967                    asValues = [];
     968                    for tRange in oCrit.aoSelected:
     969                        if tRange[0] == tRange[1]:
     970                            asValues.append('%s' % (tRange[0],));
     971                        else:
     972                            asValues.append('%s-%s' % (tRange[0] if tRange[0] is not None else 'inf',
     973                                                       tRange[1] if tRange[1] is not None else 'inf'));
     974                    sHtml += u'    <li title="%s"><input type="text" name="%s" value="%s"/></li>\n' \
     975                           % ( webutils.escapeAttr('comma separate list of numerical ranges'), oCrit.sVarNm,
     976                               ', '.join(asValues), );
     977                else:
     978                    for oDesc in oCrit.aoPossible:
     979                        fChecked = oDesc.oValue in oCrit.aoSelected;
     980                        sHtml += u'    <li%s%s><label><input type="checkbox" name="%s" value="%s"%s%s/>%s%s</label>\n' \
     981                               % ( ' class="side-filter-irrelevant"' if oDesc.fIrrelevant else '',
     982                                   (' title="%s"' % (webutils.escapeAttr(oDesc.sHover,)) if oDesc.sHover is not None else ''),
     983                                   oCrit.sVarNm,
     984                                   oDesc.oValue,
     985                                   ' checked' if fChecked else '',
     986                                   ' onclick="toggleCollapsibleCheckbox(this);"' if oDesc.aoSubs is not None else '',
     987                                   webutils.escapeElem(oDesc.sDesc),
     988                                   '<span class="side-filter-count"> [%u]</span>' % (oDesc.cTimes) if oDesc.cTimes is not None
     989                                   else '', );
     990                        if oDesc.aoSubs is not None:
     991                            sHtml += u'     <ul class="sf-checkbox-%s">\n' % ('collapsible' if fChecked else 'expandable', );
     992                            for oSubDesc in oDesc.aoSubs:
     993                                fSubChecked = oSubDesc.oValue in oCrit.oSub.aoSelected;
     994                                sHtml += u'     <li%s%s><label><input type="checkbox" name="%s" value="%s"%s/>%s%s</label>\n' \
     995                                       % ( ' class="side-filter-irrelevant"' if oSubDesc.fIrrelevant else '',
     996                                           ' title="%s"' % ( webutils.escapeAttr(oSubDesc.sHover,) if oSubDesc.sHover is not None
     997                                                             else ''),
     998                                           oCrit.oSub.sVarNm, oSubDesc.oValue, ' checked' if fSubChecked else '',
     999                                           webutils.escapeElem(oSubDesc.sDesc),
     1000                                           '<span class="side-filter-count"> [%u]</span>' % (oSubDesc.cTimes)
     1001                                           if oSubDesc.cTimes is not None else '', );
     1002
     1003                            sHtml += u'     </ul>\n';
     1004                        sHtml += u'    </li>';
     1005
    9911006                sHtml += u'   </ul>\n' \
    9921007                         u'  </dd>\n';
Note: See TracChangeset for help on using the changeset viewer.

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