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