blob: 5888bf32bd0e0ea94ff8d1b9c7b10084487f90e8 [file] [log] [blame]
Pau Espin Pedrold4dc2ad2020-06-15 13:27:07 +02001#!/usr/bin/env python3
2import _prep
3
4from osmo_gsm_tester.core import report
5from osmo_gsm_tester.core import log
6from osmo_gsm_tester.core import util
7from osmo_gsm_tester.core import test
8from osmo_gsm_tester.core import suite
9from osmo_gsm_tester.core import config
10
11import os
12import sys
13import shutil
14import difflib
15import xml.etree.ElementTree as et
16
17class 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
34class 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 Pedrole3d1b612020-06-15 14:27:50 +020042def fake_run_test(test_obj, status, duration, sysout=None, kpis=None):
Pau Espin Pedrold4dc2ad2020-06-15 13:27:07 +020043 test_obj.status = status
44 test_obj.duration = duration
45 if sysout is not None:
46 test_obj.set_report_stdout(sysout)
Pau Espin Pedrole3d1b612020-06-15 14:27:50 +020047 if kpis is not None:
48 test_obj.set_kpis(kpis)
Pau Espin Pedrold4dc2ad2020-06-15 13:27:07 +020049 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
54def fake_run_suite(suite_obj, duration):
55 suite_obj.duration = duration
56 suite_obj.determine_status()
57
58config.override_conf = os.path.join(os.path.dirname(sys.argv[0]), 'main.conf')
59
60example_trial_dir = os.path.join('test_trial_tmp')
61
62trial = FakeTrial()
63
64# Suite passes with 2 tests passing
65s_def = FakeSuiteDefinition('suiteA', 2)
66s = suite.SuiteRun(trial, s_def.name(), s_def)
67trial.suites.append(s)
68fake_run_test(s.tests[0], test.Test.PASS, 30)
69fake_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)
71fake_run_suite(s, 50)
72
73# Suite passes first test but next ones are not ececuted
74s_def = FakeSuiteDefinition('suiteB', 3)
75s = suite.SuiteRun(trial, s_def.name(), s_def)
76trial.suites.append(s)
77fake_run_test(s.tests[0], test.Test.PASS, 10)
78fake_run_suite(s, 20)
79
80# Suite passes one test selected, others are skipped
81s_def = FakeSuiteDefinition('suiteC', 3)
82s = suite.SuiteRun(trial, s_def.name(), s_def)
83trial.suites.append(s)
84s.tests[0].set_skip()
85fake_run_test(s.tests[1], test.Test.PASS, 10)
86s.tests[2].set_skip()
87fake_run_suite(s, 12)
88
89# Suite fails due to one of its tests failing
90s_def = FakeSuiteDefinition('suiteD', 2)
91s = suite.SuiteRun(trial, s_def.name(), s_def)
92trial.suites.append(s)
93fake_run_test(s.tests[0], test.Test.FAIL, 12)
94fake_run_test(s.tests[1], test.Test.PASS, 10)
95fake_run_suite(s, 20)
96
Pau Espin Pedrole3d1b612020-06-15 14:27:50 +020097# Test adding KPIs
98s_def = FakeSuiteDefinition('suiteE', 2)
99s = suite.SuiteRun(trial, s_def.name(), s_def)
100trial.suites.append(s)
101fake_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'})
102fake_run_test(s.tests[1], test.Test.PASS, 10, kpis={'abcd': 'abcdval'})
103fake_run_suite(s, 20)
104
Pau Espin Pedrold4dc2ad2020-06-15 13:27:07 +0200105element = report.trial_to_junit(trial)
106
107def 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
122def 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
131indent(element)
132#canonicalize() is only available in python3.8+, and we need it to have reliable string output:
133if 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 Pedrole3d1b612020-06-15 14:27:50 +0200139 # Uncomment to update exp_path:
140 #with open(exp_path, 'w') as f:
141 # f.write(got)
Pau Espin Pedrold4dc2ad2020-06-15 13:27:07 +0200142
143#deleting generated tmp trial dir:
144shutil.rmtree(example_trial_dir, ignore_errors=True)
145
146# vim: expandtab tabstop=4 shiftwidth=4