aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryanxk <yanxk.fnst@fujitsu.com>2022-09-03 16:24:32 +0800
committerXinkuan Yan <yanxk.fnst@fujitsu.com>2022-12-02 00:56:09 +0000
commit85e3c12681faca0519ca995a82feeb7709397ca2 (patch)
treeff4cff2addafab155353175e45b61e50a1840e52
parentef29f9077a89038525e20a517d972453f2cc4d62 (diff)
agl-test-framework: add test 'crashme'
'agl-test' modified, now, usr would not run dangerous tests like this 'crashme' unless they do self selection by '-m' pytest option. Set default to 'not dangerous'. a new marker 'dangerous' has been add to the pytest.ini. add new method into the agl_test_base.py, to help get path of the 'spec.json', this file help stress tests like 'crashme' to run under different stress levels. for run_tests.py, modifications focus on how to run 'crashme' under that different levels. new marker 'order' would always ensure this 'crashme' test to be placed as the so called 'last' test of all. Bug-AGL: SPEC-4345 Signed-off-by: yanxk <yanxk.fnst@fujitsu.com> Change-Id: Icb36d7c5c52430d89787f4373a2852b1b03ec8a6
-rwxr-xr-xagl-test18
-rw-r--r--plugins/agl_test_base.py3
-rw-r--r--pytest.ini1
-rw-r--r--tests/crashme/__init__.py0
-rw-r--r--tests/crashme/run_tests.py95
-rw-r--r--tests/crashme/spec.json20
6 files changed, 136 insertions, 1 deletions
diff --git a/agl-test b/agl-test
index 569784f..992fc8a 100755
--- a/agl-test
+++ b/agl-test
@@ -1,3 +1,19 @@
#!/bin/sh
+
cd /usr/AGL/agl-test/
-exec pytest "$@"
+
+# default stress level is low
+if [[ ! $STRESS_LEVEL ]]
+then
+ export STRESS_LEVEL="low"
+fi
+echo "STRESS_LEVEL: $STRESS_LEVEL"
+
+# default test without dangerous marker
+moption="-m "
+if [[ $* =~ ${moption} ]]
+then
+ exec pytest "$@"
+else
+ exec pytest "$@" -m "not dangerous"
+fi
diff --git a/plugins/agl_test_base.py b/plugins/agl_test_base.py
index 0e3a153..bd39335 100644
--- a/plugins/agl_test_base.py
+++ b/plugins/agl_test_base.py
@@ -29,6 +29,9 @@ class AGLBaseTest:
def get_workdir(self):
return conf.WORK_DIR + self.name + "/resource/"
+ def get_spec_path(self):
+ return conf.WORK_DIR + self.name + "/spec.json"
+
def append_one_caseinfo(name, value, status):
self.case_info_list[name] = [name, value, status]
diff --git a/pytest.ini b/pytest.ini
index e7d8505..0336017 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -5,3 +5,4 @@ cache_dir = /var/run/agl-test/.pytest_cache
markers =
oss_default: default test suites of OSS like rpm, etc.
+ dangerous: dangerous tests, might crash the platform.
diff --git a/tests/crashme/__init__.py b/tests/crashme/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/crashme/__init__.py
diff --git a/tests/crashme/run_tests.py b/tests/crashme/run_tests.py
new file mode 100644
index 0000000..93f62cd
--- /dev/null
+++ b/tests/crashme/run_tests.py
@@ -0,0 +1,95 @@
+import pytest
+import subprocess
+import pathlib
+import os
+import json
+
+from plugins.agl_test_base import AGLBaseTest
+
+class CrashmeBase(AGLBaseTest):
+ def __init__(self):
+ super().__init__(name="crashme")
+
+ def setup_runtest_params(self):
+ # Get env 'STRESS_LEVEL'
+ env_dist=os.environ
+ local_stress_level = str(env_dist.get("STRESS_LEVEL"))
+
+ # If not set correctly or just not set, set default to "low"
+ if local_stress_level not in ("low", "mid", "high"):
+ local_stress_level = "low"
+
+ # Read dictionary data out of spec.json
+ spec_file_location = self.get_spec_path()
+ fp = open(spec_file_location, 'r')
+
+ json_data = fp.read()
+ spec_dict = json.loads(json_data)
+
+ dict_key="stress_level_" + str(local_stress_level)
+
+ local_param_nbytes = spec_dict[dict_key]['NBYTES']
+ local_param_srand = spec_dict[dict_key]['SRAND']
+ local_param_ntries = spec_dict[dict_key]['NTRIES']
+ local_param_nsub = spec_dict[dict_key]['NSUB']
+
+ param_string = str(local_param_nbytes) + ' ' \
+ + str(local_param_srand) + ' ' \
+ + str(local_param_ntries) + ' ' \
+ + str(local_param_nsub)
+
+ return param_string
+
+ def run_test_fun(self):
+ log_file = self.get_logfile()
+ cwd_buf = self.get_temp_logdir()
+ oss_workdir = self.get_workdir()
+ runtest_param_buf = self.setup_runtest_params()
+
+ run_test_cmd = oss_workdir + 'crashme ' + runtest_param_buf + \
+ ' | grep "^Test complete\\|^exit status\\|' + \
+ '^child_kill_count\\|[.]\\{3\\}\\|^Number of distinct cases"'
+
+ with open(log_file, 'w') as log_f:
+ run_test_crashme = subprocess.run(run_test_cmd, shell=True,
+ cwd=cwd_buf, stdout=log_f, stderr=subprocess.DEVNULL)
+ log_f.close()
+
+ if (run_test_crashme.returncode == 0):
+ self.case_info_list = {'test_crashme':
+ ['test_crashme', str(run_test_crashme.returncode), 'passed']}
+ else:
+ self.case_info_list = {'test_crashme':
+ ['test_crashme', str(run_test_crashme.returncode), 'failed']}
+
+ def precheck(self):
+ test_file_location = self.get_workdir() + "/crashme"
+ path_checker = pathlib.Path(test_file_location)
+ return super().precheck() and path_checker.is_file()
+
+@pytest.fixture(scope='module')
+def testbase():
+ #init instance for test
+ instance = CrashmeBase()
+
+ #run test scripts
+ instance.run_test_fun()
+
+ yield instance
+
+ #package log files and make report file
+ instance.log_report()
+
+def precheck():
+ instance = CrashmeBase()
+ return instance.precheck()
+skip_msg = "The current environment does not match the test requirements."
+pytestmark = pytest.mark.skipif(precheck() == False, reason = skip_msg)
+
+@pytest.mark.dangerous
+@pytest.mark.order("last")
+def test_crashme(testbase: CrashmeBase):
+ assert testbase.case_info_list['test_crashme'][1] == '0'
+
+if __name__ == '__main__':
+ pytest.main("-s run_tests")
diff --git a/tests/crashme/spec.json b/tests/crashme/spec.json
new file mode 100644
index 0000000..0d47b8c
--- /dev/null
+++ b/tests/crashme/spec.json
@@ -0,0 +1,20 @@
+{
+ "stress_level_low": {
+ "NBYTES": "+2000",
+ "SRAND": "666",
+ "NTRIES": "100",
+ "NSUB": "00:15:00"
+ },
+ "stress_level_mid": {
+ "NBYTES": "+3000",
+ "SRAND": "666",
+ "NTRIES": "150",
+ "NSUB": "00:30:00"
+ },
+ "stress_level_high": {
+ "NBYTES": "+8000",
+ "SRAND": "666",
+ "NTRIES": "800",
+ "NSUB": "01:00:00"
+ }
+}