diff options
Diffstat (limited to 'meta')
-rw-r--r-- | meta/lib/oeqa/selftest/cases/gcc.py | 107 |
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) + |