Use the 'linux_kernel' namespace to provide common helpers
to functional tests booting a Linux kernel.
Suggested-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
tests/functional/qemu_test/linux_kernel.py | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 tests/functional/qemu_test/linux_kernel.py
diff --git a/tests/functional/qemu_test/linux_kernel.py b/tests/functional/qemu_test/linux_kernel.py
new file mode 100644
index 0000000000..917beb7fb6
--- /dev/null
+++ b/tests/functional/qemu_test/linux_kernel.py
@@ -0,0 +1,19 @@
+# Linux kernel functional test helpers
+#
+# Copyright (c) 2024 Linaro Ltd.
+#
+# Author:
+# Philippe Mathieu-Daudé <philmd@linaro.org>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+from . import wait_for_console_pattern
+
+KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
+
+KERNEL_PANIC_MESSAGE = 'Kernel panic - not syncing'
+
+def linux_kernel_wait_for_pattern(test, success_message):
+ wait_for_console_pattern(test,
+ success_message=success_message,
+ failure_message=KERNEL_PANIC_MESSAGE)
--
2.45.2
On 27/08/2024 00.10, Philippe Mathieu-Daudé wrote: > Use the 'linux_kernel' namespace to provide common helpers > to functional tests booting a Linux kernel. > > Suggested-by: Thomas Huth <thuth@redhat.com> > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > tests/functional/qemu_test/linux_kernel.py | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > create mode 100644 tests/functional/qemu_test/linux_kernel.py > > diff --git a/tests/functional/qemu_test/linux_kernel.py b/tests/functional/qemu_test/linux_kernel.py > new file mode 100644 > index 0000000000..917beb7fb6 > --- /dev/null > +++ b/tests/functional/qemu_test/linux_kernel.py > @@ -0,0 +1,19 @@ > +# Linux kernel functional test helpers > +# > +# Copyright (c) 2024 Linaro Ltd. > +# > +# Author: > +# Philippe Mathieu-Daudé <philmd@linaro.org> > +# > +# SPDX-License-Identifier: GPL-2.0-or-later > + > +from . import wait_for_console_pattern > + > +KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 ' > + > +KERNEL_PANIC_MESSAGE = 'Kernel panic - not syncing' > + > +def linux_kernel_wait_for_pattern(test, success_message): > + wait_for_console_pattern(test, > + success_message=success_message, > + failure_message=KERNEL_PANIC_MESSAGE) I'd prefer to have the whole LinuxKernelTest class here (without the BootLinuxConsole class of course), that way the modifications that we have to do to the converted tests are definitely smaller when we don't have to change the "wait_for_console_pattern" lines everywhere. And it's also nicer if the variables are properly wrapped in a class. Thomas
Hi Thomas, On 27/8/24 07:34, Thomas Huth wrote: > On 27/08/2024 00.10, Philippe Mathieu-Daudé wrote: >> Use the 'linux_kernel' namespace to provide common helpers >> to functional tests booting a Linux kernel. >> >> Suggested-by: Thomas Huth <thuth@redhat.com> >> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> >> --- >> tests/functional/qemu_test/linux_kernel.py | 19 +++++++++++++++++++ >> 1 file changed, 19 insertions(+) >> create mode 100644 tests/functional/qemu_test/linux_kernel.py >> >> diff --git a/tests/functional/qemu_test/linux_kernel.py >> b/tests/functional/qemu_test/linux_kernel.py >> new file mode 100644 >> index 0000000000..917beb7fb6 >> --- /dev/null >> +++ b/tests/functional/qemu_test/linux_kernel.py >> @@ -0,0 +1,19 @@ >> +# Linux kernel functional test helpers >> +# >> +# Copyright (c) 2024 Linaro Ltd. >> +# >> +# Author: >> +# Philippe Mathieu-Daudé <philmd@linaro.org> >> +# >> +# SPDX-License-Identifier: GPL-2.0-or-later >> + >> +from . import wait_for_console_pattern >> + >> +KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 ' >> + >> +KERNEL_PANIC_MESSAGE = 'Kernel panic - not syncing' >> + >> +def linux_kernel_wait_for_pattern(test, success_message): >> + wait_for_console_pattern(test, >> + success_message=success_message, >> + failure_message=KERNEL_PANIC_MESSAGE) > > I'd prefer to have the whole LinuxKernelTest class here (without the > BootLinuxConsole class of course), that way the modifications that we > have to do to the converted tests are definitely smaller when we don't > have to change the "wait_for_console_pattern" lines everywhere. And it's > also nicer if the variables are properly wrapped in a class. I'm a bit confused by your comment. I exposed my view on LinuxKernelTest methods (which I don't see specific to this class) here: https://lore.kernel.org/qemu-devel/9910ebc8-b7c4-4505-a987-3a5e308fb3d1@linaro.org/ Could your request be implemented on top on this patch, as we go (as it is already helpful in its current state)? Otherwise I'll ask you to share a snippet of what you mean, or even better to post a v2 :) Regards, Phil.
Here's how I'd suggest to convert the tests from tests/avocado/boot_linux_console.py : Copy the whole LinuxKernelTest class (well, let's drop extract_from_rpm for now since it is completely unused), so we can copy the test code with only some few modifications (using the Q800 test as an example here). Thomas Huth (2): tests/functional: Add the LinuxKernelTest for testing the Linux boot process tests/functional: Convert the m68k Q800 Avocado test into a functional test MAINTAINERS | 1 + tests/avocado/boot_linux_console.py | 24 ------------- tests/functional/meson.build | 3 +- tests/functional/qemu_test/__init__.py | 1 + tests/functional/qemu_test/linuxkernel.py | 41 +++++++++++++++++++++++ tests/functional/test_m68k_q800.py | 37 ++++++++++++++++++++ 6 files changed, 82 insertions(+), 25 deletions(-) create mode 100644 tests/functional/qemu_test/linuxkernel.py create mode 100755 tests/functional/test_m68k_q800.py -- 2.46.0
Copy the LinuxKernelTest from tests/acceptance/boot_linux_console.py
to be able to convert the related tests to the functional test framework
in the following patches.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/functional/qemu_test/__init__.py | 1 +
tests/functional/qemu_test/linuxkernel.py | 41 +++++++++++++++++++++++
2 files changed, 42 insertions(+)
create mode 100644 tests/functional/qemu_test/linuxkernel.py
diff --git a/tests/functional/qemu_test/__init__.py b/tests/functional/qemu_test/__init__.py
index db05c8f412..4e7268c58d 100644
--- a/tests/functional/qemu_test/__init__.py
+++ b/tests/functional/qemu_test/__init__.py
@@ -12,3 +12,4 @@
interrupt_interactive_console_until_pattern, wait_for_console_pattern, \
exec_command, exec_command_and_wait_for_pattern
from .testcase import QemuSystemTest, QemuBaseTest
+from .linuxkernel import LinuxKernelTest
diff --git a/tests/functional/qemu_test/linuxkernel.py b/tests/functional/qemu_test/linuxkernel.py
new file mode 100644
index 0000000000..fdd5307629
--- /dev/null
+++ b/tests/functional/qemu_test/linuxkernel.py
@@ -0,0 +1,41 @@
+# Test class for testing the boot process of a Linux kernel
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+import os
+
+from .testcase import QemuSystemTest
+from .cmd import run_cmd, wait_for_console_pattern
+from .utils import archive_extract
+
+class LinuxKernelTest(QemuSystemTest):
+ KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
+
+ 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 extract_from_deb(self, deb_path, path):
+ """
+ Extracts a file from a deb package into the test workdir
+
+ :param deb_path: path to the deb archive
+ :param path: path within the deb archive of the file to be extracted
+ :returns: path of the extracted file
+ """
+ cwd = os.getcwd()
+ os.chdir(self.workdir)
+ (stdout, stderr, ret) = run_cmd(['ar', 't', deb_path])
+ file_path = stdout.split()[2]
+ run_cmd(['ar', 'x', deb_path, file_path])
+ archive_extract(file_path, self.workdir)
+ os.chdir(cwd)
+ # Return complete path to extracted file. Because callers to
+ # extract_from_deb() specify 'path' with a leading slash, it is
+ # necessary to use os.path.relpath() as otherwise os.path.join()
+ # interprets it as an absolute path and drops the self.workdir part.
+ return os.path.normpath(os.path.join(self.workdir,
+ os.path.relpath(path, '/')))
+
--
2.46.0
Just had to update the asset checksum to use SHA256 instead of SHA1,
but apart from that it is a pretty much straightforward conversion.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
MAINTAINERS | 1 +
tests/avocado/boot_linux_console.py | 24 -------------------
tests/functional/meson.build | 3 ++-
tests/functional/test_m68k_q800.py | 37 +++++++++++++++++++++++++++++
4 files changed, 40 insertions(+), 25 deletions(-)
create mode 100755 tests/functional/test_m68k_q800.py
diff --git a/MAINTAINERS b/MAINTAINERS
index 25e71ac14c..972476cd7c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1309,6 +1309,7 @@ F: include/hw/m68k/q800-glue.h
F: include/hw/misc/djmemc.h
F: include/hw/misc/iosb.h
F: include/hw/audio/asc.h
+F: tests/functional/test_m68k_q800.py
virt
M: Laurent Vivier <laurent@vivier.eu>
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
index 18c69d6acc..396836bf64 100644
--- a/tests/avocado/boot_linux_console.py
+++ b/tests/avocado/boot_linux_console.py
@@ -1325,30 +1325,6 @@ def test_alpha_clipper(self):
console_pattern = 'Kernel command line: %s' % kernel_command_line
self.wait_for_console_pattern(console_pattern)
- def test_m68k_q800(self):
- """
- :avocado: tags=arch:m68k
- :avocado: tags=machine:q800
- """
- deb_url = ('https://snapshot.debian.org/archive/debian-ports'
- '/20191021T083923Z/pool-m68k/main'
- '/l/linux/kernel-image-5.3.0-1-m68k-di_5.3.7-1_m68k.udeb')
- deb_hash = '044954bb9be4160a3ce81f8bc1b5e856b75cccd1'
- deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash)
- kernel_path = self.extract_from_deb(deb_path,
- '/boot/vmlinux-5.3.0-1-m68k')
-
- self.vm.set_console()
- kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
- 'console=ttyS0 vga=off')
- self.vm.add_args('-kernel', kernel_path,
- '-append', kernel_command_line)
- self.vm.launch()
- console_pattern = 'Kernel command line: %s' % kernel_command_line
- self.wait_for_console_pattern(console_pattern)
- console_pattern = 'No filesystem could mount root'
- self.wait_for_console_pattern(console_pattern)
-
def do_test_advcal_2018(self, day, tar_hash, kernel_name, console=0):
tar_url = ('https://qemu-advcal.gitlab.io'
'/qac-best-of-multiarch/download/day' + day + '.tar.xz')
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
index 851f33c459..bf7a554a1d 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -40,7 +40,8 @@ tests_loongarch64_thorough = [
]
tests_m68k_thorough = [
- 'm68k_nextcube'
+ 'm68k_nextcube',
+ 'm68k_q800',
]
tests_microblaze_thorough = [
diff --git a/tests/functional/test_m68k_q800.py b/tests/functional/test_m68k_q800.py
new file mode 100755
index 0000000000..3b17244b98
--- /dev/null
+++ b/tests/functional/test_m68k_q800.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python3
+#
+# Functional test for testing the q800 m68k machine
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+from qemu_test import LinuxKernelTest, Asset
+
+class Q800MachineTest(LinuxKernelTest):
+
+ ASSET_KERNEL = Asset(
+ ('https://snapshot.debian.org/'
+ 'archive/debian-ports/20191021T083923Z/pool-m68k/main/l/linux/'
+ 'kernel-image-5.3.0-1-m68k-di_5.3.7-1_m68k.udeb'),
+ '949e50d74d4b9bc15d26c06d402717b7a4c0e32ff8100014f5930d8024de7b73')
+
+ def test_m68k_q800(self):
+ self.set_machine('q800')
+
+ deb_path = self.ASSET_KERNEL.fetch()
+ kernel_path = self.extract_from_deb(deb_path,
+ '/boot/vmlinux-5.3.0-1-m68k')
+
+ self.vm.set_console()
+ kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
+ 'console=ttyS0 vga=off')
+ self.vm.add_args('-kernel', kernel_path,
+ '-append', kernel_command_line)
+ self.vm.launch()
+ console_pattern = 'Kernel command line: %s' % kernel_command_line
+ self.wait_for_console_pattern(console_pattern)
+ console_pattern = 'No filesystem could mount root'
+ self.wait_for_console_pattern(console_pattern)
+
+if __name__ == '__main__':
+ LinuxKernelTest.main()
--
2.46.0
On 27/08/2024 11.21, Philippe Mathieu-Daudé wrote: > Hi Thomas, > > On 27/8/24 07:34, Thomas Huth wrote: >> On 27/08/2024 00.10, Philippe Mathieu-Daudé wrote: >>> Use the 'linux_kernel' namespace to provide common helpers >>> to functional tests booting a Linux kernel. >>> >>> Suggested-by: Thomas Huth <thuth@redhat.com> >>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> >>> --- >>> tests/functional/qemu_test/linux_kernel.py | 19 +++++++++++++++++++ >>> 1 file changed, 19 insertions(+) >>> create mode 100644 tests/functional/qemu_test/linux_kernel.py >>> >>> diff --git a/tests/functional/qemu_test/linux_kernel.py >>> b/tests/functional/qemu_test/linux_kernel.py >>> new file mode 100644 >>> index 0000000000..917beb7fb6 >>> --- /dev/null >>> +++ b/tests/functional/qemu_test/linux_kernel.py >>> @@ -0,0 +1,19 @@ >>> +# Linux kernel functional test helpers >>> +# >>> +# Copyright (c) 2024 Linaro Ltd. >>> +# >>> +# Author: >>> +# Philippe Mathieu-Daudé <philmd@linaro.org> >>> +# >>> +# SPDX-License-Identifier: GPL-2.0-or-later >>> + >>> +from . import wait_for_console_pattern >>> + >>> +KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 ' >>> + >>> +KERNEL_PANIC_MESSAGE = 'Kernel panic - not syncing' >>> + >>> +def linux_kernel_wait_for_pattern(test, success_message): >>> + wait_for_console_pattern(test, >>> + success_message=success_message, >>> + failure_message=KERNEL_PANIC_MESSAGE) >> >> I'd prefer to have the whole LinuxKernelTest class here (without the >> BootLinuxConsole class of course), that way the modifications that we have >> to do to the converted tests are definitely smaller when we don't have to >> change the "wait_for_console_pattern" lines everywhere. And it's also >> nicer if the variables are properly wrapped in a class. > > I'm a bit confused by your comment. I exposed my view on LinuxKernelTest > methods (which I don't see specific to this class) here: > https://lore.kernel.org/qemu-devel/9910ebc8-b7c4-4505-a987-3a5e308fb3d1@linaro.org/ > > Could your request be implemented on top on this patch, as we go (as it > is already helpful in its current state)? Otherwise I'll ask you to > share a snippet of what you mean, or even better to post a v2 :) I'll post a mini patch series (converting the Q800 test) in reply to your mail to show what I had in mind... Thomas
© 2016 - 2024 Red Hat, Inc.