diff mbox series

[v2,2/5] python3-uvloop: enable ptest

Message ID 20261103193829.1806542-4-tim.orling@konsulko.com
State Changes Requested
Headers show
Series None | expand

Commit Message

Tim Orling Nov. 3, 2026, 7:38 p.m. UTC
From: Tim Orling <tim.orling@konsulko.com>

The sdist ships the test suite. run-ptest deselects:
* tests that conflict with pytest's output capture;
* tests broken by libuv 1.53.0 spawning with posix_spawn() on Linux,
  which bypasses uvloop's preexec_fn fork hook;
* DNS tests that wait for resolver timeouts without network access,
  which took the suite from 1 to 10 minutes over tap without NAT;
* on riscv64 only, TLS stress tests, the issue39 deadlock check and a
  socket cancellation test, whose fixed timeouts are too short for qemu
  without KVM.

.flake8 and mypy.ini let test_sourcecode skip cleanly when flake8 and
mypy are missing.

Tested with core-image-ptest-python3-uvloop on qemux86-64. It takes
over 30 seconds, so add it to PTESTS_SLOW.

AI-Generated: Uses Claude Code (Claude Opus 5.5)
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
Changes in v2:
- Skip 13 timing sensitive tests on riscv64 only, covering the
  qemuriscv64 AutoBuilder failures plus their counterparts in the other
  event loop class and test_socket_cancel_sock_sendall, found in 10 runs
  under load (stress-ng)
- Build the -k expression in a loop to fix patchtest's line length check
- Drop the test counts from the commit message

 .../distro/include/ptest-packagelists.inc     |  1 +
 .../python/python3-uvloop/run-ptest           | 50 +++++++++++++++++++
 .../python/python3-uvloop_0.22.1.bb           | 27 +++++++++-
 3 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100755 meta/recipes-devtools/python/python3-uvloop/run-ptest

Comments

Trevor Gamblin Nov. 3, 2026, 8:50 p.m. UTC | #1
On Tue Nov 3, 2026 at 2:38 PM EST, tim.orling wrote:
> From: Tim Orling <tim.orling@konsulko.com>
>
> The sdist ships the test suite. run-ptest deselects:
> * tests that conflict with pytest's output capture;
> * tests broken by libuv 1.53.0 spawning with posix_spawn() on Linux,
>   which bypasses uvloop's preexec_fn fork hook;
> * DNS tests that wait for resolver timeouts without network access,
>   which took the suite from 1 to 10 minutes over tap without NAT;
> * on riscv64 only, TLS stress tests, the issue39 deadlock check and a
>   socket cancellation test, whose fixed timeouts are too short for qemu
>   without KVM.
>
> .flake8 and mypy.ini let test_sourcecode skip cleanly when flake8 and
> mypy are missing.
>
> Tested with core-image-ptest-python3-uvloop on qemux86-64. It takes
> over 30 seconds, so add it to PTESTS_SLOW.
>
> AI-Generated: Uses Claude Code (Claude Opus 5.5)
> Signed-off-by: Tim Orling <tim.orling@konsulko.com>
> ---
> Changes in v2:
> - Skip 13 timing sensitive tests on riscv64 only, covering the
>   qemuriscv64 AutoBuilder failures plus their counterparts in the other
>   event loop class and test_socket_cancel_sock_sendall, found in 10 runs
>   under load (stress-ng)
> - Build the -k expression in a loop to fix patchtest's line length check
> - Drop the test counts from the commit message
>
>  .../distro/include/ptest-packagelists.inc     |  1 +
>  .../python/python3-uvloop/run-ptest           | 50 +++++++++++++++++++
>  .../python/python3-uvloop_0.22.1.bb           | 27 +++++++++-
>  3 files changed, 76 insertions(+), 2 deletions(-)
>  create mode 100755 meta/recipes-devtools/python/python3-uvloop/run-ptest
>
> diff --git a/meta/conf/distro/include/ptest-packagelists.inc b/meta/conf/distro/include/ptest-packagelists.inc
> index bef45bb4d5..50b971bace 100644
> --- a/meta/conf/distro/include/ptest-packagelists.inc
> +++ b/meta/conf/distro/include/ptest-packagelists.inc
> @@ -154,6 +154,7 @@ PTESTS_SLOW = "\
>      python3-click \
>      python3-cryptography \
>      python3-numpy \
> +    python3-uvloop \
>      python3-xmltodict \
>      strace \
>      tar \
> diff --git a/meta/recipes-devtools/python/python3-uvloop/run-ptest b/meta/recipes-devtools/python/python3-uvloop/run-ptest
> new file mode 100755
> index 0000000000..0cb9a26b88
> --- /dev/null
> +++ b/meta/recipes-devtools/python/python3-uvloop/run-ptest
> @@ -0,0 +1,50 @@
> +#!/bin/sh
> +# test_process_streams_redirect: replaces the stdout/stderr fds, which
> +# conflicts with pytest's output capture.
> +# test_process_preexec_fn_{1,2}, Test_UV_DNS test_getaddrinfo_{8,9}: libuv
> +# 1.53.0 spawns with posix_spawn(), so preexec_fn never runs, and an empty
> +# host gives EAI_NODATA.
> +# test_getaddrinfo_{1,2,3,5,6,11}, Test_AIO_DNS test_getaddrinfo_{8,9}: each
> +# DNS lookup waits for the resolver timeout without network access.
> +# --deselect matches a node id prefix, so -k handles 1, 2 and 11.
> +# riscv64: qemu runs without KVM there, too slow for the fixed timeouts in
> +# the TLS stress tests, the issue39 deadlock check (signal.alarm(5)) and
> +# test_socket_cancel_sock_sendall, which must cancel within 0.2s.
> +SLOW=""
> +if [ "$(uname -m)" = "riscv64" ]; then
> +    SLOW="
> +        --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_create_connection_ssl_1
> +        --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_create_server_ssl_over_ssl
> +        --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_renegotiation
> +        --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_create_connection_ssl_1
> +        --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_create_server_ssl_over_ssl
> +        --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_renegotiation
> +        --deselect=tests/test_unix.py::Test_UV_UnixSSL::test_create_unix_connection_ssl_1
> +        --deselect=tests/test_unix.py::Test_UV_UnixSSL::test_create_unix_server_ssl_1
> +        --deselect=tests/test_unix.py::Test_AIO_UnixSSL::test_create_unix_connection_ssl_1
> +        --deselect=tests/test_unix.py::Test_AIO_UnixSSL::test_create_unix_server_ssl_1
> +        --deselect=tests/test_regr1.py::TestIssue39Regr::test_issue39_regression
> +        --deselect=tests/test_sockets.py::TestUVSockets::test_socket_cancel_sock_sendall
> +        --deselect=tests/test_sockets.py::TestAIOSockets::test_socket_cancel_sock_sendall
> +    "
> +fi
> +KEEP="not (test_getaddrinfo_1 or test_getaddrinfo_2)"

This 'KEEP' variable name seems misleading given that it's using 'not' to avoid
running those two test cases, but then gets built up in a loop. I think it'd be
better to just add them with --deselect like the others, even if it ends up
being more verbose.

> +for n in 10 12 13 14 15 16 17 18 19 20 21 22; do
> +    KEEP="$KEEP or test_getaddrinfo_$n"
> +done
> +pytest --automake $SLOW \
> +    -k "$KEEP" \
> +    --deselect=tests/test_process.py::Test_UV_Process::test_process_streams_redirect \
> +    --deselect=tests/test_process.py::Test_AIO_Process::test_process_streams_redirect \
> +    --deselect=tests/test_process.py::Test_UV_Process::test_process_preexec_fn_1 \
> +    --deselect=tests/test_process.py::Test_UV_Process::test_process_preexec_fn_2 \
> +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_3 \
> +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_5 \
> +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_6 \
> +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_8 \
> +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_9 \
> +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_3 \
> +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_5 \
> +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_6 \
> +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_8 \
> +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_9

I wonder if we could keep this list inside the recipe file itself, similar to
how python3's recipe uses SKIPPED_TESTS with various appends? That example uses
unittest instead of pytest, but it should be possible to pass the list. Maybe
I'm wrong.

Trevor

> diff --git a/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb b/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
> index 887c262ae7..39b6a2602a 100644
> --- a/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
> +++ b/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
> @@ -7,11 +7,34 @@ LIC_FILES_CHKSUM = "file://LICENSE-APACHE;md5=bb92739ddad0a2811957bd98bdb90474 \
>  
>  DEPENDS += "libuv python3-wheel-native"
>  
> -SRC_URI += "file://0001-setup.cfg-use-system-libuv.patch"
> +SRC_URI += "\
> +    file://0001-setup.cfg-use-system-libuv.patch \
> +    file://run-ptest \
> +"
>  SRC_URI[sha256sum] = "6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f"
>  
> -inherit pypi python_setuptools_build_meta cython
> +inherit pypi python_setuptools_build_meta cython ptest-python-pytest
>  
>  RDEPENDS:${PN} = "python3-asyncio"
>  
> +RDEPENDS:${PN}-ptest += "\
> +    python3-ctypes \
> +    python3-io \
> +    python3-logging \
> +    python3-math \
> +    python3-multiprocessing \
> +    python3-netclient \
> +    python3-numbers \
> +    python3-pickle \
> +    python3-pprint \
> +    python3-psutil \
> +    python3-pyopenssl \
> +    python3-threading \
> +"
> +
> +do_install_ptest:append() {
> +    # test_sourcecode needs these to skip cleanly when flake8 and mypy are missing
> +    install -m 0644 ${S}/.flake8 ${S}/mypy.ini ${D}${PTEST_PATH}/
> +}
> +
>  BBCLASSEXTEND = "native nativesdk"
Tim Orling Nov. 3, 2026, 9:18 p.m. UTC | #2
On Tue, Nov 3, 2026 at 1:07 PM Trevor Gamblin via openembedded-core
<tgamblin=baylibre.com@lists.openembedded.org> wrote:

> On Tue Nov 3, 2026 at 2:38 PM EST, tim.orling wrote:
> > From: Tim Orling <tim.orling@konsulko.com>
> >
> > The sdist ships the test suite. run-ptest deselects:
> > * tests that conflict with pytest's output capture;
> > * tests broken by libuv 1.53.0 spawning with posix_spawn() on Linux,
> >   which bypasses uvloop's preexec_fn fork hook;
> > * DNS tests that wait for resolver timeouts without network access,
> >   which took the suite from 1 to 10 minutes over tap without NAT;
> > * on riscv64 only, TLS stress tests, the issue39 deadlock check and a
> >   socket cancellation test, whose fixed timeouts are too short for qemu
> >   without KVM.
> >
> > .flake8 and mypy.ini let test_sourcecode skip cleanly when flake8 and
> > mypy are missing.
> >
> > Tested with core-image-ptest-python3-uvloop on qemux86-64. It takes
> > over 30 seconds, so add it to PTESTS_SLOW.
> >
> > AI-Generated: Uses Claude Code (Claude Opus 5.5)
> > Signed-off-by: Tim Orling <tim.orling@konsulko.com>
> > ---
> > Changes in v2:
> > - Skip 13 timing sensitive tests on riscv64 only, covering the
> >   qemuriscv64 AutoBuilder failures plus their counterparts in the other
> >   event loop class and test_socket_cancel_sock_sendall, found in 10 runs
> >   under load (stress-ng)
> > - Build the -k expression in a loop to fix patchtest's line length check
> > - Drop the test counts from the commit message
> >
> >  .../distro/include/ptest-packagelists.inc     |  1 +
> >  .../python/python3-uvloop/run-ptest           | 50 +++++++++++++++++++
> >  .../python/python3-uvloop_0.22.1.bb           | 27 +++++++++-
> >  3 files changed, 76 insertions(+), 2 deletions(-)
> >  create mode 100755 meta/recipes-devtools/python/python3-uvloop/run-ptest
> >
> > diff --git a/meta/conf/distro/include/ptest-packagelists.inc
> b/meta/conf/distro/include/ptest-packagelists.inc
> > index bef45bb4d5..50b971bace 100644
> > --- a/meta/conf/distro/include/ptest-packagelists.inc
> > +++ b/meta/conf/distro/include/ptest-packagelists.inc
> > @@ -154,6 +154,7 @@ PTESTS_SLOW = "\
> >      python3-click \
> >      python3-cryptography \
> >      python3-numpy \
> > +    python3-uvloop \
> >      python3-xmltodict \
> >      strace \
> >      tar \
> > diff --git a/meta/recipes-devtools/python/python3-uvloop/run-ptest
> b/meta/recipes-devtools/python/python3-uvloop/run-ptest
> > new file mode 100755
> > index 0000000000..0cb9a26b88
> > --- /dev/null
> > +++ b/meta/recipes-devtools/python/python3-uvloop/run-ptest
> > @@ -0,0 +1,50 @@
> > +#!/bin/sh
> > +# test_process_streams_redirect: replaces the stdout/stderr fds, which
> > +# conflicts with pytest's output capture.
> > +# test_process_preexec_fn_{1,2}, Test_UV_DNS test_getaddrinfo_{8,9}:
> libuv
> > +# 1.53.0 spawns with posix_spawn(), so preexec_fn never runs, and an
> empty
> > +# host gives EAI_NODATA.
> > +# test_getaddrinfo_{1,2,3,5,6,11}, Test_AIO_DNS test_getaddrinfo_{8,9}:
> each
> > +# DNS lookup waits for the resolver timeout without network access.
> > +# --deselect matches a node id prefix, so -k handles 1, 2 and 11.
> > +# riscv64: qemu runs without KVM there, too slow for the fixed timeouts
> in
> > +# the TLS stress tests, the issue39 deadlock check (signal.alarm(5)) and
> > +# test_socket_cancel_sock_sendall, which must cancel within 0.2s.
> > +SLOW=""
> > +if [ "$(uname -m)" = "riscv64" ]; then
> > +    SLOW="
> > +
> --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_create_connection_ssl_1
> > +
> --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_create_server_ssl_over_ssl
> > +        --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_renegotiation
> > +
> --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_create_connection_ssl_1
> > +
> --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_create_server_ssl_over_ssl
> > +
> --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_renegotiation
> > +
> --deselect=tests/test_unix.py::Test_UV_UnixSSL::test_create_unix_connection_ssl_1
> > +
> --deselect=tests/test_unix.py::Test_UV_UnixSSL::test_create_unix_server_ssl_1
> > +
> --deselect=tests/test_unix.py::Test_AIO_UnixSSL::test_create_unix_connection_ssl_1
> > +
> --deselect=tests/test_unix.py::Test_AIO_UnixSSL::test_create_unix_server_ssl_1
> > +
> --deselect=tests/test_regr1.py::TestIssue39Regr::test_issue39_regression
> > +
> --deselect=tests/test_sockets.py::TestUVSockets::test_socket_cancel_sock_sendall
> > +
> --deselect=tests/test_sockets.py::TestAIOSockets::test_socket_cancel_sock_sendall
> > +    "
> > +fi
> > +KEEP="not (test_getaddrinfo_1 or test_getaddrinfo_2)"
>
> This 'KEEP' variable name seems misleading given that it's using 'not' to
> avoid
> running those two test cases, but then gets built up in a loop. I think
> it'd be
> better to just add them with --deselect like the others, even if it ends up
> being more verbose.
>
> > +for n in 10 12 13 14 15 16 17 18 19 20 21 22; do
> > +    KEEP="$KEEP or test_getaddrinfo_$n"
> > +done
> > +pytest --automake $SLOW \
> > +    -k "$KEEP" \
> > +
> --deselect=tests/test_process.py::Test_UV_Process::test_process_streams_redirect
> \
> > +
> --deselect=tests/test_process.py::Test_AIO_Process::test_process_streams_redirect
> \
> > +
> --deselect=tests/test_process.py::Test_UV_Process::test_process_preexec_fn_1
> \
> > +
> --deselect=tests/test_process.py::Test_UV_Process::test_process_preexec_fn_2
> \
> > +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_3 \
> > +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_5 \
> > +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_6 \
> > +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_8 \
> > +    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_9 \
> > +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_3 \
> > +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_5 \
> > +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_6 \
> > +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_8 \
> > +    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_9
>
> I wonder if we could keep this list inside the recipe file itself, similar
> to
> how python3's recipe uses SKIPPED_TESTS with various appends? That example
> uses
> unittest instead of pytest, but it should be possible to pass the list.
> Maybe
> I'm wrong.
>

Good points that honestly I was not aware of previously. I am working on a
SKIPPED_TESTS v3.

Thank you for the review!

--Tim


>
> Trevor
>
> > diff --git a/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
> b/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
> > index 887c262ae7..39b6a2602a 100644
> > --- a/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
> > +++ b/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
> > @@ -7,11 +7,34 @@ LIC_FILES_CHKSUM =
> "file://LICENSE-APACHE;md5=bb92739ddad0a2811957bd98bdb90474 \
> >
> >  DEPENDS += "libuv python3-wheel-native"
> >
> > -SRC_URI += "file://0001-setup.cfg-use-system-libuv.patch"
> > +SRC_URI += "\
> > +    file://0001-setup.cfg-use-system-libuv.patch \
> > +    file://run-ptest \
> > +"
> >  SRC_URI[sha256sum] =
> "6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f"
> >
> > -inherit pypi python_setuptools_build_meta cython
> > +inherit pypi python_setuptools_build_meta cython ptest-python-pytest
> >
> >  RDEPENDS:${PN} = "python3-asyncio"
> >
> > +RDEPENDS:${PN}-ptest += "\
> > +    python3-ctypes \
> > +    python3-io \
> > +    python3-logging \
> > +    python3-math \
> > +    python3-multiprocessing \
> > +    python3-netclient \
> > +    python3-numbers \
> > +    python3-pickle \
> > +    python3-pprint \
> > +    python3-psutil \
> > +    python3-pyopenssl \
> > +    python3-threading \
> > +"
> > +
> > +do_install_ptest:append() {
> > +    # test_sourcecode needs these to skip cleanly when flake8 and mypy
> are missing
> > +    install -m 0644 ${S}/.flake8 ${S}/mypy.ini ${D}${PTEST_PATH}/
> > +}
> > +
> >  BBCLASSEXTEND = "native nativesdk"
>
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#249298):
> https://lists.openembedded.org/g/openembedded-core/message/249298
> Mute This Topic: https://lists.openembedded.org/mt/122082304/924729
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> ticotimo@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
diff mbox series

Patch

diff --git a/meta/conf/distro/include/ptest-packagelists.inc b/meta/conf/distro/include/ptest-packagelists.inc
index bef45bb4d5..50b971bace 100644
--- a/meta/conf/distro/include/ptest-packagelists.inc
+++ b/meta/conf/distro/include/ptest-packagelists.inc
@@ -154,6 +154,7 @@  PTESTS_SLOW = "\
     python3-click \
     python3-cryptography \
     python3-numpy \
+    python3-uvloop \
     python3-xmltodict \
     strace \
     tar \
diff --git a/meta/recipes-devtools/python/python3-uvloop/run-ptest b/meta/recipes-devtools/python/python3-uvloop/run-ptest
new file mode 100755
index 0000000000..0cb9a26b88
--- /dev/null
+++ b/meta/recipes-devtools/python/python3-uvloop/run-ptest
@@ -0,0 +1,50 @@ 
+#!/bin/sh
+# test_process_streams_redirect: replaces the stdout/stderr fds, which
+# conflicts with pytest's output capture.
+# test_process_preexec_fn_{1,2}, Test_UV_DNS test_getaddrinfo_{8,9}: libuv
+# 1.53.0 spawns with posix_spawn(), so preexec_fn never runs, and an empty
+# host gives EAI_NODATA.
+# test_getaddrinfo_{1,2,3,5,6,11}, Test_AIO_DNS test_getaddrinfo_{8,9}: each
+# DNS lookup waits for the resolver timeout without network access.
+# --deselect matches a node id prefix, so -k handles 1, 2 and 11.
+# riscv64: qemu runs without KVM there, too slow for the fixed timeouts in
+# the TLS stress tests, the issue39 deadlock check (signal.alarm(5)) and
+# test_socket_cancel_sock_sendall, which must cancel within 0.2s.
+SLOW=""
+if [ "$(uname -m)" = "riscv64" ]; then
+    SLOW="
+        --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_create_connection_ssl_1
+        --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_create_server_ssl_over_ssl
+        --deselect=tests/test_tcp.py::Test_UV_TCPSSL::test_renegotiation
+        --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_create_connection_ssl_1
+        --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_create_server_ssl_over_ssl
+        --deselect=tests/test_tcp.py::Test_AIO_TCPSSL::test_renegotiation
+        --deselect=tests/test_unix.py::Test_UV_UnixSSL::test_create_unix_connection_ssl_1
+        --deselect=tests/test_unix.py::Test_UV_UnixSSL::test_create_unix_server_ssl_1
+        --deselect=tests/test_unix.py::Test_AIO_UnixSSL::test_create_unix_connection_ssl_1
+        --deselect=tests/test_unix.py::Test_AIO_UnixSSL::test_create_unix_server_ssl_1
+        --deselect=tests/test_regr1.py::TestIssue39Regr::test_issue39_regression
+        --deselect=tests/test_sockets.py::TestUVSockets::test_socket_cancel_sock_sendall
+        --deselect=tests/test_sockets.py::TestAIOSockets::test_socket_cancel_sock_sendall
+    "
+fi
+KEEP="not (test_getaddrinfo_1 or test_getaddrinfo_2)"
+for n in 10 12 13 14 15 16 17 18 19 20 21 22; do
+    KEEP="$KEEP or test_getaddrinfo_$n"
+done
+pytest --automake $SLOW \
+    -k "$KEEP" \
+    --deselect=tests/test_process.py::Test_UV_Process::test_process_streams_redirect \
+    --deselect=tests/test_process.py::Test_AIO_Process::test_process_streams_redirect \
+    --deselect=tests/test_process.py::Test_UV_Process::test_process_preexec_fn_1 \
+    --deselect=tests/test_process.py::Test_UV_Process::test_process_preexec_fn_2 \
+    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_3 \
+    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_5 \
+    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_6 \
+    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_8 \
+    --deselect=tests/test_dns.py::Test_UV_DNS::test_getaddrinfo_9 \
+    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_3 \
+    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_5 \
+    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_6 \
+    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_8 \
+    --deselect=tests/test_dns.py::Test_AIO_DNS::test_getaddrinfo_9
diff --git a/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb b/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
index 887c262ae7..39b6a2602a 100644
--- a/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
+++ b/meta/recipes-devtools/python/python3-uvloop_0.22.1.bb
@@ -7,11 +7,34 @@  LIC_FILES_CHKSUM = "file://LICENSE-APACHE;md5=bb92739ddad0a2811957bd98bdb90474 \
 
 DEPENDS += "libuv python3-wheel-native"
 
-SRC_URI += "file://0001-setup.cfg-use-system-libuv.patch"
+SRC_URI += "\
+    file://0001-setup.cfg-use-system-libuv.patch \
+    file://run-ptest \
+"
 SRC_URI[sha256sum] = "6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f"
 
-inherit pypi python_setuptools_build_meta cython
+inherit pypi python_setuptools_build_meta cython ptest-python-pytest
 
 RDEPENDS:${PN} = "python3-asyncio"
 
+RDEPENDS:${PN}-ptest += "\
+    python3-ctypes \
+    python3-io \
+    python3-logging \
+    python3-math \
+    python3-multiprocessing \
+    python3-netclient \
+    python3-numbers \
+    python3-pickle \
+    python3-pprint \
+    python3-psutil \
+    python3-pyopenssl \
+    python3-threading \
+"
+
+do_install_ptest:append() {
+    # test_sourcecode needs these to skip cleanly when flake8 and mypy are missing
+    install -m 0644 ${S}/.flake8 ${S}/mypy.ini ${D}${PTEST_PATH}/
+}
+
 BBCLASSEXTEND = "native nativesdk"