162306a36Sopenharmony_ci#!/usr/bin/env python3 262306a36Sopenharmony_ci 362306a36Sopenharmony_cifrom enum import Enum 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciclass ResultState(Enum): 662306a36Sopenharmony_ci noresult = -1 762306a36Sopenharmony_ci skip = 0 862306a36Sopenharmony_ci success = 1 962306a36Sopenharmony_ci fail = 2 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciclass TestResult: 1262306a36Sopenharmony_ci def __init__(self, test_id="", test_name=""): 1362306a36Sopenharmony_ci self.test_id = test_id 1462306a36Sopenharmony_ci self.test_name = test_name 1562306a36Sopenharmony_ci self.result = ResultState.noresult 1662306a36Sopenharmony_ci self.failmsg = "" 1762306a36Sopenharmony_ci self.errormsg = "" 1862306a36Sopenharmony_ci self.steps = [] 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci def set_result(self, result): 2162306a36Sopenharmony_ci if (isinstance(result, ResultState)): 2262306a36Sopenharmony_ci self.result = result 2362306a36Sopenharmony_ci return True 2462306a36Sopenharmony_ci else: 2562306a36Sopenharmony_ci raise TypeError('Unknown result type, must be type ResultState') 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci def get_result(self): 2862306a36Sopenharmony_ci return self.result 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci def set_errormsg(self, errormsg): 3162306a36Sopenharmony_ci self.errormsg = errormsg 3262306a36Sopenharmony_ci return True 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci def append_errormsg(self, errormsg): 3562306a36Sopenharmony_ci self.errormsg = '{}\n{}'.format(self.errormsg, errormsg) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci def get_errormsg(self): 3862306a36Sopenharmony_ci return self.errormsg 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci def set_failmsg(self, failmsg): 4162306a36Sopenharmony_ci self.failmsg = failmsg 4262306a36Sopenharmony_ci return True 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci def append_failmsg(self, failmsg): 4562306a36Sopenharmony_ci self.failmsg = '{}\n{}'.format(self.failmsg, failmsg) 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci def get_failmsg(self): 4862306a36Sopenharmony_ci return self.failmsg 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci def add_steps(self, newstep): 5162306a36Sopenharmony_ci if type(newstep) == list: 5262306a36Sopenharmony_ci self.steps.extend(newstep) 5362306a36Sopenharmony_ci elif type(newstep) == str: 5462306a36Sopenharmony_ci self.steps.append(step) 5562306a36Sopenharmony_ci else: 5662306a36Sopenharmony_ci raise TypeError('TdcResults.add_steps() requires a list or str') 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci def get_executed_steps(self): 5962306a36Sopenharmony_ci return self.steps 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ciclass TestSuiteReport(): 6262306a36Sopenharmony_ci _testsuite = [] 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci def add_resultdata(self, result_data): 6562306a36Sopenharmony_ci if isinstance(result_data, TestResult): 6662306a36Sopenharmony_ci self._testsuite.append(result_data) 6762306a36Sopenharmony_ci return True 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci def count_tests(self): 7062306a36Sopenharmony_ci return len(self._testsuite) 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci def count_failures(self): 7362306a36Sopenharmony_ci return sum(1 for t in self._testsuite if t.result == ResultState.fail) 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci def count_skips(self): 7662306a36Sopenharmony_ci return sum(1 for t in self._testsuite if t.result == ResultState.skip) 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci def find_result(self, test_id): 7962306a36Sopenharmony_ci return next((tr for tr in self._testsuite if tr.test_id == test_id), None) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci def update_result(self, result_data): 8262306a36Sopenharmony_ci orig = self.find_result(result_data.test_id) 8362306a36Sopenharmony_ci if orig != None: 8462306a36Sopenharmony_ci idx = self._testsuite.index(orig) 8562306a36Sopenharmony_ci self._testsuite[idx] = result_data 8662306a36Sopenharmony_ci else: 8762306a36Sopenharmony_ci self.add_resultdata(result_data) 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci def format_tap(self): 9062306a36Sopenharmony_ci ftap = "" 9162306a36Sopenharmony_ci ftap += '1..{}\n'.format(self.count_tests()) 9262306a36Sopenharmony_ci index = 1 9362306a36Sopenharmony_ci for t in self._testsuite: 9462306a36Sopenharmony_ci if t.result == ResultState.fail: 9562306a36Sopenharmony_ci ftap += 'not ' 9662306a36Sopenharmony_ci ftap += 'ok {} {} - {}'.format(str(index), t.test_id, t.test_name) 9762306a36Sopenharmony_ci if t.result == ResultState.skip or t.result == ResultState.noresult: 9862306a36Sopenharmony_ci ftap += ' # skipped - {}\n'.format(t.errormsg) 9962306a36Sopenharmony_ci elif t.result == ResultState.fail: 10062306a36Sopenharmony_ci if len(t.steps) > 0: 10162306a36Sopenharmony_ci ftap += '\tCommands executed in this test case:' 10262306a36Sopenharmony_ci for step in t.steps: 10362306a36Sopenharmony_ci ftap += '\n\t\t{}'.format(step) 10462306a36Sopenharmony_ci ftap += '\n\t{}'.format(t.failmsg) 10562306a36Sopenharmony_ci ftap += '\n' 10662306a36Sopenharmony_ci index += 1 10762306a36Sopenharmony_ci return ftap 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci def format_xunit(self): 11062306a36Sopenharmony_ci from xml.sax.saxutils import escape 11162306a36Sopenharmony_ci xunit = "<testsuites>\n" 11262306a36Sopenharmony_ci xunit += '\t<testsuite tests=\"{}\" skips=\"{}\">\n'.format(self.count_tests(), self.count_skips()) 11362306a36Sopenharmony_ci for t in self._testsuite: 11462306a36Sopenharmony_ci xunit += '\t\t<testcase classname=\"{}\" '.format(escape(t.test_id)) 11562306a36Sopenharmony_ci xunit += 'name=\"{}\">\n'.format(escape(t.test_name)) 11662306a36Sopenharmony_ci if t.failmsg: 11762306a36Sopenharmony_ci xunit += '\t\t\t<failure>\n' 11862306a36Sopenharmony_ci if len(t.steps) > 0: 11962306a36Sopenharmony_ci xunit += 'Commands executed in this test case:\n' 12062306a36Sopenharmony_ci for step in t.steps: 12162306a36Sopenharmony_ci xunit += '\t{}\n'.format(escape(step)) 12262306a36Sopenharmony_ci xunit += 'FAILURE: {}\n'.format(escape(t.failmsg)) 12362306a36Sopenharmony_ci xunit += '\t\t\t</failure>\n' 12462306a36Sopenharmony_ci if t.errormsg: 12562306a36Sopenharmony_ci xunit += '\t\t\t<error>\n{}\n'.format(escape(t.errormsg)) 12662306a36Sopenharmony_ci xunit += '\t\t\t</error>\n' 12762306a36Sopenharmony_ci if t.result == ResultState.skip: 12862306a36Sopenharmony_ci xunit += '\t\t\t<skipped/>\n' 12962306a36Sopenharmony_ci xunit += '\t\t</testcase>\n' 13062306a36Sopenharmony_ci xunit += '\t</testsuite>\n' 13162306a36Sopenharmony_ci xunit += '</testsuites>\n' 13262306a36Sopenharmony_ci return xunit 133