Pau Espin Pedrol | d4dc2ad | 2020-06-15 13:27:07 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | import _prep |
| 3 | |
| 4 | from osmo_gsm_tester.core import report |
| 5 | from osmo_gsm_tester.core import log |
| 6 | from osmo_gsm_tester.core import util |
| 7 | from osmo_gsm_tester.core import test |
| 8 | from osmo_gsm_tester.core import suite |
| 9 | from osmo_gsm_tester.core import config |
| 10 | |
| 11 | import os |
| 12 | import sys |
| 13 | import shutil |
| 14 | import difflib |
| 15 | import xml.etree.ElementTree as et |
| 16 | |
| 17 | class FakeTrial(log.Origin): |
| 18 | def __init__(self): |
| 19 | super().__init__(log.C_TST, 'trial') |
| 20 | self.dir = util.Dir(example_trial_dir) |
| 21 | self._run_dir = None |
| 22 | self.suites = [] |
| 23 | |
| 24 | def get_all_inst_hash_info(self): |
| 25 | return { 'foobar/potato': '1234', 'orange': 'abcd' } |
| 26 | |
| 27 | def get_run_dir(self): |
| 28 | if self._run_dir is not None: |
| 29 | return self._run_dir |
| 30 | self._run_dir = util.Dir(self.dir.new_child('test_run')) |
| 31 | self._run_dir.mkdir() |
| 32 | return self._run_dir |
| 33 | |
| 34 | class FakeSuiteDefinition(log.Origin): |
| 35 | def __init__(self, name, num_tests): |
| 36 | super().__init__(log.C_TST, name) |
| 37 | self.test_basenames = [name + '-' + str(tid) for tid in range(num_tests) ] |
| 38 | self.conf = {} |
| 39 | self.suite_dir = util.Dir(example_trial_dir).new_child('suitedef' + name) |
| 40 | |
| 41 | |
Pau Espin Pedrol | e3d1b61 | 2020-06-15 14:27:50 +0200 | [diff] [blame] | 42 | def fake_run_test(test_obj, status, duration, sysout=None, kpis=None): |
Pau Espin Pedrol | d4dc2ad | 2020-06-15 13:27:07 +0200 | [diff] [blame] | 43 | test_obj.status = status |
| 44 | test_obj.duration = duration |
| 45 | if sysout is not None: |
| 46 | test_obj.set_report_stdout(sysout) |
Pau Espin Pedrol | e3d1b61 | 2020-06-15 14:27:50 +0200 | [diff] [blame] | 47 | if kpis is not None: |
| 48 | test_obj.set_kpis(kpis) |
Pau Espin Pedrol | d4dc2ad | 2020-06-15 13:27:07 +0200 | [diff] [blame] | 49 | if status == test.Test.FAIL: |
| 50 | test_obj.fail_type = 'fake_fail_type' |
| 51 | test_obj.fail_message = 'fake_fail_message' |
| 52 | test_obj.fail_tb = 'system stderr fake content' |
| 53 | |
| 54 | def fake_run_suite(suite_obj, duration): |
| 55 | suite_obj.duration = duration |
| 56 | suite_obj.determine_status() |
| 57 | |
| 58 | config.override_conf = os.path.join(os.path.dirname(sys.argv[0]), 'main.conf') |
| 59 | |
| 60 | example_trial_dir = os.path.join('test_trial_tmp') |
| 61 | |
| 62 | trial = FakeTrial() |
| 63 | |
| 64 | # Suite passes with 2 tests passing |
| 65 | s_def = FakeSuiteDefinition('suiteA', 2) |
| 66 | s = suite.SuiteRun(trial, s_def.name(), s_def) |
| 67 | trial.suites.append(s) |
| 68 | fake_run_test(s.tests[0], test.Test.PASS, 30) |
| 69 | fake_run_test(s.tests[1], test.Test.PASS, 10, 'yay this is a test-applied stdout') |
| 70 | #fake_run_test(suiteA.tests[0], test.Test.UNKNOWN, 20) |
| 71 | fake_run_suite(s, 50) |
| 72 | |
| 73 | # Suite passes first test but next ones are not ececuted |
| 74 | s_def = FakeSuiteDefinition('suiteB', 3) |
| 75 | s = suite.SuiteRun(trial, s_def.name(), s_def) |
| 76 | trial.suites.append(s) |
| 77 | fake_run_test(s.tests[0], test.Test.PASS, 10) |
| 78 | fake_run_suite(s, 20) |
| 79 | |
| 80 | # Suite passes one test selected, others are skipped |
| 81 | s_def = FakeSuiteDefinition('suiteC', 3) |
| 82 | s = suite.SuiteRun(trial, s_def.name(), s_def) |
| 83 | trial.suites.append(s) |
| 84 | s.tests[0].set_skip() |
| 85 | fake_run_test(s.tests[1], test.Test.PASS, 10) |
| 86 | s.tests[2].set_skip() |
| 87 | fake_run_suite(s, 12) |
| 88 | |
| 89 | # Suite fails due to one of its tests failing |
| 90 | s_def = FakeSuiteDefinition('suiteD', 2) |
| 91 | s = suite.SuiteRun(trial, s_def.name(), s_def) |
| 92 | trial.suites.append(s) |
| 93 | fake_run_test(s.tests[0], test.Test.FAIL, 12) |
| 94 | fake_run_test(s.tests[1], test.Test.PASS, 10) |
| 95 | fake_run_suite(s, 20) |
| 96 | |
Pau Espin Pedrol | e3d1b61 | 2020-06-15 14:27:50 +0200 | [diff] [blame] | 97 | # Test adding KPIs |
| 98 | s_def = FakeSuiteDefinition('suiteE', 2) |
| 99 | s = suite.SuiteRun(trial, s_def.name(), s_def) |
| 100 | trial.suites.append(s) |
| 101 | fake_run_test(s.tests[0], test.Test.FAIL, 12, kpis={'ueA': {'kpiA': 30, 'kpiB': 'foobar', 'yet-another-level': {'foo': 'bar'}}, 'enbD': {'foobar-boolean': True }, 'somekpi': 'someval'}) |
| 102 | fake_run_test(s.tests[1], test.Test.PASS, 10, kpis={'abcd': 'abcdval'}) |
| 103 | fake_run_suite(s, 20) |
| 104 | |
Pau Espin Pedrol | d4dc2ad | 2020-06-15 13:27:07 +0200 | [diff] [blame] | 105 | element = report.trial_to_junit(trial) |
| 106 | |
| 107 | def indent(elem, level=0): |
| 108 | i = "\n" + level*" " |
| 109 | if len(elem): |
| 110 | if not elem.text or not elem.text.strip(): |
| 111 | elem.text = i + " " |
| 112 | if not elem.tail or not elem.tail.strip(): |
| 113 | elem.tail = i |
| 114 | for elem in elem: |
| 115 | indent(elem, level+1) |
| 116 | if not elem.tail or not elem.tail.strip(): |
| 117 | elem.tail = i |
| 118 | else: |
| 119 | if level and (not elem.tail or not elem.tail.strip()): |
| 120 | elem.tail = i |
| 121 | |
| 122 | def udiff(expect, got, expect_path): |
| 123 | expect = expect.splitlines(1) |
| 124 | got = got.splitlines(1) |
| 125 | for line in difflib.unified_diff(expect, got, |
| 126 | fromfile=expect_path, tofile='got'): |
| 127 | sys.stderr.write(line) |
| 128 | if not line.endswith('\n'): |
| 129 | sys.stderr.write('[no-newline]\n') |
| 130 | |
| 131 | indent(element) |
| 132 | #canonicalize() is only available in python3.8+, and we need it to have reliable string output: |
| 133 | if hasattr(et, 'canonicalize'): |
| 134 | got = et.canonicalize(et.tostring(element)).rstrip() |
| 135 | exp_path = os.path.join(os.path.dirname(sys.argv[0]), 'expected_junit_output.xml') |
| 136 | with open(exp_path, 'r') as f: |
| 137 | exp = f.read().rstrip() |
| 138 | udiff(exp, got, exp_path) |
Pau Espin Pedrol | e3d1b61 | 2020-06-15 14:27:50 +0200 | [diff] [blame] | 139 | # Uncomment to update exp_path: |
| 140 | #with open(exp_path, 'w') as f: |
| 141 | # f.write(got) |
Pau Espin Pedrol | d4dc2ad | 2020-06-15 13:27:07 +0200 | [diff] [blame] | 142 | |
| 143 | #deleting generated tmp trial dir: |
| 144 | shutil.rmtree(example_trial_dir, ignore_errors=True) |
| 145 | |
| 146 | # vim: expandtab tabstop=4 shiftwidth=4 |