summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorNathan Rossi <nathan@nathanrossi.com>2019-08-28 05:06:29 +0000
committerArmin Kuster <akuster808@gmail.com>2019-08-30 15:29:47 -0700
commit3d46edf2be5c65338f06b287dd11e926b993ae92 (patch)
tree7228eb02b453ea80c96eecadd1c35c5ef8df5036 /meta
parent52975edf78ebbb4ef3e8ebdb8f78c1a0b3bc7353 (diff)
downloadopenembedded-core-contrib-3d46edf2be5c65338f06b287dd11e926b993ae92.tar.gz
oeqa/selftest/gcc: Create selftest case for gcc test suite
Create a oeqa selftest test case to execute the gcc test suites and report the results. The results are populated into the extraresults variable of the test case which are written to testresults.json for resulttool to analyse. An additional subclass is created to separate the execution with qemu linux-user and qemu system. The GccSelfTestSystemEmulated test case handles setup of the target image as well as execution with runqemu. Signed-off-by: Nathan Rossi <nathan@nathanrossi.com> Signed-off-by: Armin Kuster <akuster808@gmail.com>
Diffstat (limited to 'meta')
-rw-r--r--meta/lib/oeqa/selftest/cases/gcc.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/meta/lib/oeqa/selftest/cases/gcc.py b/meta/lib/oeqa/selftest/cases/gcc.py
new file mode 100644
index 0000000000..c36637d066
--- /dev/null
+++ b/meta/lib/oeqa/selftest/cases/gcc.py
@@ -0,0 +1,107 @@
+# SPDX-License-Identifier: MIT
+import os
+from oeqa.selftest.case import OESelftestTestCase
+from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runqemu, Command
+
+def parse_values(content):
+ for i in content:
+ for v in ["PASS", "FAIL", "XPASS", "XFAIL", "UNRESOLVED", "UNSUPPORTED", "UNTESTED", "ERROR", "WARNING"]:
+ if i.startswith(v + ": "):
+ yield i[len(v) + 2:].strip(), v
+ break
+
+class GccSelfTest(OESelftestTestCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ if not hasattr(cls.tc, "extraresults"):
+ cls.tc.extraresults = {}
+
+ def gcc_runtime_check_skip(self, suite):
+ targets = get_bb_var("RUNTIMETARGET", "gcc-runtime").split()
+ if suite not in targets:
+ self.skipTest("Target does not use {0}".format(suite))
+
+ def test_cross_gcc(self):
+ self.gcc_cross_run_check("gcc")
+
+ def test_cross_gxx(self):
+ self.gcc_cross_run_check("g++")
+
+ def test_gcc_runtime_libatomic(self):
+ self.gcc_runtime_run_check("libatomic")
+
+ def test_gcc_runtime_libgomp(self):
+ self.gcc_runtime_run_check("libgomp")
+
+ def test_gcc_runtime_libstdcxx(self):
+ self.gcc_runtime_run_check("libstdc++-v3")
+
+ def test_gcc_runtime_libssp(self):
+ self.gcc_runtime_check_skip("libssp")
+ self.gcc_runtime_run_check("libssp")
+
+ def test_gcc_runtime_libitm(self):
+ self.gcc_runtime_check_skip("libitm")
+ self.gcc_runtime_run_check("libitm")
+
+ def gcc_cross_run_check(self, suite):
+ return self.gcc_run_check("gcc-cross-{0}".format(get_bb_var("TUNE_ARCH")), suite)
+
+ def gcc_runtime_run_check(self, suite):
+ return self.gcc_run_check("gcc-runtime", suite, target_prefix = "check-target-")
+
+ def gcc_run_check(self, recipe, suite, target_prefix = "check-", ssh = None):
+ target = target_prefix + suite.replace("gcc", "gcc").replace("g++", "c++")
+
+ # configure ssh target
+ features = []
+ features.append('MAKE_CHECK_TARGETS = "{0}"'.format(target))
+ if ssh is not None:
+ features.append('BUILD_TEST_TARGET = "ssh"')
+ features.append('BUILD_TEST_HOST = "{0}"'.format(ssh))
+ features.append('BUILD_TEST_HOST_USER = "root"')
+ features.append('BUILD_TEST_HOST_PORT = "22"')
+ self.write_config("\n".join(features))
+
+ bitbake("{0} -c check".format(recipe))
+
+ bb_vars = get_bb_vars(["TUNE_ARCH", "B", "TARGET_SYS"], recipe)
+ tune_arch, builddir, target_sys = bb_vars["TUNE_ARCH"], bb_vars["B"], bb_vars["TARGET_SYS"]
+
+ sumspath = os.path.join(builddir, "gcc", "testsuite", suite, "{0}.sum".format(suite))
+ if not os.path.exists(sumspath): # check in target dirs
+ sumspath = os.path.join(builddir, target_sys, suite, "testsuite", "{0}.sum".format(suite))
+ if not os.path.exists(sumspath): # handle libstdc++-v3 -> libstdc++
+ sumspath = os.path.join(builddir, target_sys, suite, "testsuite", "{0}.sum".format(suite.split("-")[0]))
+
+ failed = 0
+ with open(sumspath, "r") as f:
+ for test, result in parse_values(f):
+ self.tc.extraresults["{}.{}.{}".format(type(self).__name__, suite, test)] = {"status" : result}
+ if result == "FAIL":
+ self.logger.info("failed: '{}'".format(test))
+ failed += 1
+ self.assertEqual(failed, 0)
+
+class GccSelfTestSystemEmulated(GccSelfTest):
+ default_installed_packages = ["libgcc", "libstdc++", "libatomic", "libgomp"]
+
+ def gcc_run_check(self, *args, **kwargs):
+ tune_arch = get_bb_var("TUNE_ARCH")
+
+ # build core-image-minimal with required packages
+ features = []
+ features.append('IMAGE_FEATURES += "ssh-server-openssh"')
+ features.append('CORE_IMAGE_EXTRA_INSTALL += "{0}"'.format(" ".join(self.default_installed_packages)))
+ self.write_config("\n".join(features))
+ bitbake("core-image-minimal")
+
+ # wrap the execution with a qemu instance
+ with runqemu("core-image-minimal", runqemuparams = "nographic") as qemu:
+ # validate that SSH is working
+ status, _ = qemu.run("uname")
+ self.assertEqual(status, 0)
+
+ return super().gcc_run_check(*args, **kwargs, ssh = qemu.ip)
+