dangerzone/dev_scripts/pytest-wrapper.py
Alex Pyrgiotis e7eb3bf18b
dev_scripts: Fix a recursion issue in our PyTest wrapper
Fix an issue in our PyTest wrapper, that caused this recursion error:

```
  File "shibokensupport/signature/loader.py", line 61, in feature_importedgc
  File "shibokensupport/feature.py", line 137, in feature_importedgc
  File "shibokensupport/feature.py", line 148, in _mod_uses_pysidegc
  File "/usr/lib/python3.10/inspect.py", line 1147, in getsourcegc
    lines, lnum = getsourcelines(object)gc
  File "/usr/lib/python3.10/inspect.py", line 1129, in getsourcelinesgc
    lines, lnum = findsource(object)gc
  File "/usr/lib/python3.10/inspect.py", line 954, in findsourcegc
    lines = linecache.getlines(file, module.__dict__)gc
  File "/home/user/.cache/pypoetry/virtualenvs/dangerzone-hQU0mwlP-py3.10/lib/python3.10/site-packages/py/_vendored_packages/apipkg/__init__.py", line 177, in __dict__gc
    self.__makeattr(name)gc
  File "/home/user/.cache/pypoetry/virtualenvs/dangerzone-hQU0mwlP-py3.10/lib/python3.10/site-packages/py/_vendored_packages/apipkg/__init__.py", line 157, in __makeattrgc
    result = importobj(modpath, attrname)gc
  File "/home/user/.cache/pypoetry/virtualenvs/dangerzone-hQU0mwlP-py3.10/lib/python3.10/site-packages/py/_vendored_packages/apipkg/__init__.py", line 75, in importobjgc
    module = __import__(modpath, None, None, ["__doc__"])gc
  File "shibokensupport/signature/loader.py", line 54, in feature_importgc
RecursionError: maximum recursion depth exceededgc
```

This error seems to be related to
https://github.com/pytest-dev/pytest/issues/1794. By not importing
`pytest` in our test wrapper, and instead executing directly, we can
avoid it.

Note that this seems to be triggered only by Shiboken6, which is why we
hadn't previously encountered it.
2023-02-07 18:52:08 +02:00

62 lines
1.8 KiB
Python
Executable file

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# PyTest Wrapper script - temporary solution to tests failing non-deterministically [1]
# This is only fixed in podman v4.3.0. The wrapper essentially runs the tests in sequence
# when the podman version is lower.
#
# [1]: https://github.com/freedomofpress/dangerzone/issues/217
# FIXME this whole script should be removed and the respective Makefile calling line
# replaced once all supported platforms have a podman version >= v4.3.0.
import re
import subprocess
import sys
from pkg_resources import parse_version
from dangerzone.isolation_provider.container import Container
PODMAN_MIN_VERSION = "4.3.0"
def get_podman_version():
result = subprocess.run(
["podman", "version", "--format", "'{{.Client.Version}}'"], capture_output=True
)
version = result.stdout.decode()[:-1] # trim trailing \n
return version.split("-dev")[0] # exclude "-dev" suffix from version
def run_tests(pytest_args):
cmd = ["pytest"] + pytest_args
try:
subprocess.run(cmd, check=True)
except subprocess.CalledProcessError:
sys.exit(1)
def run_tests_in_parallel(pytest_args):
print("running tests in parallel")
run_tests(pytest_args + ["-n", "4"])
def run_tests_in_sequence(pytest_args):
print("running tests sequentially")
run_tests(pytest_args)
if __name__ == "__main__":
pytest_args = sys.argv[1:] # exclude program names
if Container.get_runtime_name() == "docker":
run_tests_in_parallel(pytest_args)
else:
podman_ver_minimum_parallel = parse_version(PODMAN_MIN_VERSION)
podman_ver_current = parse_version(get_podman_version())
if podman_ver_current >= podman_ver_minimum_parallel:
run_tests_in_parallel(pytest_args)
else:
run_tests_in_sequence(pytest_args)