Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python2.7
- import argparse
- import json
- import os
- import platform
- import re
- import string
- import time
- import uuid
- from itertools import cycle
- # some random number of threads to pretend parallel run
- threads = cycle(range(8))
- def parse_arguments():
- """Parses commandline arguments."""
- parser = argparse.ArgumentParser()
- parser.add_argument(
- "-I", "--input",
- help="the input file path",
- )
- parser.add_argument(
- "-O", "--output_dir",
- help="the output directory",
- default=os.path.join(os.getcwd(), 'report')
- )
- return parser.parse_args()
- RE_TEST_START = re.compile(r'^\d+/\d+\s+Test:\s+(?P<name>.+)')
- RE_TEST_CASE = re.compile(r'^\s*Test case "(?P<name>.+)"\s+\w+\s+(?P<result>\w+)')
- RE_TEST_TIME = re.compile(r'^Test\s+time\s+=\s+(?P<time>\d+\.\d+)')
- STATE_EXPECT_TEST = 0
- STATE_EXPECT_CASE = 2
- def process_input(data_file):
- """Reads tokens from data file, and produces test suites
- :return test_suite
- """
- step = STATE_EXPECT_TEST
- with open(data_file, 'r') as f:
- data = f.read()
- result = {}
- for line in data.splitlines():
- if step == STATE_EXPECT_TEST:
- m = RE_TEST_START.match(line)
- if m:
- result = {"name": m.group("name"), "cases": []}
- step = STATE_EXPECT_CASE
- continue
- if step == STATE_EXPECT_CASE:
- m = RE_TEST_CASE.match(line)
- if m:
- case_data = {"name": m.group("name"), "result": m.group("result")}
- if m.group("result") != "passed":
- RE_TEST_CASE_LOG = re.compile(r'(?<!Test case "){}(?P<log>.+)'.format(re.escape(m.group("name"))))
- log = RE_TEST_CASE_LOG.findall(data)
- if log:
- log = log[0].replace('"', '')
- printable = set(string.printable)
- case_data["log"] = filter(lambda x: x in printable, log)
- result["cases"].append(case_data)
- continue
- m = RE_TEST_TIME.match(line)
- if m:
- result["time"] = float(m.group("time"))
- yield result
- step = STATE_EXPECT_TEST
- def write_test_suite(suite, output_dir):
- """Adds test suite with cases to output."""
- suite_name = suite['name']
- suite_time = int(float(suite['time']) * 1000) # in ms
- test_start_time = int(round(time.time() * 1000)) # current in ms
- for test_case in suite['cases']:
- result = dict()
- result['name'] = test_case["name"].split('/', 1)[-1]
- result['fullName'] = test_case["name"]
- ela = suite_time / len(suite['cases'])
- result['start'] = str(test_start_time)
- result['stop'] = str(test_start_time + ela)
- result['uuid'] = str(uuid.uuid4())
- result['testCaseId'] = str(uuid.uuid4())
- result['labels'] = []
- result['labels'].append({'name': 'suite', 'value': suite_name})
- result['labels'].append({'name': 'package', 'value': 'unittests'})
- # set unique thread
- result['labels'].append({'name': 'host', 'value': '00{}-MainThread'.format(next(threads))})
- # set metainfo
- result['labels'].append({'name': 'framework', 'value': 'boost'})
- result['labels'].append({'name': 'language', 'value': 'c++'})
- # set hostname
- result['labels'].append({'name': 'host', 'value': platform.node()})
- # set a small delimiter between tests
- test_start_time += 10 # in ms
- if test_case['result'] != 'passed':
- result['status'] = 'failed'
- result['statusDetails'] = {'message': "{} has failed".format(test_case['name']),
- 'trace': test_case.get("log", "See logs for detail")}
- else:
- result['status'] = 'passed'
- with open(os.path.join(output_dir, '{}-result.json'.format(str(uuid.uuid4()))), 'w') as f:
- f.write(json.dumps(result))
- def main():
- args = parse_arguments()
- if not os.path.exists(args.output_dir):
- os.makedirs(args.output_dir)
- for suite in process_input(args.input):
- write_test_suite(suite, args.output_dir)
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement