From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Thomas Huth <thuth@redhat.com>
Cc: qemu-devel@nongnu.org, "Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: Re: [PATCH] tests/functional: Fix broken decorators with lamda functions
Date: Wed, 22 Jan 2025 10:12:55 +0000 [thread overview]
Message-ID: <Z5DEp_Yq0LlrocnP@redhat.com> (raw)
In-Reply-To: <20250121065814.1092720-1-thuth@redhat.com>
On Tue, Jan 21, 2025 at 07:58:14AM +0100, Thomas Huth wrote:
> The decorators that use a lambda function are currently broken
> and do not properly skip the test if the condition is not met.
> Using "return skipUnless(lambda: ...)" does not work as expected.
> To fix it, rewrite the decorators without lambda, it's simpler
> that way anyway.
Urgh, I clearly failed to re-test this properly. Originally
I wasn't using skipUnless as a helper, but had implemented
something that looked pretty much like skipUnless and then
refactored it :-(
>
> skipIfMissingImports also needs to exec() the import statement,
> otherwise we always try to import a module called "impname" which
> does not exist.
Worth doing this as a separate commit.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> I've noticed the problem while trying to get the migration test
> through the CI:
> https://gitlab.com/thuth/qemu/-/jobs/8901960783#L100
> ... the OpenSUSE containers apparently lack the "nc" binary ...
>
> tests/functional/qemu_test/decorators.py | 44 +++++++++++-------------
> 1 file changed, 21 insertions(+), 23 deletions(-)
>
> diff --git a/tests/functional/qemu_test/decorators.py b/tests/functional/qemu_test/decorators.py
> index df088bc090..7750af7b7d 100644
> --- a/tests/functional/qemu_test/decorators.py
> +++ b/tests/functional/qemu_test/decorators.py
> @@ -16,15 +16,14 @@
> @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))
> + has_cmds = True
> + for cmd in args:
> + if not which(cmd):
> + has_cmds = False
> + break
> +
> + return skipUnless(has_cmds, 'required command(s) "%s" not installed' %
> + ", ".join(args))
>
> '''
> Decorator to skip execution of a test if the current
> @@ -35,9 +34,9 @@ def has_cmds(cmdlist):
> @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))
> + return skipUnless(platform.machine() in args,
> + 'not running on one of the required machine(s) "%s"' %
> + ", ".join(args))
>
> '''
> Decorator to skip execution of flaky tests, unless
> @@ -94,14 +93,13 @@ def skipBigDataTest():
> @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))
> + has_imports = True
> + for impname in args:
> + try:
> + exec('import %s' % impname)
I feel like the recommended approach would probably be to use
importlib.import_module(impname)
> + except ImportError:
> + has_imports = False
> + break
> +
> + return skipUnless(has_imports, 'required import(s) "%s" not installed' %
> + ", ".join(args))
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
prev parent reply other threads:[~2025-01-22 10:13 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-21 6:58 [PATCH] tests/functional: Fix broken decorators with lamda functions Thomas Huth
2025-01-22 10:12 ` Daniel P. Berrangé [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z5DEp_Yq0LlrocnP@redhat.com \
--to=berrange@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).