about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/python-modules/gradio/conftest-skip-network-errors.py
blob: 4738de31755267795ff48012fc9e892f14895ba1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# This is a pytest hook that skips tests that tries to access the network.
# These tests will immediately fail, then get marked as "Expected fail" (xfail).

from _pytest.runner import pytest_runtest_makereport as orig_pytest_runtest_makereport

# We use BaseException to minimize the chance it gets caught and 'pass'ed
class NixNetworkAccessDeniedError(BaseException):
    pass

def pytest_runtest_makereport(item, call):
    """
    Modifies test results after-the-fact. The function name is magic, see:
    https://docs.pytest.org/en/7.1.x/reference/reference.html?highlight=pytest_runtest_makereport#std-hook-pytest_runtest_makereport
    """

    def iterate_exc_chain(exc: Exception):
        """
        Recurses through exception chain, yielding all exceptions
        """
        yield exc
        if getattr(exc, "__context__", None) is not None:
            yield from iterate_exc_chain(exc.__context__)
        if getattr(exc, "__cause__", None) is not None:
            yield from iterate_exc_chain(exc.__cause__)

    tr = orig_pytest_runtest_makereport(item, call)
    if call.excinfo is not None:
        for exc in iterate_exc_chain(call.excinfo.value):
            if isinstance(exc, NixNetworkAccessDeniedError):
                tr.outcome, tr.wasxfail = 'skipped', "reason: Requires network access."
            if isinstance(exc, FileNotFoundError):  # gradio specific
                tr.outcome, tr.wasxfail = 'skipped', "reason: Pypi dist bad."
    return tr

# replace network access with exception

def deny_network_access(*a, **kw):
    raise NixNetworkAccessDeniedError

import httpx
import requests
import socket
import urllib
import urllib3
import websockets

httpx.AsyncClient.get = deny_network_access
httpx.AsyncClient.head = deny_network_access
httpx.Request = deny_network_access
requests.get = deny_network_access
requests.head = deny_network_access
requests.post = deny_network_access
socket.socket.connect = deny_network_access
urllib.request.Request = deny_network_access
urllib.request.urlopen = deny_network_access
urllib3.connection.HTTPSConnection._new_conn = deny_network_access
websockets.connect = deny_network_access