diff options
author | duerpei <duep.fnst@fujitsu.com> | 2022-10-12 10:42:44 +0800 |
---|---|---|
committer | duerpei <duep.fnst@fujitsu.com> | 2022-10-12 10:42:44 +0800 |
commit | 2b0b2c37da795ae77d006308c96a054734ab6d24 (patch) | |
tree | b87e1268671946a70609ea5797e5e3792008da16 | |
parent | 8fdb9582a0634bf7fdb6015922b1d153d42f1256 (diff) |
agl-test-framework: add LTPBase class
Add LTPBase class for test suites from LTP(linux-test-project).
The LTPBase inherits from AGLBaseTest class. It contains some
common functions, which are used to run the test suites from
LTP and process the log. It makes it easy to support test suites
from LTP.
And add run_test scripts for the test suite of ltp/math, the
scripts used the class of LTPBase.
Bug-AGL: SPEC-4345
Signed-off-by: duerpei <duep.fnst@fujitsu.com>
Change-Id: I683aaca37ddfb84a12e570a8918934ea8391ded6
-rw-r--r-- | tests/LTP/__init__.py | 0 | ||||
-rw-r--r-- | tests/LTP/agl_test_ltp_base.py | 130 | ||||
-rw-r--r-- | tests/LTP/math/__init__.py | 0 | ||||
-rw-r--r-- | tests/LTP/math/run_tests.py | 24 |
4 files changed, 154 insertions, 0 deletions
diff --git a/tests/LTP/__init__.py b/tests/LTP/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/LTP/__init__.py diff --git a/tests/LTP/agl_test_ltp_base.py b/tests/LTP/agl_test_ltp_base.py new file mode 100644 index 0000000..1e6eac9 --- /dev/null +++ b/tests/LTP/agl_test_ltp_base.py @@ -0,0 +1,130 @@ +import subprocess +import pathlib +import re + +import plugins.agl_test_conf as conf +from plugins.agl_test_base import AGLBaseTest + +class LTPBase(AGLBaseTest): + + LTPDIR = "/opt/ltp/" + RUNLTP = LTPDIR + "runltp" + LTPTEST = LTPDIR + "runtest/" + + #Test name without the prefix of "ltp/" + test_name: str + + def __init__(self, test_name: str): + self.test_name = test_name + super().__init__(name = ("ltp/" + test_name)) + + #Check and clean exit log + tmp_log_dir = self.get_temp_logdir() + "/log/" + log_file = tmp_log_dir + self.test_name + ".log" + log_path = pathlib.Path(log_file) + check_log_path = log_path.is_file() + if check_log_path: + subprocess.run("rm " + tmp_log_dir + "*", shell = True) + + def get_test_case_list(self): + case_list = list() + reObj = re.compile('^([\\w\-]+)(\\s+)(\\w+)', re.MULTILINE) + + test_file = self.LTPTEST + self.test_name + test_cases = open(test_file, 'r') + line = test_cases.readline() + while line: + matchs = reObj.search(line) + if matchs: + groups = matchs.groups() + case_list.append(groups[0]) + line = test_cases.readline() + + test_cases.close() + return case_list + + #Run test by runltp + def run_test_fun(self, case_name): + tmp_log_dir = self.get_temp_logdir() + "/log/" + run_test_cmd = self.RUNLTP + \ + " -f " + self.test_name + \ + " -s "+ "^" + case_name + "\\\\b" + \ + " -p " + \ + " -o " + tmp_log_dir + self.test_name + ".output " + \ + " -l " + tmp_log_dir + self.test_name + ".log " + \ + " -C " + tmp_log_dir + self.test_name + ".failed " + \ + " -T " + tmp_log_dir + self.test_name + ".tconf " + + console_log = tmp_log_dir + self.test_name + ".console" + + with open(console_log, 'a') as consolelog: + subprocess.run(run_test_cmd, shell = True, stdout = consolelog, + stderr = consolelog) + consolelog.close() + + def run_case(self, case_id): + case_info = self.get_caseinfo_by_name(case_id) + if (case_info[2] == ""): + if (case_info[1] == "PASS"): + case_info[2] = "passed" + elif (case_info[1] == "FAIL"): + case_info[2] = "failed" + elif (case_info[1] == "CONF"): + case_info[2] = "skipped" + else: + case_info[2] = "failed" + + self.update_caseinfo_by_name(case_id, case_info) + assert case_info[2] == "passed" or case_info[2] == "skipped" or case_info[2] == "xpassed" + + def precheck(self): + # Check for common + check_common = super().precheck() + + # Check for runltp script + runltp_script = pathlib.Path(self.RUNLTP) + check_runltp_script = runltp_script.is_file() + + # Check self test file + test_file = pathlib.Path(self.LTPTEST + self.test_name) + check_test_file = test_file.is_file() + + return check_common and check_runltp_script and check_test_file + + def log_process(self): + tmp_log_dir = conf.get_tmp_log_dir(self.name) + log_file = tmp_log_dir + self.test_name + ".log" + case_result = self.log_parser(log_file) + self.case_info_list[case_result[0]] = [case_result[0], case_result[2], ""] + + #Log sample: + #Testcase Result Exit Value + #-------- ------ ---------- + #cve-2011-0999 PASS 0 + #cve-2011-2183 CONF 32 + #cve-2011-2496 FAIL 1 + def log_parser(self, log_file): + reObj = re.compile('^(.+\\w+)( +)(PASS|CONF|FAIL)( +)(\\d+)', re.MULTILINE) + case_list = dict() + test_log = open(log_file, 'r') + + lines = test_log.readlines() + num = -1 + line = lines[num] + while line: + matchs = reObj.search(line) + + if matchs: + groups = matchs.groups() + test_log.close() + return groups + + num = num - 1 + line = lines[num] + + test_log.close() + + def run_ltp_test(self, case_name): + if(self.precheck() == True): + self.run_test_fun(case_name) + self.log_process() diff --git a/tests/LTP/math/__init__.py b/tests/LTP/math/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/LTP/math/__init__.py diff --git a/tests/LTP/math/run_tests.py b/tests/LTP/math/run_tests.py new file mode 100644 index 0000000..9f82915 --- /dev/null +++ b/tests/LTP/math/run_tests.py @@ -0,0 +1,24 @@ +import pytest + +from tests.LTP.agl_test_ltp_base import LTPBase + +class MathBase(LTPBase): + def __init__(self): + super().__init__(test_name="math") + +instance = MathBase() +test_case_list = instance.get_test_case_list() + +@pytest.fixture(scope='module') +def testbase(): + yield instance + #package log files and make report file + instance.log_report() + +@pytest.mark.parametrize('case_name', test_case_list) +def test_ltp_math(testbase: MathBase, case_name): + testbase.run_ltp_test(case_name) + testbase.run_case(case_name) + +if __name__ == '__main__': + pytest.main("-s run_tests") |