[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 07/32] tests/functional: introduce some helpful decorators
From: |
Daniel P . Berrangé |
Subject: |
[PATCH v3 07/32] tests/functional: introduce some helpful decorators |
Date: |
Tue, 17 Dec 2024 15:59:28 +0000 |
Reduce repeated boilerplate with some helper decorators:
@skipIfNotPlatform("x86_64", "aarch64")
=> Skip unless the build host platform matches
@skipIfMissingCommands("mkisofs", "losetup")
=> Skips unless all listed commands are found in $PATH
@skipIfMissingImports("numpy", "cv2")
=> Skips unless all listed modules can be imported
@skipFlakyTest("https://gitlab.com/qemu-project/qemu/-/issues/NNN")
=> Skips unless env var requests flaky tests with the
reason documented in the referenced gitlab bug
@skipBigData
=> Skips unless env var permits tests creating big data files
@skipUntrustedTest
=> Skips unless env var permits tests which are potentially
dangerous to the host
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
tests/functional/qemu_test/__init__.py | 3 +
tests/functional/qemu_test/decorators.py | 107 +++++++++++++++++++++++
2 files changed, 110 insertions(+)
create mode 100644 tests/functional/qemu_test/decorators.py
diff --git a/tests/functional/qemu_test/__init__.py
b/tests/functional/qemu_test/__init__.py
index 8fddddbe67..7dee3522f2 100644
--- a/tests/functional/qemu_test/__init__.py
+++ b/tests/functional/qemu_test/__init__.py
@@ -13,3 +13,6 @@
exec_command, exec_command_and_wait_for_pattern, get_qemu_img, which
from .testcase import QemuBaseTest, QemuUserTest, QemuSystemTest
from .linuxkernel import LinuxKernelTest
+from .decorators import skipIfMissingCommands, skipIfNotMachine, \
+ skipFlakyTest, skipUntrustedTest, skipBigDataTest, \
+ skipIfMissingImports
diff --git a/tests/functional/qemu_test/decorators.py
b/tests/functional/qemu_test/decorators.py
new file mode 100644
index 0000000000..df088bc090
--- /dev/null
+++ b/tests/functional/qemu_test/decorators.py
@@ -0,0 +1,107 @@
+# 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))
--
2.46.0
- [PATCH v3 00/32] tests/functional: various improvements wrt assets/scratch files, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 01/32] tests/functional: add execute permission to aspeed tests, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 02/32] tests/functional: remove many unused imports, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 04/32] tests/functional: remove duplicated 'which' function impl, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 05/32] tests/functional: simplify 'which' implementation, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 03/32] tests/functional: resolve str(Asset) to cache file path, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 06/32] tests/functional: drop 'tesseract_available' helper, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 07/32] tests/functional: introduce some helpful decorators,
Daniel P . Berrangé <=
- [PATCH v3 08/32] tests/functional: switch to new test skip decorators, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 10/32] tests/functional: add helpers for building file paths, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 09/32] tests/functional: drop 'has_cmd' and 'has_cmds' helpers, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 11/32] tests/functional: switch over to using self.log_file(...), Daniel P . Berrangé, 2024/12/17
- [PATCH v3 12/32] tests/functional: switch over to using self.build_file(...), Daniel P . Berrangé, 2024/12/17
- [PATCH v3 13/32] tests/functional: switch over to using self.data_file(...), Daniel P . Berrangé, 2024/12/17
- [PATCH v3 14/32] tests/functional: switch over to using self.scratch_file(), Daniel P . Berrangé, 2024/12/17
- [PATCH v3 17/32] tests/functional: move uncompress handling into new uncompress.py file, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 18/32] tests/functional: add common zip_extract helper, Daniel P . Berrangé, 2024/12/17
- [PATCH v3 16/32] tests/functional: move archive handling into new archive.py file, Daniel P . Berrangé, 2024/12/17