From 0137f60b37c5678e9fa4971fd7e4f07afed33294 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 19 Aug 2025 13:24:01 +0200 Subject: tests/functional: Move the generic tests to a subfolder This also removes the line for using tests from the main folder since we do not have any tests left here. And while we're at it, also mark the vnc test as generic now since it is not specific to x86. Reviewed-by: Pierrick Bouvier Signed-off-by: Thomas Huth Message-ID: <20250819112403.432587-25-thuth@redhat.com> --- tests/functional/generic/meson.build | 14 +++ tests/functional/generic/test_empty_cpu_model.py | 24 +++++ tests/functional/generic/test_info_usernet.py | 34 +++++++ tests/functional/generic/test_version.py | 28 ++++++ tests/functional/generic/test_vnc.py | 116 +++++++++++++++++++++++ tests/functional/meson.build | 17 +--- tests/functional/test_empty_cpu_model.py | 24 ----- tests/functional/test_info_usernet.py | 34 ------- tests/functional/test_version.py | 28 ------ tests/functional/test_vnc.py | 116 ----------------------- tests/functional/x86_64/meson.build | 1 - 11 files changed, 218 insertions(+), 218 deletions(-) create mode 100644 tests/functional/generic/meson.build create mode 100755 tests/functional/generic/test_empty_cpu_model.py create mode 100755 tests/functional/generic/test_info_usernet.py create mode 100755 tests/functional/generic/test_version.py create mode 100755 tests/functional/generic/test_vnc.py delete mode 100755 tests/functional/test_empty_cpu_model.py delete mode 100755 tests/functional/test_info_usernet.py delete mode 100755 tests/functional/test_version.py delete mode 100755 tests/functional/test_vnc.py (limited to 'tests') diff --git a/tests/functional/generic/meson.build b/tests/functional/generic/meson.build new file mode 100644 index 0000000..013cc96 --- /dev/null +++ b/tests/functional/generic/meson.build @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +tests_generic_system = [ + 'empty_cpu_model', + 'info_usernet', + 'version', + 'vnc', +] + +tests_generic_linuxuser = [ +] + +tests_generic_bsduser = [ +] diff --git a/tests/functional/generic/test_empty_cpu_model.py b/tests/functional/generic/test_empty_cpu_model.py new file mode 100755 index 0000000..0081b06 --- /dev/null +++ b/tests/functional/generic/test_empty_cpu_model.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# +# Check for crash when using empty -cpu option +# +# Copyright (c) 2019 Red Hat, Inc. +# +# Author: +# Eduardo Habkost +# +# 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 QemuSystemTest + +class EmptyCPUModel(QemuSystemTest): + def test(self): + self.vm.add_args('-S', '-display', 'none', '-machine', 'none', '-cpu', '') + self.vm.set_qmp_monitor(enabled=False) + self.vm.launch() + self.vm.wait() + self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") + self.assertRegex(self.vm.get_log(), r'-cpu option cannot be empty') + +if __name__ == '__main__': + QemuSystemTest.main() diff --git a/tests/functional/generic/test_info_usernet.py b/tests/functional/generic/test_info_usernet.py new file mode 100755 index 0000000..e8cbc37 --- /dev/null +++ b/tests/functional/generic/test_info_usernet.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# +# Test for the hmp command "info usernet" +# +# Copyright (c) 2021 Red Hat, Inc. +# +# Author: +# Cleber Rosa +# +# 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 QemuSystemTest +from qemu_test.utils import get_usernet_hostfwd_port + + +class InfoUsernet(QemuSystemTest): + + def test_hostfwd(self): + self.require_netdev('user') + self.set_machine('none') + self.vm.add_args('-netdev', 'user,id=vnet,hostfwd=:127.0.0.1:0-:22') + self.vm.launch() + + port = get_usernet_hostfwd_port(self.vm) + self.assertIsNotNone(port, + ('"info usernet" output content does not seem to ' + 'contain the redirected port')) + self.assertGreater(port, 0, + ('Found a redirected port that is not greater than' + ' zero')) + +if __name__ == '__main__': + QemuSystemTest.main() diff --git a/tests/functional/generic/test_version.py b/tests/functional/generic/test_version.py new file mode 100755 index 0000000..3ab3b67 --- /dev/null +++ b/tests/functional/generic/test_version.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# +# Version check example test +# +# Copyright (c) 2018 Red Hat, Inc. +# +# Author: +# Cleber Rosa +# +# 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 QemuSystemTest + + +class Version(QemuSystemTest): + + def test_qmp_human_info_version(self): + self.set_machine('none') + self.vm.add_args('-nodefaults') + self.vm.launch() + res = self.vm.cmd('human-monitor-command', + command_line='info version') + self.assertRegex(res, r'^(\d+\.\d+\.\d)') + +if __name__ == '__main__': + QemuSystemTest.main() diff --git a/tests/functional/generic/test_vnc.py b/tests/functional/generic/test_vnc.py new file mode 100755 index 0000000..f1dd159 --- /dev/null +++ b/tests/functional/generic/test_vnc.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +# +# Simple functional tests for VNC functionality +# +# Copyright (c) 2018 Red Hat, Inc. +# +# Author: +# Cleber Rosa +# +# 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 socket + +from qemu.machine.machine import VMLaunchFailure +from qemu_test import QemuSystemTest +from qemu_test.ports import Ports + + +VNC_ADDR = '127.0.0.1' + +def check_connect(port: int) -> bool: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + try: + sock.connect((VNC_ADDR, port)) + except ConnectionRefusedError: + return False + + return True + +class Vnc(QemuSystemTest): + + def test_no_vnc_change_password(self): + self.set_machine('none') + self.vm.add_args('-nodefaults', '-S') + self.vm.launch() + + query_vnc_response = self.vm.qmp('query-vnc') + if 'error' in query_vnc_response: + self.assertEqual(query_vnc_response['error']['class'], + 'CommandNotFound') + self.skipTest('VNC support not available') + self.assertFalse(query_vnc_response['return']['enabled']) + + set_password_response = self.vm.qmp('change-vnc-password', + password='new_password') + self.assertIn('error', set_password_response) + self.assertEqual(set_password_response['error']['class'], + 'GenericError') + self.assertEqual(set_password_response['error']['desc'], + 'Could not set password') + + def launch_guarded(self): + try: + self.vm.launch() + except VMLaunchFailure as excp: + if "-vnc: invalid option" in excp.output: + self.skipTest("VNC support not available") + elif "Cipher backend does not support DES algorithm" in excp.output: + self.skipTest("No cryptographic backend available") + else: + self.log.info("unhandled launch failure: %s", excp.output) + raise excp + + def test_change_password_requires_a_password(self): + self.set_machine('none') + self.vm.add_args('-nodefaults', '-S', '-vnc', ':1,to=999') + self.launch_guarded() + self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled']) + set_password_response = self.vm.qmp('change-vnc-password', + password='new_password') + self.assertIn('error', set_password_response) + self.assertEqual(set_password_response['error']['class'], + 'GenericError') + self.assertEqual(set_password_response['error']['desc'], + 'Could not set password') + + def test_change_password(self): + self.set_machine('none') + self.vm.add_args('-nodefaults', '-S', '-vnc', ':1,to=999,password=on') + self.launch_guarded() + self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled']) + self.vm.cmd('change-vnc-password', + password='new_password') + + def do_test_change_listen(self, a, b, c): + self.assertFalse(check_connect(a)) + self.assertFalse(check_connect(b)) + self.assertFalse(check_connect(c)) + + self.vm.add_args('-nodefaults', '-S', '-vnc', f'{VNC_ADDR}:{a - 5900}') + self.launch_guarded() + self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(a)) + self.assertTrue(check_connect(a)) + self.assertFalse(check_connect(b)) + self.assertFalse(check_connect(c)) + + self.vm.cmd('display-update', type='vnc', + addresses=[{'type': 'inet', 'host': VNC_ADDR, + 'port': str(b)}, + {'type': 'inet', 'host': VNC_ADDR, + 'port': str(c)}]) + self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(b)) + self.assertFalse(check_connect(a)) + self.assertTrue(check_connect(b)) + self.assertTrue(check_connect(c)) + + def test_change_listen(self): + self.set_machine('none') + with Ports() as ports: + a, b, c = ports.find_free_ports(3) + self.do_test_change_listen(a, b, c) + + +if __name__ == '__main__': + QemuSystemTest.main() diff --git a/tests/functional/meson.build b/tests/functional/meson.build index b1eec16..2a0c5aa 100644 --- a/tests/functional/meson.build +++ b/tests/functional/meson.build @@ -36,18 +36,7 @@ subdir('sparc') subdir('sparc64') subdir('x86_64') subdir('xtensa') - -tests_generic_system = [ - 'empty_cpu_model', - 'info_usernet', - 'version', -] - -tests_generic_linuxuser = [ -] - -tests_generic_bsduser = [ -] +subdir('generic') precache_all = [] foreach speed : ['quick', 'thorough'] @@ -90,9 +79,7 @@ foreach speed : ['quick', 'thorough'] foreach test : target_tests testname = '@0@-@1@'.format(target_base, test) - if fs.exists('test_' + test + '.py') - testfile = 'test_' + test + '.py' - elif fs.exists('generic' / 'test_' + test + '.py') + if fs.exists('generic' / 'test_' + test + '.py') testfile = 'generic' / 'test_' + test + '.py' else testfile = target_base / 'test_' + test + '.py' diff --git a/tests/functional/test_empty_cpu_model.py b/tests/functional/test_empty_cpu_model.py deleted file mode 100755 index 0081b06..0000000 --- a/tests/functional/test_empty_cpu_model.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 -# -# Check for crash when using empty -cpu option -# -# Copyright (c) 2019 Red Hat, Inc. -# -# Author: -# Eduardo Habkost -# -# 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 QemuSystemTest - -class EmptyCPUModel(QemuSystemTest): - def test(self): - self.vm.add_args('-S', '-display', 'none', '-machine', 'none', '-cpu', '') - self.vm.set_qmp_monitor(enabled=False) - self.vm.launch() - self.vm.wait() - self.assertEqual(self.vm.exitcode(), 1, "QEMU exit code should be 1") - self.assertRegex(self.vm.get_log(), r'-cpu option cannot be empty') - -if __name__ == '__main__': - QemuSystemTest.main() diff --git a/tests/functional/test_info_usernet.py b/tests/functional/test_info_usernet.py deleted file mode 100755 index e8cbc37..0000000 --- a/tests/functional/test_info_usernet.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# -# Test for the hmp command "info usernet" -# -# Copyright (c) 2021 Red Hat, Inc. -# -# Author: -# Cleber Rosa -# -# 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 QemuSystemTest -from qemu_test.utils import get_usernet_hostfwd_port - - -class InfoUsernet(QemuSystemTest): - - def test_hostfwd(self): - self.require_netdev('user') - self.set_machine('none') - self.vm.add_args('-netdev', 'user,id=vnet,hostfwd=:127.0.0.1:0-:22') - self.vm.launch() - - port = get_usernet_hostfwd_port(self.vm) - self.assertIsNotNone(port, - ('"info usernet" output content does not seem to ' - 'contain the redirected port')) - self.assertGreater(port, 0, - ('Found a redirected port that is not greater than' - ' zero')) - -if __name__ == '__main__': - QemuSystemTest.main() diff --git a/tests/functional/test_version.py b/tests/functional/test_version.py deleted file mode 100755 index 3ab3b67..0000000 --- a/tests/functional/test_version.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -# -# Version check example test -# -# Copyright (c) 2018 Red Hat, Inc. -# -# Author: -# Cleber Rosa -# -# 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 QemuSystemTest - - -class Version(QemuSystemTest): - - def test_qmp_human_info_version(self): - self.set_machine('none') - self.vm.add_args('-nodefaults') - self.vm.launch() - res = self.vm.cmd('human-monitor-command', - command_line='info version') - self.assertRegex(res, r'^(\d+\.\d+\.\d)') - -if __name__ == '__main__': - QemuSystemTest.main() diff --git a/tests/functional/test_vnc.py b/tests/functional/test_vnc.py deleted file mode 100755 index f1dd159..0000000 --- a/tests/functional/test_vnc.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python3 -# -# Simple functional tests for VNC functionality -# -# Copyright (c) 2018 Red Hat, Inc. -# -# Author: -# Cleber Rosa -# -# 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 socket - -from qemu.machine.machine import VMLaunchFailure -from qemu_test import QemuSystemTest -from qemu_test.ports import Ports - - -VNC_ADDR = '127.0.0.1' - -def check_connect(port: int) -> bool: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - try: - sock.connect((VNC_ADDR, port)) - except ConnectionRefusedError: - return False - - return True - -class Vnc(QemuSystemTest): - - def test_no_vnc_change_password(self): - self.set_machine('none') - self.vm.add_args('-nodefaults', '-S') - self.vm.launch() - - query_vnc_response = self.vm.qmp('query-vnc') - if 'error' in query_vnc_response: - self.assertEqual(query_vnc_response['error']['class'], - 'CommandNotFound') - self.skipTest('VNC support not available') - self.assertFalse(query_vnc_response['return']['enabled']) - - set_password_response = self.vm.qmp('change-vnc-password', - password='new_password') - self.assertIn('error', set_password_response) - self.assertEqual(set_password_response['error']['class'], - 'GenericError') - self.assertEqual(set_password_response['error']['desc'], - 'Could not set password') - - def launch_guarded(self): - try: - self.vm.launch() - except VMLaunchFailure as excp: - if "-vnc: invalid option" in excp.output: - self.skipTest("VNC support not available") - elif "Cipher backend does not support DES algorithm" in excp.output: - self.skipTest("No cryptographic backend available") - else: - self.log.info("unhandled launch failure: %s", excp.output) - raise excp - - def test_change_password_requires_a_password(self): - self.set_machine('none') - self.vm.add_args('-nodefaults', '-S', '-vnc', ':1,to=999') - self.launch_guarded() - self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled']) - set_password_response = self.vm.qmp('change-vnc-password', - password='new_password') - self.assertIn('error', set_password_response) - self.assertEqual(set_password_response['error']['class'], - 'GenericError') - self.assertEqual(set_password_response['error']['desc'], - 'Could not set password') - - def test_change_password(self): - self.set_machine('none') - self.vm.add_args('-nodefaults', '-S', '-vnc', ':1,to=999,password=on') - self.launch_guarded() - self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled']) - self.vm.cmd('change-vnc-password', - password='new_password') - - def do_test_change_listen(self, a, b, c): - self.assertFalse(check_connect(a)) - self.assertFalse(check_connect(b)) - self.assertFalse(check_connect(c)) - - self.vm.add_args('-nodefaults', '-S', '-vnc', f'{VNC_ADDR}:{a - 5900}') - self.launch_guarded() - self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(a)) - self.assertTrue(check_connect(a)) - self.assertFalse(check_connect(b)) - self.assertFalse(check_connect(c)) - - self.vm.cmd('display-update', type='vnc', - addresses=[{'type': 'inet', 'host': VNC_ADDR, - 'port': str(b)}, - {'type': 'inet', 'host': VNC_ADDR, - 'port': str(c)}]) - self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(b)) - self.assertFalse(check_connect(a)) - self.assertTrue(check_connect(b)) - self.assertTrue(check_connect(c)) - - def test_change_listen(self): - self.set_machine('none') - with Ports() as ports: - a, b, c = ports.find_free_ports(3) - self.do_test_change_listen(a, b, c) - - -if __name__ == '__main__': - QemuSystemTest.main() diff --git a/tests/functional/x86_64/meson.build b/tests/functional/x86_64/meson.build index 696a9ec..d0b4667 100644 --- a/tests/functional/x86_64/meson.build +++ b/tests/functional/x86_64/meson.build @@ -16,7 +16,6 @@ tests_x86_64_system_quick = [ 'migration', 'pc_cpu_hotplug_props', 'virtio_version', - 'vnc', 'memlock', ] -- cgit v1.1