1*4882a593Smuzhiyun# SPDX-License-Identifier: MIT 2*4882a593Smuzhiyunimport os 3*4882a593Smuzhiyunfrom oeqa.core.decorator import OETestTag 4*4882a593Smuzhiyunfrom oeqa.core.case import OEPTestResultTestCase 5*4882a593Smuzhiyunfrom oeqa.selftest.case import OESelftestTestCase 6*4882a593Smuzhiyunfrom oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runqemu 7*4882a593Smuzhiyun 8*4882a593Smuzhiyundef parse_values(content): 9*4882a593Smuzhiyun for i in content: 10*4882a593Smuzhiyun for v in ["PASS", "FAIL", "XPASS", "XFAIL", "UNRESOLVED", "UNSUPPORTED", "UNTESTED", "ERROR", "WARNING"]: 11*4882a593Smuzhiyun if i.startswith(v + ": "): 12*4882a593Smuzhiyun yield i[len(v) + 2:].strip(), v 13*4882a593Smuzhiyun break 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunclass GccSelfTestBase(OESelftestTestCase, OEPTestResultTestCase): 16*4882a593Smuzhiyun def check_skip(self, suite): 17*4882a593Smuzhiyun targets = get_bb_var("RUNTIMETARGET", "gcc-runtime").split() 18*4882a593Smuzhiyun if suite not in targets: 19*4882a593Smuzhiyun self.skipTest("Target does not use {0}".format(suite)) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun def run_check(self, *suites, ssh = None): 22*4882a593Smuzhiyun targets = set() 23*4882a593Smuzhiyun for s in suites: 24*4882a593Smuzhiyun if s == "gcc": 25*4882a593Smuzhiyun targets.add("check-gcc-c") 26*4882a593Smuzhiyun elif s == "g++": 27*4882a593Smuzhiyun targets.add("check-gcc-c++") 28*4882a593Smuzhiyun else: 29*4882a593Smuzhiyun targets.add("check-target-{}".format(s)) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun # configure ssh target 32*4882a593Smuzhiyun features = [] 33*4882a593Smuzhiyun features.append('MAKE_CHECK_TARGETS = "{0}"'.format(" ".join(targets))) 34*4882a593Smuzhiyun if ssh is not None: 35*4882a593Smuzhiyun features.append('TOOLCHAIN_TEST_TARGET = "ssh"') 36*4882a593Smuzhiyun features.append('TOOLCHAIN_TEST_HOST = "{0}"'.format(ssh)) 37*4882a593Smuzhiyun features.append('TOOLCHAIN_TEST_HOST_USER = "root"') 38*4882a593Smuzhiyun features.append('TOOLCHAIN_TEST_HOST_PORT = "22"') 39*4882a593Smuzhiyun self.write_config("\n".join(features)) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun recipe = "gcc-runtime" 42*4882a593Smuzhiyun bitbake("{} -c check".format(recipe)) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun bb_vars = get_bb_vars(["B", "TARGET_SYS"], recipe) 45*4882a593Smuzhiyun builddir, target_sys = bb_vars["B"], bb_vars["TARGET_SYS"] 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun for suite in suites: 48*4882a593Smuzhiyun sumspath = os.path.join(builddir, "gcc", "testsuite", suite, "{0}.sum".format(suite)) 49*4882a593Smuzhiyun if not os.path.exists(sumspath): # check in target dirs 50*4882a593Smuzhiyun sumspath = os.path.join(builddir, target_sys, suite, "testsuite", "{0}.sum".format(suite)) 51*4882a593Smuzhiyun if not os.path.exists(sumspath): # handle libstdc++-v3 -> libstdc++ 52*4882a593Smuzhiyun sumspath = os.path.join(builddir, target_sys, suite, "testsuite", "{0}.sum".format(suite.split("-")[0])) 53*4882a593Smuzhiyun logpath = os.path.splitext(sumspath)[0] + ".log" 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun ptestsuite = "gcc-{}".format(suite) if suite != "gcc" else suite 56*4882a593Smuzhiyun ptestsuite = ptestsuite + "-user" if ssh is None else ptestsuite 57*4882a593Smuzhiyun self.ptest_section(ptestsuite, logfile = logpath) 58*4882a593Smuzhiyun with open(sumspath, "r") as f: 59*4882a593Smuzhiyun for test, result in parse_values(f): 60*4882a593Smuzhiyun self.ptest_result(ptestsuite, test, result) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun def run_check_emulated(self, *args, **kwargs): 63*4882a593Smuzhiyun # build core-image-minimal with required packages 64*4882a593Smuzhiyun default_installed_packages = ["libgcc", "libstdc++", "libatomic", "libgomp"] 65*4882a593Smuzhiyun features = [] 66*4882a593Smuzhiyun features.append('IMAGE_FEATURES += "ssh-server-openssh"') 67*4882a593Smuzhiyun features.append('CORE_IMAGE_EXTRA_INSTALL += "{0}"'.format(" ".join(default_installed_packages))) 68*4882a593Smuzhiyun self.write_config("\n".join(features)) 69*4882a593Smuzhiyun bitbake("core-image-minimal") 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun # wrap the execution with a qemu instance 72*4882a593Smuzhiyun with runqemu("core-image-minimal", runqemuparams = "nographic") as qemu: 73*4882a593Smuzhiyun # validate that SSH is working 74*4882a593Smuzhiyun status, _ = qemu.run("uname") 75*4882a593Smuzhiyun self.assertEqual(status, 0) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun return self.run_check(*args, ssh=qemu.ip, **kwargs) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun@OETestTag("toolchain-user") 80*4882a593Smuzhiyunclass GccCrossSelfTest(GccSelfTestBase): 81*4882a593Smuzhiyun def test_cross_gcc(self): 82*4882a593Smuzhiyun self.run_check("gcc") 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun@OETestTag("toolchain-user") 85*4882a593Smuzhiyunclass GxxCrossSelfTest(GccSelfTestBase): 86*4882a593Smuzhiyun def test_cross_gxx(self): 87*4882a593Smuzhiyun self.run_check("g++") 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun@OETestTag("toolchain-user") 90*4882a593Smuzhiyunclass GccLibAtomicSelfTest(GccSelfTestBase): 91*4882a593Smuzhiyun def test_libatomic(self): 92*4882a593Smuzhiyun self.run_check("libatomic") 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun@OETestTag("toolchain-user") 95*4882a593Smuzhiyunclass GccLibGompSelfTest(GccSelfTestBase): 96*4882a593Smuzhiyun def test_libgomp(self): 97*4882a593Smuzhiyun self.run_check("libgomp") 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun@OETestTag("toolchain-user") 100*4882a593Smuzhiyunclass GccLibStdCxxSelfTest(GccSelfTestBase): 101*4882a593Smuzhiyun def test_libstdcxx(self): 102*4882a593Smuzhiyun self.run_check("libstdc++-v3") 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun@OETestTag("toolchain-user") 105*4882a593Smuzhiyunclass GccLibSspSelfTest(GccSelfTestBase): 106*4882a593Smuzhiyun def test_libssp(self): 107*4882a593Smuzhiyun self.check_skip("libssp") 108*4882a593Smuzhiyun self.run_check("libssp") 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun@OETestTag("toolchain-user") 111*4882a593Smuzhiyunclass GccLibItmSelfTest(GccSelfTestBase): 112*4882a593Smuzhiyun def test_libitm(self): 113*4882a593Smuzhiyun self.check_skip("libitm") 114*4882a593Smuzhiyun self.run_check("libitm") 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun@OETestTag("toolchain-system") 117*4882a593Smuzhiyun@OETestTag("runqemu") 118*4882a593Smuzhiyunclass GccCrossSelfTestSystemEmulated(GccSelfTestBase): 119*4882a593Smuzhiyun def test_cross_gcc(self): 120*4882a593Smuzhiyun self.run_check_emulated("gcc") 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun@OETestTag("toolchain-system") 123*4882a593Smuzhiyun@OETestTag("runqemu") 124*4882a593Smuzhiyunclass GxxCrossSelfTestSystemEmulated(GccSelfTestBase): 125*4882a593Smuzhiyun def test_cross_gxx(self): 126*4882a593Smuzhiyun self.run_check_emulated("g++") 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun@OETestTag("toolchain-system") 129*4882a593Smuzhiyun@OETestTag("runqemu") 130*4882a593Smuzhiyunclass GccLibAtomicSelfTestSystemEmulated(GccSelfTestBase): 131*4882a593Smuzhiyun def test_libatomic(self): 132*4882a593Smuzhiyun self.run_check_emulated("libatomic") 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun@OETestTag("toolchain-system") 135*4882a593Smuzhiyun@OETestTag("runqemu") 136*4882a593Smuzhiyunclass GccLibGompSelfTestSystemEmulated(GccSelfTestBase): 137*4882a593Smuzhiyun def test_libgomp(self): 138*4882a593Smuzhiyun self.run_check_emulated("libgomp") 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun@OETestTag("toolchain-system") 141*4882a593Smuzhiyun@OETestTag("runqemu") 142*4882a593Smuzhiyunclass GccLibStdCxxSelfTestSystemEmulated(GccSelfTestBase): 143*4882a593Smuzhiyun def test_libstdcxx(self): 144*4882a593Smuzhiyun self.run_check_emulated("libstdc++-v3") 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun@OETestTag("toolchain-system") 147*4882a593Smuzhiyun@OETestTag("runqemu") 148*4882a593Smuzhiyunclass GccLibSspSelfTestSystemEmulated(GccSelfTestBase): 149*4882a593Smuzhiyun def test_libssp(self): 150*4882a593Smuzhiyun self.check_skip("libssp") 151*4882a593Smuzhiyun self.run_check_emulated("libssp") 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun@OETestTag("toolchain-system") 154*4882a593Smuzhiyun@OETestTag("runqemu") 155*4882a593Smuzhiyunclass GccLibItmSelfTestSystemEmulated(GccSelfTestBase): 156*4882a593Smuzhiyun def test_libitm(self): 157*4882a593Smuzhiyun self.check_skip("libitm") 158*4882a593Smuzhiyun self.run_check_emulated("libitm") 159*4882a593Smuzhiyun 160