Skip to content

Commit 77972a5

Browse files
committed
[refactor] Moved tests related to tcp and udp port fixtures to a separate module
Signed-off-by: Michael Seifert <[email protected]>
1 parent 144277b commit 77972a5

File tree

2 files changed

+197
-160
lines changed

2 files changed

+197
-160
lines changed

tests/test_port_factories.py

+197
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
from textwrap import dedent
2+
3+
from pytest import Pytester
4+
5+
import pytest_asyncio.plugin
6+
7+
8+
def test_unused_tcp_port_selects_unused_port(pytester: Pytester):
9+
pytester.makepyfile(
10+
dedent(
11+
"""\
12+
import asyncio
13+
14+
import pytest
15+
16+
@pytest.mark.asyncio
17+
async def test_unused_port_fixture(unused_tcp_port):
18+
async def closer(_, writer):
19+
writer.close()
20+
21+
server1 = await asyncio.start_server(
22+
closer, host="localhost", port=unused_tcp_port
23+
)
24+
25+
with pytest.raises(IOError):
26+
await asyncio.start_server(
27+
closer, host="localhost", port=unused_tcp_port
28+
)
29+
30+
server1.close()
31+
await server1.wait_closed()
32+
"""
33+
)
34+
)
35+
36+
37+
def test_unused_udp_port_selects_unused_port(pytester: Pytester):
38+
pytester.makepyfile(
39+
dedent(
40+
"""\
41+
@pytest.mark.asyncio
42+
async def test_unused_udp_port_fixture(unused_udp_port):
43+
class Closer:
44+
def connection_made(self, transport):
45+
pass
46+
47+
def connection_lost(self, *arg, **kwd):
48+
pass
49+
50+
event_loop = asyncio.get_running_loop()
51+
transport1, _ = await event_loop.create_datagram_endpoint(
52+
Closer,
53+
local_addr=("127.0.0.1", unused_udp_port),
54+
reuse_port=False,
55+
)
56+
57+
with pytest.raises(IOError):
58+
await event_loop.create_datagram_endpoint(
59+
Closer,
60+
local_addr=("127.0.0.1", unused_udp_port),
61+
reuse_port=False,
62+
)
63+
64+
transport1.abort()
65+
"""
66+
)
67+
)
68+
69+
70+
def test_unused_tcp_port_factory_selects_unused_port(pytester: Pytester):
71+
pytester.makepyfile(
72+
dedent(
73+
"""\
74+
@pytest.mark.asyncio
75+
async def test_unused_port_factory_fixture(unused_tcp_port_factory):
76+
async def closer(_, writer):
77+
writer.close()
78+
79+
port1, port2, port3 = (
80+
unused_tcp_port_factory(),
81+
unused_tcp_port_factory(),
82+
unused_tcp_port_factory(),
83+
)
84+
85+
server1 = await asyncio.start_server(
86+
closer, host="localhost", port=port1
87+
)
88+
server2 = await asyncio.start_server(
89+
closer, host="localhost", port=port2
90+
)
91+
server3 = await asyncio.start_server(
92+
closer, host="localhost", port=port3
93+
)
94+
95+
for port in port1, port2, port3:
96+
with pytest.raises(IOError):
97+
await asyncio.start_server(closer, host="localhost", port=port)
98+
99+
server1.close()
100+
await server1.wait_closed()
101+
server2.close()
102+
await server2.wait_closed()
103+
server3.close()
104+
await server3.wait_closed()
105+
"""
106+
)
107+
)
108+
109+
110+
def test_unused_udp_port_factory_selects_unused_port(pytester: Pytester):
111+
pytester.makepyfile(
112+
dedent(
113+
"""\
114+
@pytest.mark.asyncio
115+
async def test_unused_udp_port_factory_fixture(unused_udp_port_factory):
116+
class Closer:
117+
def connection_made(self, transport):
118+
pass
119+
120+
def connection_lost(self, *arg, **kwd):
121+
pass
122+
123+
port1, port2, port3 = (
124+
unused_udp_port_factory(),
125+
unused_udp_port_factory(),
126+
unused_udp_port_factory(),
127+
)
128+
129+
event_loop = asyncio.get_running_loop()
130+
transport1, _ = await event_loop.create_datagram_endpoint(
131+
Closer,
132+
local_addr=("127.0.0.1", port1),
133+
reuse_port=False,
134+
)
135+
transport2, _ = await event_loop.create_datagram_endpoint(
136+
Closer,
137+
local_addr=("127.0.0.1", port2),
138+
reuse_port=False,
139+
)
140+
transport3, _ = await event_loop.create_datagram_endpoint(
141+
Closer,
142+
local_addr=("127.0.0.1", port3),
143+
reuse_port=False,
144+
)
145+
146+
for port in port1, port2, port3:
147+
with pytest.raises(IOError):
148+
await event_loop.create_datagram_endpoint(
149+
Closer,
150+
local_addr=("127.0.0.1", port),
151+
reuse_port=False,
152+
)
153+
154+
transport1.abort()
155+
transport2.abort()
156+
transport3.abort()
157+
"""
158+
)
159+
)
160+
161+
162+
def test_unused_port_factory_duplicate(unused_tcp_port_factory, monkeypatch):
163+
"""Test correct avoidance of duplicate ports."""
164+
counter = 0
165+
166+
def mock_unused_tcp_port(_ignored):
167+
"""Force some duplicate ports."""
168+
nonlocal counter
169+
counter += 1
170+
if counter < 5:
171+
return 10000
172+
else:
173+
return 10000 + counter
174+
175+
monkeypatch.setattr(pytest_asyncio.plugin, "_unused_port", mock_unused_tcp_port)
176+
177+
assert unused_tcp_port_factory() == 10000
178+
assert unused_tcp_port_factory() > 10000
179+
180+
181+
def test_unused_udp_port_factory_duplicate(unused_udp_port_factory, monkeypatch):
182+
"""Test correct avoidance of duplicate UDP ports."""
183+
counter = 0
184+
185+
def mock_unused_udp_port(_ignored):
186+
"""Force some duplicate ports."""
187+
nonlocal counter
188+
counter += 1
189+
if counter < 5:
190+
return 10000
191+
else:
192+
return 10000 + counter
193+
194+
monkeypatch.setattr(pytest_asyncio.plugin, "_unused_port", mock_unused_udp_port)
195+
196+
assert unused_udp_port_factory() == 10000
197+
assert unused_udp_port_factory() > 10000

tests/test_simple.py

-160
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import pytest
66
from pytest import Pytester
77

8-
import pytest_asyncio.plugin
9-
108

119
async def async_coro():
1210
await asyncio.sleep(0)
@@ -69,164 +67,6 @@ async def test_asyncio_marker_with_default_param(a_param=None):
6967
await asyncio.sleep(0)
7068

7169

72-
@pytest.mark.asyncio
73-
async def test_unused_port_fixture(unused_tcp_port):
74-
"""Test the unused TCP port fixture."""
75-
76-
async def closer(_, writer):
77-
writer.close()
78-
79-
server1 = await asyncio.start_server(closer, host="localhost", port=unused_tcp_port)
80-
81-
with pytest.raises(IOError):
82-
await asyncio.start_server(closer, host="localhost", port=unused_tcp_port)
83-
84-
server1.close()
85-
await server1.wait_closed()
86-
87-
88-
@pytest.mark.asyncio
89-
async def test_unused_udp_port_fixture(unused_udp_port):
90-
"""Test the unused TCP port fixture."""
91-
92-
class Closer:
93-
def connection_made(self, transport):
94-
pass
95-
96-
def connection_lost(self, *arg, **kwd):
97-
pass
98-
99-
event_loop = asyncio.get_running_loop()
100-
transport1, _ = await event_loop.create_datagram_endpoint(
101-
Closer,
102-
local_addr=("127.0.0.1", unused_udp_port),
103-
reuse_port=False,
104-
)
105-
106-
with pytest.raises(IOError):
107-
await event_loop.create_datagram_endpoint(
108-
Closer,
109-
local_addr=("127.0.0.1", unused_udp_port),
110-
reuse_port=False,
111-
)
112-
113-
transport1.abort()
114-
115-
116-
@pytest.mark.asyncio
117-
async def test_unused_port_factory_fixture(unused_tcp_port_factory):
118-
"""Test the unused TCP port factory fixture."""
119-
120-
async def closer(_, writer):
121-
writer.close()
122-
123-
port1, port2, port3 = (
124-
unused_tcp_port_factory(),
125-
unused_tcp_port_factory(),
126-
unused_tcp_port_factory(),
127-
)
128-
129-
server1 = await asyncio.start_server(closer, host="localhost", port=port1)
130-
server2 = await asyncio.start_server(closer, host="localhost", port=port2)
131-
server3 = await asyncio.start_server(closer, host="localhost", port=port3)
132-
133-
for port in port1, port2, port3:
134-
with pytest.raises(IOError):
135-
await asyncio.start_server(closer, host="localhost", port=port)
136-
137-
server1.close()
138-
await server1.wait_closed()
139-
server2.close()
140-
await server2.wait_closed()
141-
server3.close()
142-
await server3.wait_closed()
143-
144-
145-
@pytest.mark.asyncio
146-
async def test_unused_udp_port_factory_fixture(unused_udp_port_factory):
147-
"""Test the unused UDP port factory fixture."""
148-
149-
class Closer:
150-
def connection_made(self, transport):
151-
pass
152-
153-
def connection_lost(self, *arg, **kwd):
154-
pass
155-
156-
port1, port2, port3 = (
157-
unused_udp_port_factory(),
158-
unused_udp_port_factory(),
159-
unused_udp_port_factory(),
160-
)
161-
162-
event_loop = asyncio.get_running_loop()
163-
transport1, _ = await event_loop.create_datagram_endpoint(
164-
Closer,
165-
local_addr=("127.0.0.1", port1),
166-
reuse_port=False,
167-
)
168-
transport2, _ = await event_loop.create_datagram_endpoint(
169-
Closer,
170-
local_addr=("127.0.0.1", port2),
171-
reuse_port=False,
172-
)
173-
transport3, _ = await event_loop.create_datagram_endpoint(
174-
Closer,
175-
local_addr=("127.0.0.1", port3),
176-
reuse_port=False,
177-
)
178-
179-
for port in port1, port2, port3:
180-
with pytest.raises(IOError):
181-
await event_loop.create_datagram_endpoint(
182-
Closer,
183-
local_addr=("127.0.0.1", port),
184-
reuse_port=False,
185-
)
186-
187-
transport1.abort()
188-
transport2.abort()
189-
transport3.abort()
190-
191-
192-
def test_unused_port_factory_duplicate(unused_tcp_port_factory, monkeypatch):
193-
"""Test correct avoidance of duplicate ports."""
194-
counter = 0
195-
196-
def mock_unused_tcp_port(_ignored):
197-
"""Force some duplicate ports."""
198-
nonlocal counter
199-
counter += 1
200-
if counter < 5:
201-
return 10000
202-
else:
203-
return 10000 + counter
204-
205-
monkeypatch.setattr(pytest_asyncio.plugin, "_unused_port", mock_unused_tcp_port)
206-
207-
assert unused_tcp_port_factory() == 10000
208-
assert unused_tcp_port_factory() > 10000
209-
210-
211-
def test_unused_udp_port_factory_duplicate(unused_udp_port_factory, monkeypatch):
212-
"""Test correct avoidance of duplicate UDP ports."""
213-
counter = 0
214-
215-
def mock_unused_udp_port(_ignored):
216-
"""Force some duplicate ports."""
217-
nonlocal counter
218-
counter += 1
219-
if counter < 5:
220-
return 10000
221-
else:
222-
return 10000 + counter
223-
224-
monkeypatch.setattr(pytest_asyncio.plugin, "_unused_port", mock_unused_udp_port)
225-
226-
assert unused_udp_port_factory() == 10000
227-
assert unused_udp_port_factory() > 10000
228-
229-
23070
class TestMarkerInClassBasedTests:
23171
"""Test that asyncio marked functions work for methods of test classes."""
23272

0 commit comments

Comments
 (0)