# limitations under the License.
"""Script parses the data taken by robot framework (output.xml) and dumps
-intereted values into XML output file."""
+interested values into XML output file."""
import argparse
+import re
import sys
import xml.etree.ElementTree as ET
class ExecutionChecker(ResultVisitor):
"""Iterates through test cases."""
+ tc_regexp = re.compile(ur'^tc\d+-((\d+)B|IMIX)-(\d)t(\d)c-(.*)')
+ rate_regexp = re.compile(ur'^[\D\d]*FINAL_RATE:\s(\d+\.\d+)[\D\d]*')
+ lat_regexp = re.compile(ur'^[\D\d]*'\
+ ur'LAT_\d+%NDR:\s\[\'(-?\d+\/-?\d+\/-?\d+)\','\
+ ur'\s\'(-?\d+\/-?\d+\/-?\d+)\'\]\s\n'\
+ ur'LAT_\d+%NDR:\s\[\'(-?\d+\/-?\d+\/-?\d+)\','\
+ ur'\s\'(-?\d+\/-?\d+\/-?\d+)\'\]\s\n'\
+ ur'LAT_\d+%NDR:\s\[\'(-?\d+\/-?\d+\/-?\d+)\','\
+ ur'\s\'(-?\d+\/-?\d+\/-?\d+)\'\]')
+
def __init__(self, args):
self.root = ET.Element('build',
attrib={'vdevice': args.vdevice})
:type test: Test
:return: Nothing.
"""
- if any("PERFTEST_LONG" in tag for tag in test.tags):
+ if any("NDRPDRDISC" in tag for tag in test.tags):
if test.status == 'PASS':
tags = []
for tag in test.tags:
tags.append(tag)
- for keyword in test.keywords:
- for assign in keyword.assign:
- if assign == '${framesize}':
- framesize = keyword.args[0]
- if 'worker threads' in keyword.name:
- workers = keyword.name.split('\'')[1]
- workers_per_nic = keyword.name.split('\'')[3]
-
- test_elem = ET.SubElement(self.root,
- test.parent.name.replace(" ",""))
+
+ test_elem = ET.SubElement(
+ self.root, "S" + test.parent.name.replace(" ", ""))
test_elem.attrib['name'] = test.parent.name
- test_elem.attrib['workerthreads'] = workers
- test_elem.attrib['workerspernic'] = workers_per_nic
- test_elem.attrib['framesize'] = framesize
+ test_elem.attrib['framesize'] = str(re.search(
+ self.tc_regexp, test.name).group(1))
+ test_elem.attrib['threads'] = str(re.search(
+ self.tc_regexp, test.name).group(3))
+ test_elem.attrib['cores'] = str(re.search(
+ self.tc_regexp, test.name).group(4))
+ if any("NDRDISC" in tag for tag in test.tags):
+ try:
+ test_elem.attrib['lat_100'] = str(re.search(
+ self.lat_regexp, test.message).group(1)) + '/' +\
+ str(re.search(self.lat_regexp, test.message).
+ group(2))
+ except AttributeError:
+ test_elem.attrib['lat_100'] = "-1/-1/-1/-1/-1/-1"
+ try:
+ test_elem.attrib['lat_50'] = str(re.search(
+ self.lat_regexp, test.message).group(3)) + '/' +\
+ str(re.search(self.lat_regexp, test.message).
+ group(4))
+ except AttributeError:
+ test_elem.attrib['lat_50'] = "-1/-1/-1/-1/-1/-1"
+ try:
+ test_elem.attrib['lat_10'] = str(re.search(
+ self.lat_regexp, test.message).group(5)) + '/' +\
+ str(re.search(self.lat_regexp, test.message).
+ group(6))
+ except AttributeError:
+ test_elem.attrib['lat_10'] = "-1/-1/-1/-1/-1/-1"
test_elem.attrib['tags'] = ', '.join(tags)
- test_elem.text = test.message.split(' ')[1]
+ try:
+ test_elem.text = str(re.search(
+ self.rate_regexp, test.message).group(1))
+ except AttributeError:
+ test_elem.text = "-1"
def end_test(self, test):
"""Called when test ends.
:return: nothing
"""
- sys.stderr.write(msg+'\n')
+ sys.stderr.write(msg + '\n')
def parse_args():
"""
parser = argparse.ArgumentParser()
- parser.add_argument("-i", "--input", required=True,
+ parser.add_argument("-i", "--input",
+ required=True,
type=argparse.FileType('r'),
help="Robot XML log file")
- parser.add_argument("-o", "--output", required=True,
+ parser.add_argument("-o", "--output",
+ required=True,
type=argparse.FileType('w'),
help="XML output file")
- parser.add_argument("-v", "--vdevice", required=True,
+ parser.add_argument("-v", "--vdevice",
+ required=False,
+ default="",
+ type=str,
help="VPP version")
return parser.parse_args()