diff options
| -rw-r--r-- | meta/lib/oeqa/selftest/cases/glibc.py | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/meta/lib/oeqa/selftest/cases/glibc.py b/meta/lib/oeqa/selftest/cases/glibc.py new file mode 100644 index 0000000000..f836367094 --- /dev/null +++ b/meta/lib/oeqa/selftest/cases/glibc.py | |||
| @@ -0,0 +1,97 @@ | |||
| 1 | # SPDX-License-Identifier: MIT | ||
| 2 | import os | ||
| 3 | import contextlib | ||
| 4 | from oeqa.core.decorator import OETestTag | ||
| 5 | from oeqa.selftest.case import OESelftestTestCase | ||
| 6 | from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runqemu, Command | ||
| 7 | from oeqa.utils.nfs import unfs_server | ||
| 8 | |||
| 9 | def parse_values(content): | ||
| 10 | for i in content: | ||
| 11 | for v in ["PASS", "FAIL", "XPASS", "XFAIL", "UNRESOLVED", "UNSUPPORTED", "UNTESTED", "ERROR", "WARNING"]: | ||
| 12 | if i.startswith(v + ": "): | ||
| 13 | yield i[len(v) + 2:].strip(), v | ||
| 14 | break | ||
| 15 | |||
| 16 | @OETestTag("machine") | ||
| 17 | class GlibcSelfTest(OESelftestTestCase): | ||
| 18 | @classmethod | ||
| 19 | def setUpClass(cls): | ||
| 20 | super().setUpClass() | ||
| 21 | if not hasattr(cls.tc, "extraresults"): | ||
| 22 | cls.tc.extraresults = {} | ||
| 23 | |||
| 24 | if "ptestresult.sections" not in cls.tc.extraresults: | ||
| 25 | cls.tc.extraresults["ptestresult.sections"] = {} | ||
| 26 | |||
| 27 | def test_glibc(self): | ||
| 28 | self.glibc_run_check() | ||
| 29 | |||
| 30 | def glibc_run_check(self, ssh = None): | ||
| 31 | # configure ssh target | ||
| 32 | features = [] | ||
| 33 | if ssh is not None: | ||
| 34 | features.append('TOOLCHAIN_TEST_TARGET = "ssh"') | ||
| 35 | features.append('TOOLCHAIN_TEST_HOST = "{0}"'.format(ssh)) | ||
| 36 | features.append('TOOLCHAIN_TEST_HOST_USER = "root"') | ||
| 37 | features.append('TOOLCHAIN_TEST_HOST_PORT = "22"') | ||
| 38 | # force single threaded test execution | ||
| 39 | features.append('EGLIBCPARALLELISM_task-check_pn-glibc-testsuite = "PARALLELMFLAGS="-j1""') | ||
| 40 | self.write_config("\n".join(features)) | ||
| 41 | |||
| 42 | bitbake("glibc-testsuite -c check") | ||
| 43 | |||
| 44 | builddir = get_bb_var("B", "glibc-testsuite") | ||
| 45 | |||
| 46 | failed = 0 | ||
| 47 | self.tc.extraresults["ptestresult.sections"]["glibc"] = {} | ||
| 48 | with open(os.path.join(builddir, "tests.sum"), "r") as f: | ||
| 49 | for test, result in parse_values(f): | ||
| 50 | self.tc.extraresults["ptestresult.glibc.{}".format(test)] = {"status" : result} | ||
| 51 | if result == "FAIL": | ||
| 52 | self.logger.info("failed: '{}'".format(test)) | ||
| 53 | failed += 1 | ||
| 54 | self.assertEqual(failed, 0) | ||
| 55 | |||
| 56 | class GlibcSelfTestSystemEmulated(GlibcSelfTest): | ||
| 57 | default_installed_packages = [ | ||
| 58 | "glibc-charmaps", | ||
| 59 | "libgcc", | ||
| 60 | "libstdc++", | ||
| 61 | "libatomic", | ||
| 62 | "libgomp", | ||
| 63 | "python3", | ||
| 64 | "python3-pexpect", | ||
| 65 | "nfs-utils", | ||
| 66 | ] | ||
| 67 | |||
| 68 | def glibc_run_check(self): | ||
| 69 | with contextlib.ExitStack() as s: | ||
| 70 | # use the base work dir, as the nfs mount, since the recipe directory may not exist | ||
| 71 | tmpdir = get_bb_var("BASE_WORKDIR") | ||
| 72 | nfsport, mountport = s.enter_context(unfs_server(tmpdir)) | ||
| 73 | |||
| 74 | # build core-image-minimal with required packages | ||
| 75 | features = [] | ||
| 76 | features.append('IMAGE_FEATURES += "ssh-server-openssh"') | ||
| 77 | features.append('CORE_IMAGE_EXTRA_INSTALL += "{0}"'.format(" ".join(self.default_installed_packages))) | ||
| 78 | self.write_config("\n".join(features)) | ||
| 79 | bitbake("core-image-minimal") | ||
| 80 | |||
| 81 | # start runqemu | ||
| 82 | qemu = s.enter_context(runqemu("core-image-minimal", runqemuparams = "nographic")) | ||
| 83 | |||
| 84 | # validate that SSH is working | ||
| 85 | status, _ = qemu.run("uname") | ||
| 86 | self.assertEqual(status, 0) | ||
| 87 | |||
| 88 | # setup nfs mount | ||
| 89 | if qemu.run("mkdir -p \"{0}\"".format(tmpdir))[0] != 0: | ||
| 90 | raise Exception("Failed to setup NFS mount directory on target") | ||
| 91 | mountcmd = "mount -o noac,nfsvers=3,port={0},udp,mountport={1} \"{2}:{3}\" \"{3}\"".format(nfsport, mountport, qemu.server_ip, tmpdir) | ||
| 92 | status, output = qemu.run(mountcmd) | ||
| 93 | if status != 0: | ||
| 94 | raise Exception("Failed to setup NFS mount on target ({})".format(repr(output))) | ||
| 95 | |||
| 96 | super().glibc_run_check(ssh = qemu.ip) | ||
| 97 | |||
