| # SPDX-License-Identifier: MIT |
| import os |
| import subprocess |
| import time |
| from oeqa.core.decorator import OETestTag |
| from oeqa.core.case import OEPTestResultTestCase |
| from oeqa.selftest.case import OESelftestTestCase |
| from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars, runqemu, Command |
| from oeqa.utils.sshcontrol import SSHControl |
| |
| def parse_results(filename): |
| tests = {} |
| with open(filename, "r") as f: |
| lines = f.readlines() |
| for line in lines: |
| if "..." in line and "test [" in line: |
| test = line.split("test ")[1].split(" ... ")[0] |
| if "] " in test: |
| test = test.split("] ", 1)[1] |
| result = line.split(" ... ")[1].strip() |
| if result == "ok": |
| result = "PASS" |
| elif result == "failed": |
| result = "FAIL" |
| elif "ignored" in result: |
| result = "SKIPPED" |
| if test in tests: |
| if tests[test] != result: |
| print("Duplicate and mismatching result %s for %s" % (result, test)) |
| else: |
| print("Duplicate result %s for %s" % (result, test)) |
| else: |
| tests[test] = result |
| return tests |
| |
| # Total time taken for testing is of about 2hr 20min, with PARALLEL_MAKE set to 40 number of jobs. |
| @OETestTag("toolchain-system") |
| @OETestTag("toolchain-user") |
| @OETestTag("runqemu") |
| class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase): |
| def test_rust(self, *args, **kwargs): |
| # Disable Rust Oe-selftest |
| self.skipTest("The Rust Oe-selftest is disabled.") |
| |
| # build remote-test-server before image build |
| recipe = "rust" |
| start_time = time.time() |
| bitbake("{} -c test_compile".format(recipe)) |
| builddir = get_bb_var("RUSTSRC", "rust") |
| # build core-image-minimal with required packages |
| default_installed_packages = ["libgcc", "libstdc++", "libatomic", "libgomp"] |
| features = [] |
| features.append('IMAGE_FEATURES += "ssh-server-dropbear"') |
| features.append('CORE_IMAGE_EXTRA_INSTALL += "{0}"'.format(" ".join(default_installed_packages))) |
| self.write_config("\n".join(features)) |
| bitbake("core-image-minimal") |
| |
| # Exclude the test folders that error out while building |
| # TODO: Fix the errors and include them for testing |
| # no-fail-fast: Run all tests regardless of failure. |
| # bless: First runs rustfmt to format the codebase, |
| # then runs tidy checks. |
| exclude_list = [ |
| 'compiler/rustc', |
| 'compiler/rustc_interface/src/tests.rs', |
| 'library/panic_abort', |
| 'library/panic_unwind', |
| 'library/test/src/stats/tests.rs', |
| 'src/bootstrap/builder/tests.rs', |
| 'src/doc/rustc', |
| 'src/doc/rustdoc', |
| 'src/doc/unstable-book', |
| 'src/librustdoc', |
| 'src/rustdoc-json-types', |
| 'src/tools/compiletest/src/common.rs', |
| 'src/tools/lint-docs', |
| 'src/tools/rust-analyzer', |
| 'src/tools/rustdoc-themes', |
| 'src/tools/tidy', |
| 'tests/assembly/asm/aarch64-outline-atomics.rs', |
| 'tests/codegen/abi-main-signature-32bit-c-int.rs', |
| 'tests/codegen/abi-repr-ext.rs', |
| 'tests/codegen/abi-x86-interrupt.rs', |
| 'tests/codegen/branch-protection.rs', |
| 'tests/codegen/catch-unwind.rs', |
| 'tests/codegen/cf-protection.rs', |
| 'tests/codegen/enum-bounds-check-derived-idx.rs', |
| 'tests/codegen/force-unwind-tables.rs', |
| 'tests/codegen/intrinsic-no-unnamed-attr.rs', |
| 'tests/codegen/issues/issue-103840.rs', |
| 'tests/codegen/issues/issue-47278.rs', |
| 'tests/codegen/issues/issue-73827-bounds-check-index-in-subexpr.rs', |
| 'tests/codegen/lifetime_start_end.rs', |
| 'tests/codegen/local-generics-in-exe-internalized.rs', |
| 'tests/codegen/match-unoptimized.rs', |
| 'tests/codegen/noalias-rwlockreadguard.rs', |
| 'tests/codegen/non-terminate/nonempty-infinite-loop.rs', |
| 'tests/codegen/noreturn-uninhabited.rs', |
| 'tests/codegen/repr-transparent-aggregates-3.rs', |
| 'tests/codegen/sse42-implies-crc32.rs', |
| 'tests/codegen/thread-local.rs', |
| 'tests/codegen/uninit-consts.rs', |
| 'tests/pretty/raw-str-nonexpr.rs', |
| 'tests/run-make', |
| 'tests/run-make/cdylib-fewer-symbols/foo.rs', |
| 'tests/run-make/doctests-keep-binaries/t.rs', |
| 'tests/run-make-fulldeps', |
| 'tests/run-make/issue-22131/foo.rs', |
| 'tests/run-make/issue-36710/Makefile', |
| 'tests/run-make/issue-47551', |
| 'tests/run-make/pgo-branch-weights', |
| 'tests/run-make/pgo-gen', |
| 'tests/run-make/pgo-gen-lto', |
| 'tests/run-make/pgo-indirect-call-promotion', |
| 'tests/run-make/pgo-use', |
| 'tests/run-make/pointer-auth-link-with-c/Makefile', |
| 'tests/run-make/profile', |
| 'tests/run-make/static-pie', |
| 'tests/run-make/sysroot-crates-are-unstable', |
| 'tests/run-make/target-specs', |
| 'tests/rustdoc', |
| 'tests/rustdoc/async-move-doctest.rs', |
| 'tests/rustdoc/async-trait.rs', |
| 'tests/rustdoc/auto-traits.rs', |
| 'tests/rustdoc/check-source-code-urls-to-def.rs', |
| 'tests/rustdoc/comment-in-doctest.rs', |
| 'tests/rustdoc/const-generics/const-generics-docs.rs', |
| 'tests/rustdoc/cross-crate-hidden-assoc-trait-items.rs', |
| 'tests/rustdoc/cross-crate-hidden-impl-parameter.rs', |
| 'tests/rustdoc/cross-crate-links.rs', |
| 'tests/rustdoc/cross-crate-primitive-doc.rs', |
| 'tests/rustdoc/doctest-manual-crate-name.rs', |
| 'tests/rustdoc/edition-doctest.rs', |
| 'tests/rustdoc/edition-flag.rs', |
| 'tests/rustdoc/elided-lifetime.rs', |
| 'tests/rustdoc/external-macro-src.rs', |
| 'tests/rustdoc/extern-html-root-url.rs', |
| 'tests/rustdoc/extern-impl-trait.rs', |
| 'tests/rustdoc/hide-unstable-trait.rs', |
| 'tests/rustdoc/inline_cross/add-docs.rs', |
| 'tests/rustdoc/inline_cross/default-trait-method.rs', |
| 'tests/rustdoc/inline_cross/dyn_trait.rs', |
| 'tests/rustdoc/inline_cross/impl_trait.rs', |
| 'tests/rustdoc/inline_cross/issue-24183.rs', |
| 'tests/rustdoc/inline_cross/macros.rs', |
| 'tests/rustdoc/inline_cross/trait-vis.rs', |
| 'tests/rustdoc/inline_cross/use_crate.rs', |
| 'tests/rustdoc/intra-doc-crate/self.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/additional_doc.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/basic.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/crate.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/hidden.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/macro.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/module.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/submodule-inner.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/submodule-outer.rs', |
| 'tests/rustdoc/intra-doc/cross-crate/traits.rs', |
| 'tests/rustdoc/intra-doc/extern-builtin-type-impl.rs', |
| 'tests/rustdoc/intra-doc/extern-crate-only-used-in-link.rs', |
| 'tests/rustdoc/intra-doc/extern-crate.rs', |
| 'tests/rustdoc/intra-doc/extern-inherent-impl.rs', |
| 'tests/rustdoc/intra-doc/extern-reference-link.rs', |
| 'tests/rustdoc/intra-doc/issue-103463.rs', |
| 'tests/rustdoc/intra-doc/issue-104145.rs', |
| 'tests/rustdoc/intra-doc/issue-66159.rs', |
| 'tests/rustdoc/intra-doc/pub-use.rs', |
| 'tests/rustdoc/intra-doc/reexport-additional-docs.rs', |
| 'tests/rustdoc/issue-18199.rs', |
| 'tests/rustdoc/issue-23106.rs', |
| 'tests/rustdoc/issue-23744.rs', |
| 'tests/rustdoc/issue-25944.rs', |
| 'tests/rustdoc/issue-30252.rs', |
| 'tests/rustdoc/issue-38129.rs', |
| 'tests/rustdoc/issue-40936.rs', |
| 'tests/rustdoc/issue-43153.rs', |
| 'tests/rustdoc/issue-46727.rs', |
| 'tests/rustdoc/issue-48377.rs', |
| 'tests/rustdoc/issue-48414.rs', |
| 'tests/rustdoc/issue-53689.rs', |
| 'tests/rustdoc/issue-54478-demo-allocator.rs', |
| 'tests/rustdoc/issue-57180.rs', |
| 'tests/rustdoc/issue-61592.rs', |
| 'tests/rustdoc/issue-73061-cross-crate-opaque-assoc-type.rs', |
| 'tests/rustdoc/issue-75588.rs', |
| 'tests/rustdoc/issue-85454.rs', |
| 'tests/rustdoc/issue-86620.rs', |
| 'tests/rustdoc-json', |
| 'tests/rustdoc-js-std', |
| 'tests/rustdoc/macro_pub_in_module.rs', |
| 'tests/rustdoc/masked.rs', |
| 'tests/rustdoc/normalize-assoc-item.rs', |
| 'tests/rustdoc/no-stack-overflow-25295.rs', |
| 'tests/rustdoc/primitive-reexport.rs', |
| 'tests/rustdoc/process-termination.rs', |
| 'tests/rustdoc/pub-extern-crate.rs', |
| 'tests/rustdoc/pub-use-extern-macros.rs', |
| 'tests/rustdoc/reexport-check.rs', |
| 'tests/rustdoc/reexport-dep-foreign-fn.rs', |
| 'tests/rustdoc/reexport-doc.rs', |
| 'tests/rustdoc/reexports-priv.rs', |
| 'tests/rustdoc/reexports.rs', |
| 'tests/rustdoc/rustc,-incoherent-impls.rs', |
| 'tests/rustdoc/test_option_check/bar.rs', |
| 'tests/rustdoc/test_option_check/test.rs', |
| 'tests/rustdoc/trait-alias-mention.rs', |
| 'tests/rustdoc/trait-visibility.rs', |
| 'tests/rustdoc-ui/cfg-test.rs', |
| 'tests/rustdoc-ui/check-cfg-test.rs', |
| 'tests/rustdoc-ui/display-output.rs', |
| 'tests/rustdoc-ui/doc-comment-multi-line-attr.rs', |
| 'tests/rustdoc-ui/doc-comment-multi-line-cfg-attr.rs', |
| 'tests/rustdoc-ui/doc-test-doctest-feature.rs', |
| 'tests/rustdoc-ui/doctest-multiline-crate-attribute.rs', |
| 'tests/rustdoc-ui/doctest-output.rs', |
| 'tests/rustdoc-ui/doc-test-rustdoc-feature.rs', |
| 'tests/rustdoc-ui/failed-doctest-compile-fail.rs', |
| 'tests/rustdoc-ui/issue-80992.rs', |
| 'tests/rustdoc-ui/issue-91134.rs', |
| 'tests/rustdoc-ui/nocapture-fail.rs', |
| 'tests/rustdoc-ui/nocapture.rs', |
| 'tests/rustdoc-ui/no-run-flag.rs', |
| 'tests/rustdoc-ui/run-directory.rs', |
| 'tests/rustdoc-ui/test-no_std.rs', |
| 'tests/rustdoc-ui/test-type.rs', |
| 'tests/rustdoc/unit-return.rs', |
| 'tests/ui/abi/stack-probes-lto.rs', |
| 'tests/ui/abi/stack-probes.rs', |
| 'tests/ui/array-slice-vec/subslice-patterns-const-eval-match.rs', |
| 'tests/ui/asm/x86_64/sym.rs', |
| 'tests/ui/associated-type-bounds/fn-apit.rs', |
| 'tests/ui/associated-type-bounds/fn-dyn-apit.rs', |
| 'tests/ui/associated-type-bounds/fn-wrap-apit.rs', |
| 'tests/ui/debuginfo/debuginfo-emit-llvm-ir-and-split-debuginfo.rs', |
| 'tests/ui/drop/dynamic-drop.rs', |
| 'tests/ui/empty_global_asm.rs', |
| 'tests/ui-fulldeps/deriving-encodable-decodable-box.rs', |
| 'tests/ui-fulldeps/deriving-encodable-decodable-cell-refcell.rs', |
| 'tests/ui-fulldeps/deriving-global.rs', |
| 'tests/ui-fulldeps/deriving-hygiene.rs', |
| 'tests/ui-fulldeps/dropck_tarena_sound_drop.rs', |
| 'tests/ui-fulldeps/empty-struct-braces-derive.rs', |
| 'tests/ui-fulldeps/internal-lints/bad_opt_access.rs', |
| 'tests/ui-fulldeps/internal-lints/bad_opt_access.stderr', |
| 'tests/ui-fulldeps/internal-lints/default_hash_types.rs', |
| 'tests/ui-fulldeps/internal-lints/diagnostics.rs', |
| 'tests/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs', |
| 'tests/ui-fulldeps/internal-lints/qualified_ty_ty_ctxt.rs', |
| 'tests/ui-fulldeps/internal-lints/query_stability.rs', |
| 'tests/ui-fulldeps/internal-lints/rustc_pass_by_value.rs', |
| 'tests/ui-fulldeps/internal-lints/ty_tykind_usage.rs', |
| 'tests/ui-fulldeps/issue-14021.rs', |
| 'tests/ui-fulldeps/lint-group-denied-lint-allowed.rs', |
| 'tests/ui-fulldeps/lint-group-forbid-always-trumps-cli.rs', |
| 'tests/ui-fulldeps/lint-pass-macros.rs', |
| 'tests/ui-fulldeps/regions-mock-tcx.rs', |
| 'tests/ui-fulldeps/rustc_encodable_hygiene.rs', |
| 'tests/ui-fulldeps/session-diagnostic/enforce_slug_naming.rs', |
| 'tests/ui/functions-closures/fn-help-with-err.rs', |
| 'tests/ui/linkage-attr/issue-10755.rs', |
| 'tests/ui/macros/restricted-shadowing-legacy.rs', |
| 'tests/ui/process/nofile-limit.rs', |
| 'tests/ui/process/process-panic-after-fork.rs', |
| 'tests/ui/process/process-sigpipe.rs', |
| 'tests/ui/simd/target-feature-mixup.rs', |
| 'tests/ui/structs-enums/multiple-reprs.rs' |
| ] |
| |
| exclude_fail_tests = " ".join([" --exclude " + item for item in exclude_list]) |
| # Add exclude_fail_tests with other test arguments |
| testargs = exclude_fail_tests + " --doc --no-fail-fast --bless" |
| |
| # wrap the execution with a qemu instance. |
| # Tests are run with 512 tasks in parallel to execute all tests very quickly |
| with runqemu("core-image-minimal", runqemuparams = "nographic", qemuparams = "-m 512") as qemu: |
| # Copy remote-test-server to image through scp |
| host_sys = get_bb_var("RUST_BUILD_SYS", "rust") |
| ssh = SSHControl(ip=qemu.ip, logfile=qemu.sshlog, user="root") |
| ssh.copy_to(builddir + "/build/" + host_sys + "/stage1-tools-bin/remote-test-server","~/") |
| # Execute remote-test-server on image through background ssh |
| command = '~/remote-test-server --bind 0.0.0.0:12345 -v' |
| sshrun=subprocess.Popen(("ssh", '-o', 'UserKnownHostsFile=/dev/null', '-o', 'StrictHostKeyChecking=no', '-f', "root@%s" % qemu.ip, command), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| # Get the values of variables. |
| tcpath = get_bb_var("TARGET_SYS", "rust") |
| targetsys = get_bb_var("RUST_TARGET_SYS", "rust") |
| rustlibpath = get_bb_var("WORKDIR", "rust") |
| tmpdir = get_bb_var("TMPDIR", "rust") |
| |
| # Set path for target-poky-linux-gcc, RUST_TARGET_PATH and hosttools. |
| cmd = " export PATH=%s/recipe-sysroot-native/usr/bin:$PATH;" % rustlibpath |
| cmd = cmd + " export TARGET_VENDOR=\"-poky\";" |
| cmd = cmd + " export PATH=%s/recipe-sysroot-native/usr/bin/%s:%s/hosttools:$PATH;" % (rustlibpath, tcpath, tmpdir) |
| cmd = cmd + " export RUST_TARGET_PATH=%s/rust-targets;" % rustlibpath |
| # Trigger testing. |
| cmd = cmd + " export TEST_DEVICE_ADDR=\"%s:12345\";" % qemu.ip |
| cmd = cmd + " cd %s; python3 src/bootstrap/bootstrap.py test %s --target %s > summary.txt 2>&1;" % (builddir, testargs, targetsys) |
| runCmd(cmd) |
| end_time = time.time() |
| |
| ptestsuite = "rust" |
| self.ptest_section(ptestsuite, duration = int(end_time - start_time), logfile = builddir + "/summary.txt") |
| filename = builddir + "/summary.txt" |
| test_results = parse_results(filename) |
| for test in test_results: |
| self.ptest_result(ptestsuite, test, test_results[test]) |