xref: /qemu/tests/functional/qemu_test/decorators.py (revision 53f3a13ac1069975ad47cf8bd05cc96b4ac09962)
13ea06d65SDaniel P. Berrangé# SPDX-License-Identifier: GPL-2.0-or-later
23ea06d65SDaniel P. Berrangé#
33ea06d65SDaniel P. Berrangé# Decorators useful in functional tests
43ea06d65SDaniel P. Berrangé
5aca2c48eSThomas Huthimport importlib
63ea06d65SDaniel P. Berrangéimport os
73ea06d65SDaniel P. Berrangéimport platform
8*00f119f4SPhilippe Mathieu-Daudéfrom unittest import skipIf, skipUnless
93ea06d65SDaniel P. Berrangé
103ea06d65SDaniel P. Berrangéfrom .cmd import which
113ea06d65SDaniel P. Berrangé
123ea06d65SDaniel P. Berrangé'''
133ea06d65SDaniel P. BerrangéDecorator to skip execution of a test if the list
143ea06d65SDaniel P. Berrangéof command binaries is not available in $PATH.
153ea06d65SDaniel P. BerrangéExample:
163ea06d65SDaniel P. Berrangé
173ea06d65SDaniel P. Berrangé  @skipIfMissingCommands("mkisofs", "losetup")
183ea06d65SDaniel P. Berrangé'''
193ea06d65SDaniel P. Berrangédef skipIfMissingCommands(*args):
20257de641SThomas Huth    has_cmds = True
21257de641SThomas Huth    for cmd in args:
223ea06d65SDaniel P. Berrangé         if not which(cmd):
23257de641SThomas Huth             has_cmds = False
24257de641SThomas Huth             break
253ea06d65SDaniel P. Berrangé
26257de641SThomas Huth    return skipUnless(has_cmds, 'required command(s) "%s" not installed' %
273ea06d65SDaniel P. Berrangé                                ", ".join(args))
283ea06d65SDaniel P. Berrangé
293ea06d65SDaniel P. Berrangé'''
303ea06d65SDaniel P. BerrangéDecorator to skip execution of a test if the current
31*00f119f4SPhilippe Mathieu-Daudéhost operating system does match one of the prohibited
32*00f119f4SPhilippe Mathieu-Daudéones.
33*00f119f4SPhilippe Mathieu-DaudéExample
34*00f119f4SPhilippe Mathieu-Daudé
35*00f119f4SPhilippe Mathieu-Daudé  @skipIfOperatingSystem("Linux", "Darwin")
36*00f119f4SPhilippe Mathieu-Daudé'''
37*00f119f4SPhilippe Mathieu-Daudédef skipIfOperatingSystem(*args):
38*00f119f4SPhilippe Mathieu-Daudé    return skipIf(platform.system() in args,
39*00f119f4SPhilippe Mathieu-Daudé                  'running on an OS (%s) that is not able to run this test' %
40*00f119f4SPhilippe Mathieu-Daudé                  ", ".join(args))
41*00f119f4SPhilippe Mathieu-Daudé
42*00f119f4SPhilippe Mathieu-Daudé'''
43*00f119f4SPhilippe Mathieu-DaudéDecorator to skip execution of a test if the current
443ea06d65SDaniel P. Berrangéhost machine does not match one of the permitted
453ea06d65SDaniel P. Berrangémachines.
463ea06d65SDaniel P. BerrangéExample
473ea06d65SDaniel P. Berrangé
483ea06d65SDaniel P. Berrangé  @skipIfNotMachine("x86_64", "aarch64")
493ea06d65SDaniel P. Berrangé'''
503ea06d65SDaniel P. Berrangédef skipIfNotMachine(*args):
51257de641SThomas Huth    return skipUnless(platform.machine() in args,
523ea06d65SDaniel P. Berrangé                      'not running on one of the required machine(s) "%s"' %
533ea06d65SDaniel P. Berrangé                      ", ".join(args))
543ea06d65SDaniel P. Berrangé
553ea06d65SDaniel P. Berrangé'''
563ea06d65SDaniel P. BerrangéDecorator to skip execution of flaky tests, unless
573ea06d65SDaniel P. Berrangéthe $QEMU_TEST_FLAKY_TESTS environment variable is set.
583ea06d65SDaniel P. BerrangéA bug URL must be provided that documents the observed
593ea06d65SDaniel P. Berrangéfailure behaviour, so it can be tracked & re-evaluated
603ea06d65SDaniel P. Berrangéin future.
613ea06d65SDaniel P. Berrangé
623ea06d65SDaniel P. BerrangéHistorical tests may be providing "None" as the bug_url
633ea06d65SDaniel P. Berrangébut this should not be done for new test.
643ea06d65SDaniel P. Berrangé
653ea06d65SDaniel P. BerrangéExample:
663ea06d65SDaniel P. Berrangé
673ea06d65SDaniel P. Berrangé  @skipFlakyTest("https://gitlab.com/qemu-project/qemu/-/issues/NNN")
683ea06d65SDaniel P. Berrangé'''
693ea06d65SDaniel P. Berrangédef skipFlakyTest(bug_url):
703ea06d65SDaniel P. Berrangé    if bug_url is None:
713ea06d65SDaniel P. Berrangé        bug_url = "FIXME: reproduce flaky test and file bug report or remove"
723ea06d65SDaniel P. Berrangé    return skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'),
733ea06d65SDaniel P. Berrangé                      f'Test is unstable: {bug_url}')
743ea06d65SDaniel P. Berrangé
753ea06d65SDaniel P. Berrangé'''
763ea06d65SDaniel P. BerrangéDecorator to skip execution of tests which are likely
773ea06d65SDaniel P. Berrangéto execute untrusted commands on the host, or commands
783ea06d65SDaniel P. Berrangéwhich process untrusted code, unless the
793ea06d65SDaniel P. Berrangé$QEMU_TEST_ALLOW_UNTRUSTED_CODE env var is set.
803ea06d65SDaniel P. BerrangéExample:
813ea06d65SDaniel P. Berrangé
823ea06d65SDaniel P. Berrangé  @skipUntrustedTest()
833ea06d65SDaniel P. Berrangé'''
843ea06d65SDaniel P. Berrangédef skipUntrustedTest():
853ea06d65SDaniel P. Berrangé    return skipUnless(os.getenv('QEMU_TEST_ALLOW_UNTRUSTED_CODE'),
863ea06d65SDaniel P. Berrangé                      'Test runs untrusted code / processes untrusted data')
873ea06d65SDaniel P. Berrangé
883ea06d65SDaniel P. Berrangé'''
893ea06d65SDaniel P. BerrangéDecorator to skip execution of tests which need large
903ea06d65SDaniel P. Berrangédata storage (over around 500MB-1GB mark) on the host,
913ea06d65SDaniel P. Berrangéunless the $QEMU_TEST_ALLOW_LARGE_STORAGE environment
923ea06d65SDaniel P. Berrangévariable is set
933ea06d65SDaniel P. Berrangé
943ea06d65SDaniel P. BerrangéExample:
953ea06d65SDaniel P. Berrangé
963ea06d65SDaniel P. Berrangé  @skipBigDataTest()
973ea06d65SDaniel P. Berrangé'''
983ea06d65SDaniel P. Berrangédef skipBigDataTest():
993ea06d65SDaniel P. Berrangé    return skipUnless(os.getenv('QEMU_TEST_ALLOW_LARGE_STORAGE'),
1003ea06d65SDaniel P. Berrangé                      'Test requires large host storage space')
1013ea06d65SDaniel P. Berrangé
1023ea06d65SDaniel P. Berrangé'''
1034ae633b0SThomas HuthDecorator to skip execution of tests which have a really long
1044ae633b0SThomas Huthruntime (and might e.g. time out if QEMU has been compiled with
1054ae633b0SThomas Huthdebugging enabled) unless the $QEMU_TEST_ALLOW_SLOW
1064ae633b0SThomas Huthenvironment variable is set
1074ae633b0SThomas Huth
1084ae633b0SThomas HuthExample:
1094ae633b0SThomas Huth
1104ae633b0SThomas Huth  @skipSlowTest()
1114ae633b0SThomas Huth'''
1124ae633b0SThomas Huthdef skipSlowTest():
1134ae633b0SThomas Huth    return skipUnless(os.getenv('QEMU_TEST_ALLOW_SLOW'),
1144ae633b0SThomas Huth                      'Test has a very long runtime and might time out')
1154ae633b0SThomas Huth
1164ae633b0SThomas Huth'''
1173ea06d65SDaniel P. BerrangéDecorator to skip execution of a test if the list
1183ea06d65SDaniel P. Berrangéof python imports is not available.
1193ea06d65SDaniel P. BerrangéExample:
1203ea06d65SDaniel P. Berrangé
1213ea06d65SDaniel P. Berrangé  @skipIfMissingImports("numpy", "cv2")
1223ea06d65SDaniel P. Berrangé'''
1233ea06d65SDaniel P. Berrangédef skipIfMissingImports(*args):
124257de641SThomas Huth    has_imports = True
125257de641SThomas Huth    for impname in args:
1263ea06d65SDaniel P. Berrangé        try:
127aca2c48eSThomas Huth            importlib.import_module(impname)
1283ea06d65SDaniel P. Berrangé        except ImportError:
129257de641SThomas Huth            has_imports = False
130257de641SThomas Huth            break
1313ea06d65SDaniel P. Berrangé
132257de641SThomas Huth    return skipUnless(has_imports, 'required import(s) "%s" not installed' %
1333ea06d65SDaniel P. Berrangé                                   ", ".join(args))
134