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