Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.34 KB | None | 0 0
  1. #!/usr/bin/env python2.7
  2.  
  3. import argparse
  4. import json
  5. import os
  6. import platform
  7. import re
  8. import string
  9. import time
  10. import uuid
  11. from itertools import cycle
  12.  
  13. # some random number of threads to pretend parallel run
  14. threads = cycle(range(8))
  15.  
  16.  
  17. def parse_arguments():
  18.     """Parses commandline arguments."""
  19.  
  20.     parser = argparse.ArgumentParser()
  21.     parser.add_argument(
  22.         "-I", "--input",
  23.         help="the input file path",
  24.     )
  25.     parser.add_argument(
  26.         "-O", "--output_dir",
  27.         help="the output directory",
  28.         default=os.path.join(os.getcwd(), 'report')
  29.     )
  30.     return parser.parse_args()
  31.  
  32.  
  33. RE_TEST_START = re.compile(r'^\d+/\d+\s+Test:\s+(?P<name>.+)')
  34.  
  35. RE_TEST_CASE = re.compile(r'^\s*Test case "(?P<name>.+)"\s+\w+\s+(?P<result>\w+)')
  36.  
  37. RE_TEST_TIME = re.compile(r'^Test\s+time\s+=\s+(?P<time>\d+\.\d+)')
  38.  
  39.  
  40. STATE_EXPECT_TEST = 0
  41. STATE_EXPECT_CASE = 2
  42.  
  43.  
  44. def process_input(data_file):
  45.     """Reads tokens from data file, and produces test suites
  46.    :return test_suite
  47.    """
  48.  
  49.     step = STATE_EXPECT_TEST
  50.  
  51.     with open(data_file, 'r') as f:
  52.         data = f.read()
  53.  
  54.     result = {}
  55.     for line in data.splitlines():
  56.         if step == STATE_EXPECT_TEST:
  57.             m = RE_TEST_START.match(line)
  58.             if m:
  59.                 result = {"name": m.group("name"), "cases": []}
  60.                 step = STATE_EXPECT_CASE
  61.             continue
  62.         if step == STATE_EXPECT_CASE:
  63.             m = RE_TEST_CASE.match(line)
  64.             if m:
  65.                 case_data = {"name": m.group("name"), "result": m.group("result")}
  66.                 if m.group("result") != "passed":
  67.                     RE_TEST_CASE_LOG = re.compile(r'(?<!Test case "){}(?P<log>.+)'.format(re.escape(m.group("name"))))
  68.                     log = RE_TEST_CASE_LOG.findall(data)
  69.                     if log:
  70.                         log = log[0].replace('"', '')
  71.  
  72.                         printable = set(string.printable)
  73.                         case_data["log"] = filter(lambda x: x in printable, log)
  74.                 result["cases"].append(case_data)
  75.                 continue
  76.             m = RE_TEST_TIME.match(line)
  77.             if m:
  78.                 result["time"] = float(m.group("time"))
  79.                 yield result
  80.                 step = STATE_EXPECT_TEST
  81.  
  82.  
  83. def write_test_suite(suite, output_dir):
  84.     """Adds test suite with cases to output."""
  85.  
  86.     suite_name = suite['name']
  87.     suite_time = int(float(suite['time']) * 1000)  # in ms
  88.     test_start_time = int(round(time.time() * 1000))  # current in ms
  89.  
  90.     for test_case in suite['cases']:
  91.         result = dict()
  92.         result['name'] = test_case["name"].split('/', 1)[-1]
  93.         result['fullName'] = test_case["name"]
  94.         ela = suite_time / len(suite['cases'])
  95.  
  96.         result['start'] = str(test_start_time)
  97.         result['stop'] = str(test_start_time + ela)
  98.         result['uuid'] = str(uuid.uuid4())
  99.         result['testCaseId'] = str(uuid.uuid4())
  100.  
  101.         result['labels'] = []
  102.  
  103.         result['labels'].append({'name': 'suite', 'value': suite_name})
  104.         result['labels'].append({'name': 'package', 'value': 'unittests'})
  105.  
  106.         # set unique thread
  107.         result['labels'].append({'name': 'host', 'value': '00{}-MainThread'.format(next(threads))})
  108.  
  109.         # set metainfo
  110.         result['labels'].append({'name': 'framework', 'value': 'boost'})
  111.         result['labels'].append({'name': 'language', 'value': 'c++'})
  112.  
  113.         # set hostname
  114.         result['labels'].append({'name': 'host', 'value': platform.node()})
  115.  
  116.         # set a small delimiter between tests
  117.         test_start_time += 10  # in ms
  118.  
  119.         if test_case['result'] != 'passed':
  120.             result['status'] = 'failed'
  121.             result['statusDetails'] = {'message': "{} has failed".format(test_case['name']),
  122.                                        'trace': test_case.get("log", "See logs for detail")}
  123.         else:
  124.             result['status'] = 'passed'
  125.  
  126.         with open(os.path.join(output_dir, '{}-result.json'.format(str(uuid.uuid4()))), 'w') as f:
  127.             f.write(json.dumps(result))
  128.  
  129.  
  130. def main():
  131.     args = parse_arguments()
  132.     if not os.path.exists(args.output_dir):
  133.         os.makedirs(args.output_dir)
  134.     for suite in process_input(args.input):
  135.         write_test_suite(suite, args.output_dir)
  136.  
  137.  
  138. if __name__ == "__main__":
  139.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement