-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathpytest_plugin.py
More file actions
139 lines (106 loc) · 3.37 KB
/
pytest_plugin.py
File metadata and controls
139 lines (106 loc) · 3.37 KB
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
from __future__ import annotations
import os
from typing import TYPE_CHECKING
import pytest
from .httpserver import HTTPServer
from .httpserver import ServerOptions
if TYPE_CHECKING:
from collections.abc import Generator
from ssl import SSLContext
class Plugin:
SERVER: PluginHTTPServer | None = None
class PluginHTTPServer(HTTPServer):
def start(self) -> None:
super().start()
Plugin.SERVER = self
def stop(self) -> None:
super().stop()
Plugin.SERVER = None
def get_httpserver_listen_address() -> tuple[str | None, int | None]:
listen_host = os.environ.get("PYTEST_HTTPSERVER_HOST")
listen_port_str = os.environ.get("PYTEST_HTTPSERVER_PORT")
listen_port: int | None = int(listen_port_str) if listen_port_str else None
return listen_host, listen_port
@pytest.fixture(scope="session")
def httpserver_listen_address() -> tuple[str | None, int | None]:
return get_httpserver_listen_address()
@pytest.fixture(scope="session")
def httpserver_ssl_context() -> None:
return None
@pytest.fixture(scope="session")
def httpserver_options() -> ServerOptions:
return ServerOptions()
@pytest.fixture(scope="session")
def make_httpserver(
httpserver_listen_address: tuple[str | None, int | None],
httpserver_ssl_context: SSLContext | None,
httpserver_options: ServerOptions,
) -> Generator[HTTPServer, None, None]:
host, port = httpserver_listen_address
if not host:
host = HTTPServer.DEFAULT_LISTEN_HOST
if not port:
port = HTTPServer.DEFAULT_LISTEN_PORT
server = HTTPServer.with_options(
host=host,
port=port,
ssl_context=httpserver_ssl_context,
options=httpserver_options,
)
server.start()
yield server
server.clear()
if server.is_running():
server.stop()
def pytest_sessionfinish(session: pytest.Session, exitstatus: int) -> None: # noqa: ARG001
if Plugin.SERVER is not None:
Plugin.SERVER.clear()
if Plugin.SERVER.is_running():
Plugin.SERVER.stop()
@pytest.fixture
def httpserver(make_httpserver: HTTPServer) -> HTTPServer:
server = make_httpserver
server.clear()
return server
@pytest.fixture(scope="session")
def make_httpserver_ipv4(
httpserver_ssl_context: SSLContext | None,
httpserver_options: ServerOptions,
) -> Generator[HTTPServer, None, None]:
server = HTTPServer.with_options(
host="127.0.0.1",
port=0,
ssl_context=httpserver_ssl_context,
options=httpserver_options,
)
server.start()
yield server
server.clear()
if server.is_running():
server.stop()
@pytest.fixture
def httpserver_ipv4(make_httpserver_ipv4: HTTPServer) -> HTTPServer:
server = make_httpserver_ipv4
server.clear()
return server
@pytest.fixture(scope="session")
def make_httpserver_ipv6(
httpserver_ssl_context: SSLContext | None,
httpserver_options: ServerOptions,
) -> Generator[HTTPServer, None, None]:
server = HTTPServer.with_options(
host="::1",
port=0,
ssl_context=httpserver_ssl_context,
options=httpserver_options,
)
server.start()
yield server
server.clear()
if server.is_running():
server.stop()
@pytest.fixture
def httpserver_ipv6(make_httpserver_ipv6: HTTPServer) -> HTTPServer:
server = make_httpserver_ipv6
server.clear()
return server