Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tc-testing: Add new TdcResults module

This module includes new classes for tdc to use in keeping track
of test case results, instead of generating and tracking a lengthy
string.

The new module can be extended to support multiple formal
test result formats to be friendlier to automation.

Signed-off-by: Lucas Bates <lucasb@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Lucas Bates and committed by
David S. Miller
dfe465d3 d37e56df

+132
+132
tools/testing/selftests/tc-testing/TdcResults.py
··· 1 + #!/usr/bin/env python3 2 + 3 + from enum import Enum 4 + 5 + class ResultState(Enum): 6 + noresult = -1 7 + skip = 0 8 + success = 1 9 + fail = 2 10 + 11 + class TestResult: 12 + def __init__(self, test_id="", test_name=""): 13 + self.test_id = test_id 14 + self.test_name = test_name 15 + self.result = ResultState.noresult 16 + self.failmsg = "" 17 + self.errormsg = "" 18 + self.steps = [] 19 + 20 + def set_result(self, result): 21 + if (isinstance(result, ResultState)): 22 + self.result = result 23 + return True 24 + else: 25 + raise TypeError('Unknown result type, must be type ResultState') 26 + 27 + def get_result(self): 28 + return self.result 29 + 30 + def set_errormsg(self, errormsg): 31 + self.errormsg = errormsg 32 + return True 33 + 34 + def append_errormsg(self, errormsg): 35 + self.errormsg = '{}\n{}'.format(self.errormsg, errormsg) 36 + 37 + def get_errormsg(self): 38 + return self.errormsg 39 + 40 + def set_failmsg(self, failmsg): 41 + self.failmsg = failmsg 42 + return True 43 + 44 + def append_failmsg(self, failmsg): 45 + self.failmsg = '{}\n{}'.format(self.failmsg, failmsg) 46 + 47 + def get_failmsg(self): 48 + return self.failmsg 49 + 50 + def add_steps(self, newstep): 51 + if type(newstep) == list: 52 + self.steps.extend(newstep) 53 + elif type(newstep) == str: 54 + self.steps.append(step) 55 + else: 56 + raise TypeError('TdcResults.add_steps() requires a list or str') 57 + 58 + def get_executed_steps(self): 59 + return self.steps 60 + 61 + class TestSuiteReport(): 62 + _testsuite = [] 63 + 64 + def add_resultdata(self, result_data): 65 + if isinstance(result_data, TestResult): 66 + self._testsuite.append(result_data) 67 + return True 68 + 69 + def count_tests(self): 70 + return len(self._testsuite) 71 + 72 + def count_failures(self): 73 + return sum(1 for t in self._testsuite if t.result == ResultState.fail) 74 + 75 + def count_skips(self): 76 + return sum(1 for t in self._testsuite if t.result == ResultState.skip) 77 + 78 + def find_result(self, test_id): 79 + return next((tr for tr in self._testsuite if tr.test_id == test_id), None) 80 + 81 + def update_result(self, result_data): 82 + orig = self.find_result(result_data.test_id) 83 + if orig != None: 84 + idx = self._testsuite.index(orig) 85 + self._testsuite[idx] = result_data 86 + else: 87 + self.add_resultdata(result_data) 88 + 89 + def format_tap(self): 90 + ftap = "" 91 + ftap += '1..{}\n'.format(self.count_tests()) 92 + index = 1 93 + for t in self._testsuite: 94 + if t.result == ResultState.fail: 95 + ftap += 'not ' 96 + ftap += 'ok {} {} - {}'.format(str(index), t.test_id, t.test_name) 97 + if t.result == ResultState.skip or t.result == ResultState.noresult: 98 + ftap += ' # skipped - {}\n'.format(t.errormsg) 99 + elif t.result == ResultState.fail: 100 + if len(t.steps) > 0: 101 + ftap += '\tCommands executed in this test case:' 102 + for step in t.steps: 103 + ftap += '\n\t\t{}'.format(step) 104 + ftap += '\n\t{}'.format(t.failmsg) 105 + ftap += '\n' 106 + index += 1 107 + return ftap 108 + 109 + def format_xunit(self): 110 + from xml.sax.saxutils import escape 111 + xunit = "<testsuites>\n" 112 + xunit += '\t<testsuite tests=\"{}\" skips=\"{}\">\n'.format(self.count_tests(), self.count_skips()) 113 + for t in self._testsuite: 114 + xunit += '\t\t<testcase classname=\"{}\" '.format(escape(t.test_id)) 115 + xunit += 'name=\"{}\">\n'.format(escape(t.test_name)) 116 + if t.failmsg: 117 + xunit += '\t\t\t<failure>\n' 118 + if len(t.steps) > 0: 119 + xunit += 'Commands executed in this test case:\n' 120 + for step in t.steps: 121 + xunit += '\t{}\n'.format(escape(step)) 122 + xunit += 'FAILURE: {}\n'.format(escape(t.failmsg)) 123 + xunit += '\t\t\t</failure>\n' 124 + if t.errormsg: 125 + xunit += '\t\t\t<error>\n{}\n'.format(escape(t.errormsg)) 126 + xunit += '\t\t\t</error>\n' 127 + if t.result == ResultState.skip: 128 + xunit += '\t\t\t<skipped/>\n' 129 + xunit += '\t\t</testcase>\n' 130 + xunit += '\t</testsuite>\n' 131 + xunit += '</testsuites>\n' 132 + return xunit