# SPDX-License-Identifier: GPL-2.0-or-later # # Decorators useful in functional tests import os import platform from unittest import skipUnless from .cmd import which ''' Decorator to skip execution of a test if the list of command binaries is not available in $PATH. Example: @skipIfMissingCommands("mkisofs", "losetup") ''' def skipIfMissingCommands(*args): def has_cmds(cmdlist): for cmd in cmdlist: if not which(cmd): return False return True return skipUnless(lambda: has_cmds(args), 'required command(s) "%s" not installed' % ", ".join(args)) ''' Decorator to skip execution of a test if the current host machine does not match one of the permitted machines. Example @skipIfNotMachine("x86_64", "aarch64") ''' def skipIfNotMachine(*args): return skipUnless(lambda: platform.machine() in args, 'not running on one of the required machine(s) "%s"' % ", ".join(args)) ''' Decorator to skip execution of flaky tests, unless the $QEMU_TEST_FLAKY_TESTS environment variable is set. A bug URL must be provided that documents the observed failure behaviour, so it can be tracked & re-evaluated in future. Historical tests may be providing "None" as the bug_url but this should not be done for new test. Example: @skipFlakyTest("https://gitlab.com/qemu-project/qemu/-/issues/NNN") ''' def skipFlakyTest(bug_url): if bug_url is None: bug_url = "FIXME: reproduce flaky test and file bug report or remove" return skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), f'Test is unstable: {bug_url}') ''' Decorator to skip execution of tests which are likely to execute untrusted commands on the host, or commands which process untrusted code, unless the $QEMU_TEST_ALLOW_UNTRUSTED_CODE env var is set. Example: @skipUntrustedTest() ''' def skipUntrustedTest(): return skipUnless(os.getenv('QEMU_TEST_ALLOW_UNTRUSTED_CODE'), 'Test runs untrusted code / processes untrusted data') ''' Decorator to skip execution of tests which need large data storage (over around 500MB-1GB mark) on the host, unless the $QEMU_TEST_ALLOW_LARGE_STORAGE environment variable is set Example: @skipBigDataTest() ''' def skipBigDataTest(): return skipUnless(os.getenv('QEMU_TEST_ALLOW_LARGE_STORAGE'), 'Test requires large host storage space') ''' Decorator to skip execution of a test if the list of python imports is not available. Example: @skipIfMissingImports("numpy", "cv2") ''' def skipIfMissingImports(*args): def has_imports(importlist): for impname in importlist: try: import impname except ImportError: return False return True return skipUnless(lambda: has_imports(args), 'required import(s) "%s" not installed' % ", ".join(args))