#
|
# Copyright (C) 2016 Intel Corporation
|
#
|
# SPDX-License-Identifier: MIT
|
#
|
|
import base64
|
import zlib
|
import unittest
|
|
from oeqa.core.exception import OEQAMissingVariable
|
|
def _validate_td_vars(td, td_vars, type_msg):
|
if td_vars:
|
for v in td_vars:
|
if not v in td:
|
raise OEQAMissingVariable("Test %s need %s variable but"\
|
" isn't into td" % (type_msg, v))
|
|
class OETestCase(unittest.TestCase):
|
# TestContext and Logger instance set by OETestLoader.
|
tc = None
|
logger = None
|
|
# td has all the variables needed by the test cases
|
# is the same across all the test cases.
|
td = None
|
|
# td_vars has the variables needed by a test class
|
# or test case instance, if some var isn't into td a
|
# OEQAMissingVariable exception is raised
|
td_vars = None
|
|
@classmethod
|
def _oeSetUpClass(clss):
|
_validate_td_vars(clss.td, clss.td_vars, "class")
|
if hasattr(clss, 'setUpHooker') and callable(getattr(clss, 'setUpHooker')):
|
clss.setUpHooker()
|
clss.setUpClassMethod()
|
|
@classmethod
|
def _oeTearDownClass(clss):
|
clss.tearDownClassMethod()
|
|
def _oeSetUp(self):
|
try:
|
for d in self.decorators:
|
d.setUpDecorator()
|
except:
|
for d in self.decorators:
|
d.tearDownDecorator()
|
raise
|
self.setUpMethod()
|
|
def _oeTearDown(self):
|
for d in self.decorators:
|
d.tearDownDecorator()
|
self.tearDownMethod()
|
|
class OEPTestResultTestCase:
|
"""
|
Mix-in class to provide functions to make interacting with extraresults for
|
the purposes of storing ptestresult data.
|
"""
|
@staticmethod
|
def _compress_log(log):
|
logdata = log.encode("utf-8") if isinstance(log, str) else log
|
logdata = zlib.compress(logdata)
|
logdata = base64.b64encode(logdata).decode("utf-8")
|
return {"compressed" : logdata}
|
|
def ptest_rawlog(self, log):
|
if not hasattr(self, "extraresults"):
|
self.extraresults = {"ptestresult.sections" : {}}
|
self.extraresults["ptestresult.rawlogs"] = {"log" : self._compress_log(log)}
|
|
def ptest_section(self, section, duration = None, log = None, logfile = None, exitcode = None):
|
if not hasattr(self, "extraresults"):
|
self.extraresults = {"ptestresult.sections" : {}}
|
|
sections = self.extraresults.get("ptestresult.sections")
|
if section not in sections:
|
sections[section] = {}
|
|
if log is not None:
|
sections[section]["log"] = self._compress_log(log)
|
elif logfile is not None:
|
with open(logfile, "rb") as f:
|
sections[section]["log"] = self._compress_log(f.read())
|
|
if duration is not None:
|
sections[section]["duration"] = duration
|
if exitcode is not None:
|
sections[section]["exitcode"] = exitcode
|
|
def ptest_result(self, section, test, result):
|
if not hasattr(self, "extraresults"):
|
self.extraresults = {"ptestresult.sections" : {}}
|
|
sections = self.extraresults.get("ptestresult.sections")
|
if section not in sections:
|
sections[section] = {}
|
resultname = "ptestresult.{}.{}".format(section, test)
|
self.extraresults[resultname] = {"status" : result}
|