From: Thomas Huth <thuth@redhat.com>
To: qemu-devel@nongnu.org,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Alex Bennée" <alex.bennee@linaro.org>
Cc: Guenter Roeck <linux@roeck-us.net>,
Yoshinori Sato <ysato@users.sourceforge.jp>,
Magnus Damm <magnus.damm@gmail.com>,
qemu-arm@nongnu.org, Thomas Huth <thuth@redhat.com>
Subject: [PATCH 01/17] tests/functional: Add a base class for the TuxRun tests
Date: Fri, 11 Oct 2024 15:19:18 +0200 [thread overview]
Message-ID: <20241011131937.377223-2-thuth@redhat.com> (raw)
In-Reply-To: <20241011131937.377223-1-thuth@redhat.com>
Add a base class for the TuxRun tests, based on the code from
tests/avocado/tuxrun_baselines.py (the test have to be put into
separate file in the following commits, depending on the target
architecture that gets tested).
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/functional/qemu_test/tuxruntest.py | 158 +++++++++++++++++++++++
1 file changed, 158 insertions(+)
create mode 100644 tests/functional/qemu_test/tuxruntest.py
diff --git a/tests/functional/qemu_test/tuxruntest.py b/tests/functional/qemu_test/tuxruntest.py
new file mode 100644
index 0000000000..904da6f609
--- /dev/null
+++ b/tests/functional/qemu_test/tuxruntest.py
@@ -0,0 +1,158 @@
+# Functional test that boots known good tuxboot images the same way
+# that tuxrun (www.tuxrun.org) does. This tool is used by things like
+# the LKFT project to run regression tests on kernels.
+#
+# Copyright (c) 2023 Linaro Ltd.
+#
+# Author:
+# Alex Bennée <alex.bennee@linaro.org>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import os
+import time
+
+from qemu_test import QemuSystemTest
+from qemu_test import exec_command, exec_command_and_wait_for_pattern
+from qemu_test import wait_for_console_pattern
+from qemu_test import has_cmd, run_cmd, get_qemu_img
+
+class TuxRunBaselineTest(QemuSystemTest):
+
+ KERNEL_COMMON_COMMAND_LINE = 'printk.time=0'
+ # Tests are ~10-40s, allow for --debug/--enable-gcov overhead
+ timeout = 100
+
+ def get_tag(self, tagname, default=None):
+ """
+ Get the metadata tag or return the default.
+ """
+ utag = self._get_unique_tag_val(tagname)
+ print(f"{tagname}/{default} -> {utag}")
+ if utag:
+ return utag
+
+ return default
+
+ def setUp(self):
+ super().setUp()
+
+ # We need zstd for all the tuxrun tests
+ # See https://github.com/avocado-framework/avocado/issues/5609
+ (has_zstd, msg) = has_cmd('zstd')
+ if has_zstd is False:
+ self.skipTest(msg)
+ self.zstd = 'zstd'
+
+ # Pre-init TuxRun specific settings: Most machines work with
+ # reasonable defaults but we sometimes need to tweak the
+ # config. To avoid open coding everything we store all these
+ # details in the metadata for each test.
+
+ # The tuxboot tag matches the root directory
+ self.tuxboot = self.arch
+
+ # Most Linux's use ttyS0 for their serial port
+ self.console = "ttyS0"
+
+ # Does the machine shutdown QEMU nicely on "halt"
+ self.wait_for_shutdown = True
+
+ self.root = "vda"
+
+ # Occasionally we need extra devices to hook things up
+ self.extradev = None
+
+ self.qemu_img = get_qemu_img(self)
+
+ def wait_for_console_pattern(self, success_message, vm=None):
+ wait_for_console_pattern(self, success_message,
+ failure_message='Kernel panic - not syncing',
+ vm=vm)
+
+ def fetch_tuxrun_assets(self, kernel_asset, rootfs_asset, dtb_asset=None):
+ """
+ Fetch the TuxBoot assets.
+ """
+ kernel_image = kernel_asset.fetch()
+ disk_image_zst = rootfs_asset.fetch()
+
+ run_cmd([self.zstd, "-f", "-d", disk_image_zst,
+ "-o", self.workdir + "/rootfs.ext4"])
+
+ dtb = dtb_asset.fetch() if dtb_asset is not None else None
+
+ return (kernel_image, self.workdir + "/rootfs.ext4", dtb)
+
+ def prepare_run(self, kernel, disk, drive, dtb=None, console_index=0):
+ """
+ Setup to run and add the common parameters to the system
+ """
+ self.vm.set_console(console_index=console_index)
+
+ # all block devices are raw ext4's
+ blockdev = "driver=raw,file.driver=file," \
+ + f"file.filename={disk},node-name=hd0"
+
+ kcmd_line = self.KERNEL_COMMON_COMMAND_LINE
+ kcmd_line += f" root=/dev/{self.root}"
+ kcmd_line += f" console={self.console}"
+
+ self.vm.add_args('-kernel', kernel,
+ '-append', kcmd_line,
+ '-blockdev', blockdev)
+
+ # Sometimes we need extra devices attached
+ if self.extradev:
+ self.vm.add_args('-device', self.extradev)
+
+ self.vm.add_args('-device',
+ f"{drive},drive=hd0")
+
+ # Some machines need an explicit DTB
+ if dtb:
+ self.vm.add_args('-dtb', dtb)
+
+ def run_tuxtest_tests(self, haltmsg):
+ """
+ Wait for the system to boot up, wait for the login prompt and
+ then do a few things on the console. Trigger a shutdown and
+ wait to exit cleanly.
+ """
+ self.wait_for_console_pattern("Welcome to TuxTest")
+ time.sleep(0.2)
+ exec_command(self, 'root')
+ time.sleep(0.2)
+ exec_command(self, 'cat /proc/interrupts')
+ time.sleep(0.1)
+ exec_command(self, 'cat /proc/self/maps')
+ time.sleep(0.1)
+ exec_command(self, 'uname -a')
+ time.sleep(0.1)
+ exec_command_and_wait_for_pattern(self, 'halt', haltmsg)
+
+ # Wait for VM to shut down gracefully if it can
+ if self.wait_for_shutdown:
+ self.vm.wait()
+ else:
+ self.vm.shutdown()
+
+ def common_tuxrun(self,
+ kernel_asset,
+ rootfs_asset,
+ dtb_asset=None,
+ drive="virtio-blk-device",
+ haltmsg="reboot: System halted",
+ console_index=0):
+ """
+ Common path for LKFT tests. Unless we need to do something
+ special with the command line we can process most things using
+ the tag metadata.
+ """
+ (kernel, disk, dtb) = self.fetch_tuxrun_assets(kernel_asset, rootfs_asset,
+ dtb_asset)
+
+ self.prepare_run(kernel, disk, drive, dtb, console_index)
+ self.vm.launch()
+ self.run_tuxtest_tests(haltmsg)
+ os.remove(disk)
--
2.46.1
next prev parent reply other threads:[~2024-10-11 13:20 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-11 13:19 [PATCH 00/17] Convert the Avocado tuxrun tests into new functional tests Thomas Huth
2024-10-11 13:19 ` Thomas Huth [this message]
2024-10-11 13:19 ` [PATCH 02/17] tests/functional: Convert the Avocado ppc64 tuxrun tests Thomas Huth
2024-10-11 13:19 ` [PATCH 03/17] tests/functional: Convert the Avocado aarch64 " Thomas Huth
2024-10-11 13:19 ` [PATCH 04/17] tests/functional: Convert the Avocado sparc64 tuxrun test Thomas Huth
2024-10-11 13:19 ` [PATCH 05/17] tests/functional: Convert the Avocado s390x " Thomas Huth
2024-10-11 13:19 ` [PATCH 06/17] tests/functional: Convert the Avocado arm tuxrun tests Thomas Huth
2024-10-11 13:19 ` [PATCH 07/17] tests/functional: Convert the Avocado riscv32 " Thomas Huth
2024-10-11 13:19 ` [PATCH 08/17] tests/functional: Convert the Avocado riscv64 " Thomas Huth
2024-10-11 13:19 ` [PATCH 09/17] tests/functional: Convert the Avocado i386 tuxrun test Thomas Huth
2024-10-11 13:19 ` [PATCH 10/17] tests/functional: Convert the Avocado x86_64 " Thomas Huth
2024-10-11 13:19 ` [PATCH 11/17] tests/functional: Convert the Avocado mips " Thomas Huth
2024-10-11 13:19 ` [PATCH 12/17] tests/functional: Convert the Avocado mipsel " Thomas Huth
2024-10-11 13:19 ` [PATCH 13/17] tests/functional: Convert the Avocado mips64 " Thomas Huth
2024-10-11 13:19 ` [PATCH 14/17] tests/functional: Convert the Avocado mips64el " Thomas Huth
2024-10-11 13:19 ` [PATCH 15/17] tests/functional: Convert the Avocado ppc32 " Thomas Huth
2024-10-11 13:19 ` [PATCH 16/17] Revert "hw/sh4/r2d: Realize IDE controller before accessing it" Thomas Huth
2024-10-11 22:52 ` Philippe Mathieu-Daudé
2024-10-11 13:19 ` [PATCH 17/17] tests/functional: Convert the Avocado sh4 tuxrun test Thomas Huth
2024-10-13 15:27 ` [PATCH 00/17] Convert the Avocado tuxrun tests into new functional tests Alex Bennée
2024-10-14 6:12 ` Thomas Huth
2024-10-14 10:13 ` Daniel P. Berrangé
2024-10-21 6:01 ` Thomas Huth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241011131937.377223-2-thuth@redhat.com \
--to=thuth@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=linux@roeck-us.net \
--cc=magnus.damm@gmail.com \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=ysato@users.sourceforge.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.