tests/functional: Add a decorator for skipping long running tests

Some tests have a very long runtime and might run into timeout issues
e.g. when QEMU has been compiled with --enable-debug. Add a decorator
for marking them more easily. Rename the corresponding environment
variable to be more in sync with the other QEMU_TEST_ALLOW_* switches
that we already have, and add a paragraph about it in the documentation.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20250128152839.184599-2-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Thomas Huth 2025-01-28 16:28:35 +01:00
parent fc9fea48be
commit 4ae633b012
6 changed files with 31 additions and 13 deletions

View file

@ -351,5 +351,13 @@ the code snippet below:
Tests should not live in this state forever and should either be fixed
or eventually removed.
QEMU_TEST_ALLOW_SLOW
^^^^^^^^^^^^^^^^^^^^
Tests that have a very long runtime and might run into timeout issues
e.g. if the QEMU binary has been compiled with debugging options enabled.
To avoid these timeout issues by default and to save some precious CPU
cycles during normal testing, such tests are disabled by default unless
the QEMU_TEST_ALLOW_SLOW environment variable has been set.
.. _unittest: https://docs.python.org/3/library/unittest.html

View file

@ -14,7 +14,7 @@ from .cmd import is_readable_executable_file, \
from .testcase import QemuBaseTest, QemuUserTest, QemuSystemTest
from .linuxkernel import LinuxKernelTest
from .decorators import skipIfMissingCommands, skipIfNotMachine, \
skipFlakyTest, skipUntrustedTest, skipBigDataTest, \
skipFlakyTest, skipUntrustedTest, skipBigDataTest, skipSlowTest, \
skipIfMissingImports
from .archive import archive_extract
from .uncompress import uncompress

View file

@ -86,6 +86,20 @@ def skipBigDataTest():
return skipUnless(os.getenv('QEMU_TEST_ALLOW_LARGE_STORAGE'),
'Test requires large host storage space')
'''
Decorator to skip execution of tests which have a really long
runtime (and might e.g. time out if QEMU has been compiled with
debugging enabled) unless the $QEMU_TEST_ALLOW_SLOW
environment variable is set
Example:
@skipSlowTest()
'''
def skipSlowTest():
return skipUnless(os.getenv('QEMU_TEST_ALLOW_SLOW'),
'Test has a very long runtime and might time out')
'''
Decorator to skip execution of a test if the list
of python imports is not available.

View file

@ -10,7 +10,7 @@
import os
from qemu_test import QemuSystemTest, Asset
from qemu_test import QemuSystemTest, Asset, skipSlowTest
from qemu_test import wait_for_console_pattern
from unittest import skipUnless
from test_aarch64_sbsaref import fetch_firmware
@ -53,8 +53,7 @@ class Aarch64SbsarefAlpine(QemuSystemTest):
def test_sbsaref_alpine_linux_max_pauth_impdef(self):
self.boot_alpine_linux("max,pauth-impdef=on")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
@skipSlowTest() # Test might timeout due to PAuth emulation
def test_sbsaref_alpine_linux_max(self):
self.boot_alpine_linux("max")

View file

@ -10,9 +10,8 @@
import os
from qemu_test import QemuSystemTest, Asset
from qemu_test import QemuSystemTest, Asset, skipSlowTest
from qemu_test import wait_for_console_pattern
from unittest import skipUnless
from test_aarch64_sbsaref import fetch_firmware
@ -50,13 +49,11 @@ class Aarch64SbsarefFreeBSD(QemuSystemTest):
def test_sbsaref_freebsd14_max_pauth_off(self):
self.boot_freebsd14("max,pauth=off")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
@skipSlowTest() # Test might timeout due to PAuth emulation
def test_sbsaref_freebsd14_max_pauth_impdef(self):
self.boot_freebsd14("max,pauth-impdef=on")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
@skipSlowTest() # Test might timeout due to PAuth emulation
def test_sbsaref_freebsd14_max(self):
self.boot_freebsd14("max")

View file

@ -7,8 +7,8 @@
import os
from qemu_test import LinuxKernelTest, Asset, exec_command_and_wait_for_pattern
from qemu_test import interrupt_interactive_console_until_pattern
from unittest import skipUnless
from qemu_test import interrupt_interactive_console_until_pattern, skipSlowTest
class EmcraftSf2Machine(LinuxKernelTest):
@ -32,7 +32,7 @@ class EmcraftSf2Machine(LinuxKernelTest):
'20200711-gsj-qemu-0/nuvoton-npcm730-gsj.dtb'),
'3249b2da787d4b9ad4e61f315b160abfceb87b5e1895a7ce898ce7f40c8d4045')
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'), 'Test might timeout')
@skipSlowTest()
def test_arm_quanta_gsj(self):
self.set_machine('quanta-gsj')
image_path = self.uncompress(self.ASSET_IMAGE, format='gz')