From 861f724d03e1748cda1c5b9ec8457a368590cbd5 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 14 Nov 2023 14:43:26 +0100 Subject: [PATCH 01/10] tests/avocado: Replace assertEquals() for Python 3.12 compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit assertEquals() has been removed in Python 3.12 and should be replaced by assertEqual(). See: https://docs.python.org/3.12/whatsnew/3.12.html#id3 Message-ID: <20231114134326.287242-1-thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Thomas Huth --- docs/devel/testing.rst | 2 +- tests/avocado/cpu_queries.py | 2 +- tests/avocado/empty_cpu_model.py | 2 +- tests/avocado/pc_cpu_hotplug_props.py | 2 +- tests/avocado/x86_cpu_model_versions.py | 97 +++++++++++++------------ 5 files changed, 53 insertions(+), 52 deletions(-) diff --git a/docs/devel/testing.rst b/docs/devel/testing.rst index fef64accc1..87ed30af22 100644 --- a/docs/devel/testing.rst +++ b/docs/devel/testing.rst @@ -1077,7 +1077,7 @@ and hypothetical example follows: 'human-monitor-command', command_line='info version') - self.assertEquals(first_res, second_res, third_res) + self.assertEqual(first_res, second_res, third_res) At test "tear down", ``avocado_qemu.Test`` handles all the QEMUMachines shutdown. diff --git a/tests/avocado/cpu_queries.py b/tests/avocado/cpu_queries.py index 86c2d5c92d..d3faa14720 100644 --- a/tests/avocado/cpu_queries.py +++ b/tests/avocado/cpu_queries.py @@ -32,4 +32,4 @@ class QueryCPUModelExpansion(QemuSystemTest): model = {'name': c['name']} e = self.vm.cmd('query-cpu-model-expansion', model=model, type='full') - self.assertEquals(e['model']['name'], c['name']) + self.assertEqual(e['model']['name'], c['name']) diff --git a/tests/avocado/empty_cpu_model.py b/tests/avocado/empty_cpu_model.py index 22f504418d..d906ef3d3c 100644 --- a/tests/avocado/empty_cpu_model.py +++ b/tests/avocado/empty_cpu_model.py @@ -15,5 +15,5 @@ class EmptyCPUModel(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'-cpu option cannot be empty') diff --git a/tests/avocado/pc_cpu_hotplug_props.py b/tests/avocado/pc_cpu_hotplug_props.py index b56f51d02a..4bd3e02665 100644 --- a/tests/avocado/pc_cpu_hotplug_props.py +++ b/tests/avocado/pc_cpu_hotplug_props.py @@ -32,4 +32,4 @@ class OmittedCPUProps(QemuSystemTest): self.vm.add_args('-smp', '1,sockets=2,cores=2,threads=2,maxcpus=8') self.vm.add_args('-device', 'qemu64-x86_64-cpu,socket-id=1,core-id=0,thread-id=0') self.vm.launch() - self.assertEquals(len(self.vm.cmd('query-cpus-fast')), 2) + self.assertEqual(len(self.vm.cmd('query-cpus-fast')), 2) diff --git a/tests/avocado/x86_cpu_model_versions.py b/tests/avocado/x86_cpu_model_versions.py index 9e07b8a55d..11101e02b9 100644 --- a/tests/avocado/x86_cpu_model_versions.py +++ b/tests/avocado/x86_cpu_model_versions.py @@ -121,94 +121,95 @@ class X86CPUModelAliases(avocado_qemu.QemuSystemTest): self.assertFalse(cpus['Cascadelake-Server']['static'], 'unversioned Cascadelake-Server CPU model must not be static') - self.assertEquals(cpus['Cascadelake-Server'].get('alias-of'), 'Cascadelake-Server-v1', - 'Cascadelake-Server must be an alias of Cascadelake-Server-v1') + self.assertEqual(cpus['Cascadelake-Server'].get('alias-of'), + 'Cascadelake-Server-v1', + 'Cascadelake-Server must be an alias of Cascadelake-Server-v1') self.assertNotIn('alias-of', cpus['Cascadelake-Server-v1'], 'Cascadelake-Server-v1 must not be an alias') self.assertFalse(cpus['qemu64']['static'], 'unversioned qemu64 CPU model must not be static') - self.assertEquals(cpus['qemu64'].get('alias-of'), 'qemu64-v1', - 'qemu64 must be an alias of qemu64-v1') + self.assertEqual(cpus['qemu64'].get('alias-of'), 'qemu64-v1', + 'qemu64 must be an alias of qemu64-v1') self.assertNotIn('alias-of', cpus['qemu64-v1'], 'qemu64-v1 must not be an alias') self.validate_variant_aliases(cpus) # On pc-*-4.1, -noTSX and -IBRS models should be aliases: - self.assertEquals(cpus["Haswell"].get('alias-of'), - "Haswell-v1", + self.assertEqual(cpus["Haswell"].get('alias-of'), + "Haswell-v1", "Haswell must be an alias") - self.assertEquals(cpus["Haswell-noTSX"].get('alias-of'), - "Haswell-v2", + self.assertEqual(cpus["Haswell-noTSX"].get('alias-of'), + "Haswell-v2", "Haswell-noTSX must be an alias") - self.assertEquals(cpus["Haswell-IBRS"].get('alias-of'), - "Haswell-v3", + self.assertEqual(cpus["Haswell-IBRS"].get('alias-of'), + "Haswell-v3", "Haswell-IBRS must be an alias") - self.assertEquals(cpus["Haswell-noTSX-IBRS"].get('alias-of'), - "Haswell-v4", + self.assertEqual(cpus["Haswell-noTSX-IBRS"].get('alias-of'), + "Haswell-v4", "Haswell-noTSX-IBRS must be an alias") - self.assertEquals(cpus["Broadwell"].get('alias-of'), - "Broadwell-v1", + self.assertEqual(cpus["Broadwell"].get('alias-of'), + "Broadwell-v1", "Broadwell must be an alias") - self.assertEquals(cpus["Broadwell-noTSX"].get('alias-of'), - "Broadwell-v2", + self.assertEqual(cpus["Broadwell-noTSX"].get('alias-of'), + "Broadwell-v2", "Broadwell-noTSX must be an alias") - self.assertEquals(cpus["Broadwell-IBRS"].get('alias-of'), - "Broadwell-v3", + self.assertEqual(cpus["Broadwell-IBRS"].get('alias-of'), + "Broadwell-v3", "Broadwell-IBRS must be an alias") - self.assertEquals(cpus["Broadwell-noTSX-IBRS"].get('alias-of'), - "Broadwell-v4", + self.assertEqual(cpus["Broadwell-noTSX-IBRS"].get('alias-of'), + "Broadwell-v4", "Broadwell-noTSX-IBRS must be an alias") - self.assertEquals(cpus["Nehalem"].get('alias-of'), - "Nehalem-v1", + self.assertEqual(cpus["Nehalem"].get('alias-of'), + "Nehalem-v1", "Nehalem must be an alias") - self.assertEquals(cpus["Nehalem-IBRS"].get('alias-of'), - "Nehalem-v2", + self.assertEqual(cpus["Nehalem-IBRS"].get('alias-of'), + "Nehalem-v2", "Nehalem-IBRS must be an alias") - self.assertEquals(cpus["Westmere"].get('alias-of'), - "Westmere-v1", + self.assertEqual(cpus["Westmere"].get('alias-of'), + "Westmere-v1", "Westmere must be an alias") - self.assertEquals(cpus["Westmere-IBRS"].get('alias-of'), - "Westmere-v2", + self.assertEqual(cpus["Westmere-IBRS"].get('alias-of'), + "Westmere-v2", "Westmere-IBRS must be an alias") - self.assertEquals(cpus["SandyBridge"].get('alias-of'), - "SandyBridge-v1", + self.assertEqual(cpus["SandyBridge"].get('alias-of'), + "SandyBridge-v1", "SandyBridge must be an alias") - self.assertEquals(cpus["SandyBridge-IBRS"].get('alias-of'), - "SandyBridge-v2", + self.assertEqual(cpus["SandyBridge-IBRS"].get('alias-of'), + "SandyBridge-v2", "SandyBridge-IBRS must be an alias") - self.assertEquals(cpus["IvyBridge"].get('alias-of'), - "IvyBridge-v1", + self.assertEqual(cpus["IvyBridge"].get('alias-of'), + "IvyBridge-v1", "IvyBridge must be an alias") - self.assertEquals(cpus["IvyBridge-IBRS"].get('alias-of'), - "IvyBridge-v2", + self.assertEqual(cpus["IvyBridge-IBRS"].get('alias-of'), + "IvyBridge-v2", "IvyBridge-IBRS must be an alias") - self.assertEquals(cpus["Skylake-Client"].get('alias-of'), - "Skylake-Client-v1", + self.assertEqual(cpus["Skylake-Client"].get('alias-of'), + "Skylake-Client-v1", "Skylake-Client must be an alias") - self.assertEquals(cpus["Skylake-Client-IBRS"].get('alias-of'), - "Skylake-Client-v2", + self.assertEqual(cpus["Skylake-Client-IBRS"].get('alias-of'), + "Skylake-Client-v2", "Skylake-Client-IBRS must be an alias") - self.assertEquals(cpus["Skylake-Server"].get('alias-of'), - "Skylake-Server-v1", + self.assertEqual(cpus["Skylake-Server"].get('alias-of'), + "Skylake-Server-v1", "Skylake-Server must be an alias") - self.assertEquals(cpus["Skylake-Server-IBRS"].get('alias-of'), - "Skylake-Server-v2", + self.assertEqual(cpus["Skylake-Server-IBRS"].get('alias-of'), + "Skylake-Server-v2", "Skylake-Server-IBRS must be an alias") - self.assertEquals(cpus["EPYC"].get('alias-of'), - "EPYC-v1", + self.assertEqual(cpus["EPYC"].get('alias-of'), + "EPYC-v1", "EPYC must be an alias") - self.assertEquals(cpus["EPYC-IBPB"].get('alias-of'), - "EPYC-v2", + self.assertEqual(cpus["EPYC-IBPB"].get('alias-of'), + "EPYC-v2", "EPYC-IBPB must be an alias") self.validate_aliases(cpus) From f0a663b4ced2bf315936c774c2b6ff398fce8905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Date: Tue, 14 Nov 2023 15:48:31 +0100 Subject: [PATCH 02/10] tests/avocado: Replace assertRegexpMatches() for Python 3.12 compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit assertRegexpMatches() has been removed in Python 3.12 and should be replaced by assertRegex(). See: https://docs.python.org/3.12/whatsnew/3.12.html#id3 Inspired-by: Thomas Huth Signed-off-by: Philippe Mathieu-Daudé Message-ID: <20231114144832.71612-1-philmd@linaro.org> Reviewed-by: Thomas Huth Signed-off-by: Thomas Huth --- docs/devel/testing.rst | 2 +- tests/avocado/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/devel/testing.rst b/docs/devel/testing.rst index 87ed30af22..22218dbedb 100644 --- a/docs/devel/testing.rst +++ b/docs/devel/testing.rst @@ -1016,7 +1016,7 @@ class. Here's a simple usage example: self.vm.launch() res = self.vm.cmd('human-monitor-command', command_line='info version') - self.assertRegexpMatches(res, r'^(\d+\.\d+\.\d)') + self.assertRegex(res, r'^(\d+\.\d+\.\d)') To execute your test, run: diff --git a/tests/avocado/version.py b/tests/avocado/version.py index 93ffdf3d97..c6139568a1 100644 --- a/tests/avocado/version.py +++ b/tests/avocado/version.py @@ -22,4 +22,4 @@ class Version(QemuSystemTest): self.vm.launch() res = self.vm.cmd('human-monitor-command', command_line='info version') - self.assertRegexpMatches(res, r'^(\d+\.\d+\.\d)') + self.assertRegex(res, r'^(\d+\.\d+\.\d)') From ffab603bd513130472faf641326d1d387cbf6526 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 14 Nov 2023 21:34:56 +0100 Subject: [PATCH 03/10] tests/avocado/virtio-gpu: Fix test_vhost_user_vga_virgl for edid support The "edid" feature has been added to vhost-user-gpu in commit c06444261e20 ("contrib/vhost-user-gpu: implement get_edid feature"), so waiting for "features: +virgl -edid" in the test does not work anymore, it's "+edid" instead of "-edid" now! While we're at it, move the expected string to the preceeding exec_command_and_wait_for_pattern() instead (since waiting for empty string here does not make too much sense). Message-ID: <20231114203456.319093-1-thuth@redhat.com> Reviewed-by: Antonio Caggiano Signed-off-by: Thomas Huth --- tests/avocado/virtio-gpu.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/avocado/virtio-gpu.py b/tests/avocado/virtio-gpu.py index 89bfecc715..6091f614a4 100644 --- a/tests/avocado/virtio-gpu.py +++ b/tests/avocado/virtio-gpu.py @@ -149,10 +149,8 @@ class VirtioGPUx86(QemuSystemTest): # TODO: probably fails because we are missing the VirGL features self.cancel("VirGL not enabled?") self.wait_for_console_pattern("as init process") - exec_command_and_wait_for_pattern( - self, "/usr/sbin/modprobe virtio_gpu", "" - ) - self.wait_for_console_pattern("features: +virgl -edid") + exec_command_and_wait_for_pattern(self, "/usr/sbin/modprobe virtio_gpu", + "features: +virgl +edid") self.vm.shutdown() qemu_sock.close() vugp.terminate() From 9cdafe3b47ce2d5e4f609391fb680403ed3f0716 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 14 Nov 2023 15:35:31 +0100 Subject: [PATCH 04/10] tests/avocado/intel_iommu: Add asset hashes to avoid warnings The intel_iommu test is currently succeeding with annoying warnings. Add the proper asset hashes to avoid those. Message-ID: <20231114143531.291820-1-thuth@redhat.com> Reviewed-by: Eric Auger Signed-off-by: Thomas Huth --- tests/avocado/intel_iommu.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/avocado/intel_iommu.py b/tests/avocado/intel_iommu.py index 474d62f6bf..77635ab56c 100644 --- a/tests/avocado/intel_iommu.py +++ b/tests/avocado/intel_iommu.py @@ -54,9 +54,11 @@ class IntelIOMMU(LinuxTest): return kernel_url = self.distro.pxeboot_url + 'vmlinuz' + kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c' initrd_url = self.distro.pxeboot_url + 'initrd.img' - self.kernel_path = self.fetch_asset(kernel_url) - self.initrd_path = self.fetch_asset(initrd_url) + initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1' + self.kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) + self.initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash) def run_and_check(self): if self.kernel_path: From cfe52e91c4020cacf6f95f907c06bf5c2deeec09 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Wed, 15 Nov 2023 15:58:52 +0100 Subject: [PATCH 05/10] tests/avocado/multiprocess: Add asset hashes to silence warnings The multiprocess test is currently succeeding with an annoying warning: (1/2) tests/avocado/multiprocess.py:Multiprocess.test_multiprocess_x86_64: WARN: Test passed but there were warnings during execution. Check the log for details In the log, you can find an entry like: WARNI| No hash provided. Cannot check the asset file integrity. Add the proper asset hashes to avoid those warnings. Message-ID: <20231115145852.494052-1-thuth@redhat.com> Signed-off-by: Thomas Huth --- tests/avocado/multiprocess.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/avocado/multiprocess.py b/tests/avocado/multiprocess.py index 9112a4cacc..ee7490ae08 100644 --- a/tests/avocado/multiprocess.py +++ b/tests/avocado/multiprocess.py @@ -18,8 +18,8 @@ class Multiprocess(QemuSystemTest): """ KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 ' - def do_test(self, kernel_url, initrd_url, kernel_command_line, - machine_type): + def do_test(self, kernel_url, kernel_hash, initrd_url, initrd_hash, + kernel_command_line, machine_type): """Main test method""" self.require_accelerator('kvm') self.require_multiprocess() @@ -30,8 +30,8 @@ class Multiprocess(QemuSystemTest): os.set_inheritable(proxy_sock.fileno(), True) os.set_inheritable(remote_sock.fileno(), True) - kernel_path = self.fetch_asset(kernel_url) - initrd_path = self.fetch_asset(initrd_url) + kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash) + initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash) # Create remote process remote_vm = self.get_vm() @@ -72,13 +72,16 @@ class Multiprocess(QemuSystemTest): kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/31/Everything/x86_64/os/images' '/pxeboot/vmlinuz') + kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c' initrd_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/31/Everything/x86_64/os/images' '/pxeboot/initrd.img') + initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1' kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0 rdinit=/bin/bash') machine_type = 'pc' - self.do_test(kernel_url, initrd_url, kernel_command_line, machine_type) + self.do_test(kernel_url, kernel_hash, initrd_url, initrd_hash, + kernel_command_line, machine_type) def test_multiprocess_aarch64(self): """ @@ -87,10 +90,13 @@ class Multiprocess(QemuSystemTest): kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/31/Everything/aarch64/os/images' '/pxeboot/vmlinuz') + kernel_hash = '3505f2751e2833c681de78cee8dda1e49cabd2e8' initrd_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/31/Everything/aarch64/os/images' '/pxeboot/initrd.img') + initrd_hash = '519a1962daf17d67fc3a9c89d45affcb399607db' kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 'rdinit=/bin/bash console=ttyAMA0') machine_type = 'virt,gic-version=3' - self.do_test(kernel_url, initrd_url, kernel_command_line, machine_type) + self.do_test(kernel_url, kernel_hash, initrd_url, initrd_hash, + kernel_command_line, machine_type) From 9d72dd100ced090f7708b2189a8ef4e855ac3314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Date: Wed, 15 Nov 2023 21:51:49 +0100 Subject: [PATCH 06/10] tests/avocado: Make fetch_asset() unconditionally require a crypto hash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In a perfect world we'd have reproducible tests, but then we'd be sure we run the same binaries. If a binary artifact isn't hashed, we have no idea what we are running. Therefore enforce hashing for all our artifacts. With this change, unhashed artifacts produce: $ avocado run tests/avocado/multiprocess.py (1/2) tests/avocado/multiprocess.py:Multiprocess.test_multiprocess_x86_64: ERROR: QemuBaseTest.fetch_asset() missing 1 required positional argument: 'asset_hash' (0.19 s) Inspired-by: Thomas Huth Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Thomas Huth Reviewed-by: Alex Bennée Message-ID: <20231115205149.90765-1-philmd@linaro.org> Signed-off-by: Thomas Huth --- tests/avocado/avocado_qemu/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/avocado/avocado_qemu/__init__.py b/tests/avocado/avocado_qemu/__init__.py index d71e989db6..304c428168 100644 --- a/tests/avocado/avocado_qemu/__init__.py +++ b/tests/avocado/avocado_qemu/__init__.py @@ -254,7 +254,7 @@ class QemuBaseTest(avocado.Test): self.cancel("No QEMU binary defined or found in the build tree") def fetch_asset(self, name, - asset_hash=None, algorithm=None, + asset_hash, algorithm=None, locations=None, expire=None, find_only=False, cancel_on_missing=True): return super().fetch_asset(name, From 3365f3d99ae3aa3248209bc84c229ec01b5c5b21 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 14 Nov 2023 16:30:19 +0100 Subject: [PATCH 07/10] tests/avocado/replay_kernel: Mark the test_x86_64_pc as flaky It's failing very often, so don't run this by default anymore until it gets fixed. Message-ID: <20231114153019.295131-1-thuth@redhat.com> Reviewed-by: Peter Maydell Signed-off-by: Thomas Huth --- tests/avocado/replay_kernel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/avocado/replay_kernel.py b/tests/avocado/replay_kernel.py index a18610542e..53cb7e5091 100644 --- a/tests/avocado/replay_kernel.py +++ b/tests/avocado/replay_kernel.py @@ -81,7 +81,8 @@ class ReplayKernelBase(LinuxKernelTest): logger.info('replay overhead {:.2%}'.format(t2 / t1 - 1)) class ReplayKernelNormal(ReplayKernelBase): - @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') + + @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test sometimes gets stuck') def test_x86_64_pc(self): """ :avocado: tags=arch:x86_64 From 572960cb23217fb23e23e5a0cb315ac263c9d87c Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Thu, 16 Nov 2023 07:19:56 +0100 Subject: [PATCH 08/10] tests/avocado/mem-addr-space-check: Replace assertEquals() for Python 3.12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit assertEquals() has been removed in Python 3.12 and should be replaced by assertEqual(). See: https://docs.python.org/3.12/whatsnew/3.12.html#id3 Message-ID: <20231116061956.14676-1-thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé Acked-by: Ani Sinha Signed-off-by: Thomas Huth --- tests/avocado/mem-addr-space-check.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/avocado/mem-addr-space-check.py b/tests/avocado/mem-addr-space-check.py index be949222a4..363c3f12a6 100644 --- a/tests/avocado/mem-addr-space-check.py +++ b/tests/avocado/mem-addr-space-check.py @@ -49,7 +49,7 @@ class MemAddrCheck(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'phys-bits too low') def test_phybits_low_pae(self): @@ -69,7 +69,7 @@ class MemAddrCheck(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'phys-bits too low') def test_phybits_ok_pentium_pse36(self): @@ -149,7 +149,7 @@ class MemAddrCheck(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'phys-bits too low') # now lets test some 64-bit CPU cases. @@ -179,7 +179,7 @@ class MemAddrCheck(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'phys-bits too low') def test_phybits_low_tcg_q35_71_amd(self): @@ -202,7 +202,7 @@ class MemAddrCheck(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'phys-bits too low') def test_phybits_ok_tcg_q35_70_amd(self): @@ -288,7 +288,7 @@ class MemAddrCheck(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'phys-bits too low') def test_phybits_ok_tcg_q35_71_amd_41bits(self): @@ -332,7 +332,7 @@ class MemAddrCheck(QemuSystemTest): self.vm.set_qmp_monitor(enabled=False) self.vm.launch() self.vm.wait() - self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") self.assertRegex(self.vm.get_log(), r'phys-bits too low') def test_phybits_ok_tcg_q35_intel_cxl(self): From cd43f00524070c0267613acc98a153dba0e398d9 Mon Sep 17 00:00:00 2001 From: Nicholas Piggin Date: Thu, 16 Nov 2023 21:53:52 +1000 Subject: [PATCH 09/10] tests/avocado: reverse_debugging drain console to prevent hang Like replay_linux.py, reverse_debugging.py starts the vm with console set but does not interact with it (e.g., with wait_for_console_pattern). In this situation, the console should have a drainer attached so the socket does not fill. replay_linux.py has a drainer, but it is missing from reverse_debugging.py. Per analysis in Link: this can cause the console socket/pipe to fill and QEMU get stuck in qemu_chr_write_buffer, leading to strange test case failures (ppc64 fails because it prints a lot to console in early bios). Attaching a drainer prevents this. Note, this commit does not fix bugs introduced by the commits referenced in the first two Fixes: tags, but together those commits conspire to irritate the problem and cause test case failure, which this commit fixes. Link: https://lore.kernel.org/qemu-devel/ZVT-bY9YOr69QTPX@redhat.com/ Fixes: 1d4796cd0083 ("python/machine: use socketpair() for console connections") Fixes: 761a13b23946 ("tests/avocado: ppc64 reverse debugging tests for pseries and powernv") Fixes: be52eca30978 ("tests/acceptance: add reverse debugging test") Tested-by: Thomas Huth Signed-off-by: Nicholas Piggin Message-ID: <20231116115354.228678-1-npiggin@gmail.com> Signed-off-by: Thomas Huth --- tests/avocado/reverse_debugging.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/avocado/reverse_debugging.py b/tests/avocado/reverse_debugging.py index fc47874eda..128d85bc0e 100644 --- a/tests/avocado/reverse_debugging.py +++ b/tests/avocado/reverse_debugging.py @@ -12,6 +12,7 @@ import logging from avocado import skipIf from avocado_qemu import BUILD_DIR +from avocado.utils import datadrainer from avocado.utils import gdb from avocado.utils import process from avocado.utils.network.ports import find_free_port @@ -52,6 +53,10 @@ class ReverseDebugging(LinuxKernelTest): if args: vm.add_args(*args) vm.launch() + console_drainer = datadrainer.LineLogger(vm.console_socket.fileno(), + logger=self.log.getChild('console'), + stop_check=(lambda : not vm.is_running())) + console_drainer.start() return vm @staticmethod From c4d74ab24a02c90b7a3240510b3dd4e1bec536dd Mon Sep 17 00:00:00 2001 From: Nicholas Piggin Date: Thu, 16 Nov 2023 21:53:54 +1000 Subject: [PATCH 10/10] tests/avocado: Enable reverse_debugging.py tests in gitlab CI Let's try enable reverse_debugging.py in gitlab CI. Signed-off-by: Nicholas Piggin Message-ID: <20231116115354.228678-3-npiggin@gmail.com> Signed-off-by: Thomas Huth --- tests/avocado/reverse_debugging.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/avocado/reverse_debugging.py b/tests/avocado/reverse_debugging.py index 128d85bc0e..b1410e7a69 100644 --- a/tests/avocado/reverse_debugging.py +++ b/tests/avocado/reverse_debugging.py @@ -205,8 +205,6 @@ class ReverseDebugging_X86_64(ReverseDebugging): return self.get_reg_le(g, self.REG_PC) \ + self.get_reg_le(g, self.REG_CS) * 0x10 - # unidentified gitlab timeout problem - @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') def test_x86_64_pc(self): """ :avocado: tags=arch:x86_64 @@ -222,8 +220,6 @@ class ReverseDebugging_AArch64(ReverseDebugging): REG_PC = 32 - # unidentified gitlab timeout problem - @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') def test_aarch64_virt(self): """ :avocado: tags=arch:aarch64 @@ -246,8 +242,6 @@ class ReverseDebugging_ppc64(ReverseDebugging): REG_PC = 0x40 - # unidentified gitlab timeout problem - @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') def test_ppc64_pseries(self): """ :avocado: tags=arch:ppc64 @@ -259,7 +253,6 @@ class ReverseDebugging_ppc64(ReverseDebugging): self.endian_is_le = False self.reverse_debugging() - @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') def test_ppc64_powernv(self): """ :avocado: tags=arch:ppc64