Signed-off-by: Michał Górny <mgo...@gentoo.org>
---
 eclass/distutils-r1.eclass    |  3 +++
 eclass/python-utils-r1.eclass | 22 ++++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index 4e77237c3009..014669c8c47c 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -618,6 +618,9 @@ distutils_enable_tests() {
                        ;;
                pytest)
                        test_pkgs='>=dev-python/pytest-7.3.1[${PYTHON_USEDEP}]'
+                       if [[ -n ${EPYTEST_TIMEOUT} ]]; then
+                               test_pkgs+=' 
dev-python/pytest-timeout[${PYTHON_USEDEP}]'
+                       fi
                        if [[ ${EPYTEST_XDIST} ]]; then
                                test_pkgs+=' 
dev-python/pytest-xdist[${PYTHON_USEDEP}]'
                        fi
diff --git a/eclass/python-utils-r1.eclass b/eclass/python-utils-r1.eclass
index 27fb92a75aca..22ab778b7e11 100644
--- a/eclass/python-utils-r1.eclass
+++ b/eclass/python-utils-r1.eclass
@@ -1296,6 +1296,16 @@ _python_check_occluded_packages() {
 # parameter, when calling epytest.  The listed files will be entirely
 # skipped from test collection.
 
+# @ECLASS_VARIABLE: EPYTEST_TIMEOUT
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# If set to a non-empty value, enables pytest-timeout plugin and sets
+# test timeout to the specified value.  This variable can be either set
+# in ebuilds that are known to hang, or by user to prevent hangs
+# in automated test environments.  If this variable is set prior
+# to calling distutils_enable_tests in distutils-r1, a test dependency
+# on dev-python/pytest-timeout is added automatically.
+
 # @ECLASS_VARIABLE: EPYTEST_XDIST
 # @DEFAULT_UNSET
 # @DESCRIPTION:
@@ -1381,6 +1391,18 @@ epytest() {
                )
        fi
 
+       if [[ -n ${EPYTEST_TIMEOUT} ]]; then
+               if [[ ${PYTEST_PLUGINS} != *pytest_timeout* ]]; then
+                       args+=(
+                               -p timeout
+                       )
+               fi
+
+               args+=(
+                       "--timeout=${EPYTEST_TIMEOUT}"
+               )
+       fi
+
        if [[ ${EPYTEST_XDIST} ]]; then
                local jobs=${EPYTEST_JOBS:-$(makeopts_jobs)}
                if [[ ${jobs} -gt 1 ]]; then
-- 
2.43.0


Reply via email to