VirtualBox

Changeset 92283 in vbox for trunk/src/VBox/ValidationKit


Ignore:
Timestamp:
Nov 9, 2021 10:05:23 AM (3 years ago)
Author:
vboxsync
Message:

ValKit/reporter.py: Tried to fix the XML parsing in FileWrapperTestPipe and extending it to close open <Test> elements on close.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/testdriver/reporter.py

    r90616 r92283  
    12491249
    12501250class FileWrapperTestPipe(object):
    1251     """ File like class for the test pipe (TXS EXEC and similar). """
     1251    """
     1252    File like class for the test pipe (TXS EXEC and similar).
     1253
     1254    This is also used to submit XML test result files.
     1255    """
    12521256    def __init__(self):
    12531257        self.sPrefix    = '';
     
    12551259        self.fClosed    = False;
    12561260        self.sTagBuffer = None;
     1261        self.cTestDepth = 0;
     1262        self.acTestErrors = [];
    12571263
    12581264    def __del__(self):
     
    12631269        if self.fStarted is True and self.fClosed is False:
    12641270            self.fClosed = True;
     1271
     1272            # Close open <Test> elements:
     1273            if self.cTestDepth > 0:
     1274                sNow = utils.getIsoTimestamp()
     1275                cErrors = 0;
     1276                while self.cTestDepth > 0:
     1277                    self.cTestDepth -= 1;
     1278                    if self.acTestErrors:
     1279                        cErrors += self.acTestErrors.pop();
     1280                    cErrors += 1;
     1281                    g_oReporter.subXmlWrite(self, '  <Failed timestamp="%s"/ errors="%s">\n</Test>\n' % (sNow, cErrors),
     1282                                            utils.getCallerName());
     1283
     1284            # Tell the reporter that the XML input is done.
    12651285            try:    g_oReporter.subXmlEnd(self);
    12661286            except:
     
    13001320
    13011321        try:
     1322            #
     1323            # Write the XML to the reporter.
     1324            #
    13021325            g_oReporter.subXmlWrite(self, sText, utils.getCallerName());
     1326
     1327            #
    13031328            # Parse the supplied text and look for <Failed.../> tags to keep track of the
    13041329            # error counter. This is only a very lazy aproach.
    1305             sText.strip();
     1330            #
    13061331            idxText = 0;
    13071332            while sText:
    13081333                if self.sTagBuffer is None:
    13091334                    # Look for the start of a tag.
    1310                     idxStart = sText[idxText:].find('<');
     1335                    idxStart = sText.find('<', idxText);
    13111336                    if idxStart != -1:
    1312                         # Look for the end of the tag.
    1313                         idxEnd = sText[idxStart:].find('>');
    1314 
    13151337                        # If the end was found inside the current buffer, parse the line,
    1316                         # else we have to save it for later.
     1338                        # otherwise we have to save it for later.
     1339                        idxEnd = sText.find('>', idxStart);
    13171340                        if idxEnd != -1:
    1318                             idxEnd += idxStart + 1;
    1319                             self._processXmlElement(sText[idxStart:idxEnd]);
     1341                            self._processXmlElement(sText[idxStart:idxEnd+1]);
    13201342                            idxText = idxEnd;
    13211343                        else:
    13221344                            self.sTagBuffer = sText[idxStart:];
    1323                             idxText = len(sText);
     1345                            break;
    13241346                    else:
    1325                         idxText = len(sText);
     1347                        break;
    13261348                else:
    13271349                    # Search for the end of the tag and parse the whole tag.
    1328                     idxEnd = sText[idxText:].find('>');
     1350                    assert(idxText == 0);
     1351                    idxEnd = sText.find('>');
    13291352                    if idxEnd != -1:
    1330                         idxEnd += idxStart + 1;
    1331                         self._processXmlElement(self.sTagBuffer + sText[idxText:idxEnd]);
     1353                        self._processXmlElement(self.sTagBuffer + sText[:idxEnd+1]);
    13321354                        self.sTagBuffer = None;
    13331355                        idxText = idxEnd;
    13341356                    else:
    13351357                        self.sTagBuffer = self.sTagBuffer + sText[idxText:];
    1336                         idxText = len(sText);
    1337 
    1338                 sText = sText[idxText:];
    1339                 sText = sText.lstrip();
     1358                        break;
    13401359        except:
    13411360            traceback.print_exc();
     
    13441363    def _processXmlElement(self, sElement):
    13451364        """
    1346         Processes a complete XML tag (so far we only search for the Failed to tag
    1347         to keep track of the error counter.
     1365        Processes a complete XML tag.
     1366
     1367        We handle the 'Failed' tag to keep track of the error counter.
     1368        We also track 'Test' tags to make sure we close with all of them properly closed.
    13481369        """
    13491370        # Make sure we don't parse any space between < and the element name.
     
    13531374        idxEndName = sElement.find(' ');
    13541375        if idxEndName == -1:
    1355             idxEndName = sElement.find('/');
    1356         if idxEndName == -1:
    13571376            idxEndName = sElement.find('>');
    1358 
    1359         if idxEndName != -1:
    1360             if sElement[1:idxEndName] == 'Failed':
    1361                 g_oLock.acquire();
    1362                 try:
    1363                     g_oReporter.testIncErrors();
    1364                 finally:
    1365                     g_oLock.release();
    1366         else:
    1367             error('_processXmlElement(%s)' % sElement);
     1377            if idxEndName >= 0:
     1378                if sElement[idxEndName - 1] == '/':
     1379                    idxEndName -= 1;
     1380            else:
     1381                idxEndName = len(sElement);
     1382        sElementName = sElement[1:idxEndName];
     1383
     1384        # <Failed>:
     1385        if sElementName == 'Failed':
     1386            g_oLock.acquire();
     1387            try:
     1388                g_oReporter.testIncErrors();
     1389            finally:
     1390                g_oLock.release();
     1391            if self.acTestErrors:
     1392                self.acTestErrors[-1] += 1; # get errors attrib
     1393        # <Test>
     1394        elif sElementName == 'Test':
     1395            self.cTestDepth += 1;
     1396            self.acTestErrors.append(0);
     1397        # </Test>
     1398        elif sElementName == '/Test':
     1399            self.cTestDepth -= 1;
     1400            if self.acTestErrors:
     1401                cErrors = self.acTestErrors.pop();
     1402                if self.acTestErrors:
     1403                    self.acTestErrors[-1] += cErrors;
    13681404
    13691405
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