Skip to content

Commit dcd6be5

Browse files
committed
Add release_references
1 parent ef4a49d commit dcd6be5

File tree

3 files changed

+130
-14
lines changed

3 files changed

+130
-14
lines changed

adafruit_connection_manager.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -320,21 +320,38 @@ def get_socket(
320320

321321

322322
def connection_manager_close_all(
323-
socket_pool: Optional[SocketpoolModuleType] = None,
323+
socket_pool: Optional[SocketpoolModuleType] = None, release_references: bool = False
324324
) -> None:
325325
"""Close all open sockets for pool"""
326326
if socket_pool:
327-
keys = [socket_pool]
327+
socket_pools = [socket_pool]
328328
else:
329-
keys = _global_connection_managers.keys()
329+
socket_pools = _global_connection_managers.keys()
330330

331-
for key in keys:
332-
connection_manager = _global_connection_managers.get(key, None)
331+
for pool in socket_pools:
332+
connection_manager = _global_connection_managers.get(pool, None)
333333
if connection_manager is None:
334334
raise RuntimeError("SocketPool not managed")
335335

336336
connection_manager._free_sockets(force=True) # pylint: disable=protected-access
337337

338+
if release_references:
339+
radio_key = None
340+
for radio_check, pool_check in _global_socketpools.items():
341+
if pool == pool_check:
342+
radio_key = radio_check
343+
break
344+
345+
if radio_key:
346+
if radio_key in _global_socketpools:
347+
del _global_socketpools[radio_key]
348+
349+
if radio_key in _global_ssl_contexts:
350+
del _global_ssl_contexts[radio_key]
351+
352+
if pool in _global_connection_managers:
353+
del _global_connection_managers[pool]
354+
338355

339356
def get_connection_manager(socket_pool: SocketpoolModuleType) -> ConnectionManager:
340357
"""Get the ConnectionManager singleton for the given pool"""

tests/connection_manager_close_all_test.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,94 @@ def test_connection_manager_close_all_untracked():
8585
with pytest.raises(RuntimeError) as context:
8686
adafruit_connection_manager.connection_manager_close_all(mock_pool_1)
8787
assert "SocketPool not managed" in str(context)
88+
89+
90+
def test_connection_manager_close_all_single_release_references_false( # pylint: disable=unused-argument
91+
circuitpython_socketpool_module, adafruit_esp32spi_socket_module
92+
):
93+
radio_wifi = mocket.MockRadio.Radio()
94+
radio_esp = mocket.MockRadio.ESP_SPIcontrol()
95+
96+
socket_pool_wifi = adafruit_connection_manager.get_radio_socketpool(radio_wifi)
97+
socket_pool_esp = adafruit_connection_manager.get_radio_socketpool(radio_esp)
98+
99+
ssl_context_wifi = adafruit_connection_manager.get_radio_ssl_context(radio_wifi)
100+
ssl_context_esp = adafruit_connection_manager.get_radio_ssl_context(radio_esp)
101+
102+
connection_manager_wifi = adafruit_connection_manager.get_connection_manager(
103+
socket_pool_wifi
104+
)
105+
connection_manager_esp = adafruit_connection_manager.get_connection_manager(
106+
socket_pool_esp
107+
)
108+
109+
assert socket_pool_wifi != socket_pool_esp
110+
assert ssl_context_wifi != ssl_context_esp
111+
assert connection_manager_wifi != connection_manager_esp
112+
113+
adafruit_connection_manager.connection_manager_close_all(
114+
socket_pool_wifi, release_references=False
115+
)
116+
117+
assert socket_pool_wifi in adafruit_connection_manager._global_socketpools.values()
118+
assert socket_pool_esp in adafruit_connection_manager._global_socketpools.values()
119+
120+
assert ssl_context_wifi in adafruit_connection_manager._global_ssl_contexts.values()
121+
assert ssl_context_esp in adafruit_connection_manager._global_ssl_contexts.values()
122+
123+
assert (
124+
socket_pool_wifi
125+
in adafruit_connection_manager._global_connection_managers.keys()
126+
)
127+
assert (
128+
socket_pool_esp
129+
in adafruit_connection_manager._global_connection_managers.keys()
130+
)
131+
132+
133+
def test_connection_manager_close_all_single_release_references_true( # pylint: disable=unused-argument
134+
circuitpython_socketpool_module, adafruit_esp32spi_socket_module
135+
):
136+
radio_wifi = mocket.MockRadio.Radio()
137+
radio_esp = mocket.MockRadio.ESP_SPIcontrol()
138+
139+
socket_pool_wifi = adafruit_connection_manager.get_radio_socketpool(radio_wifi)
140+
socket_pool_esp = adafruit_connection_manager.get_radio_socketpool(radio_esp)
141+
142+
ssl_context_wifi = adafruit_connection_manager.get_radio_ssl_context(radio_wifi)
143+
ssl_context_esp = adafruit_connection_manager.get_radio_ssl_context(radio_esp)
144+
145+
connection_manager_wifi = adafruit_connection_manager.get_connection_manager(
146+
socket_pool_wifi
147+
)
148+
connection_manager_esp = adafruit_connection_manager.get_connection_manager(
149+
socket_pool_esp
150+
)
151+
152+
assert socket_pool_wifi != socket_pool_esp
153+
assert ssl_context_wifi != ssl_context_esp
154+
assert connection_manager_wifi != connection_manager_esp
155+
156+
adafruit_connection_manager.connection_manager_close_all(
157+
socket_pool_wifi, release_references=True
158+
)
159+
160+
assert (
161+
socket_pool_wifi not in adafruit_connection_manager._global_socketpools.values()
162+
)
163+
assert socket_pool_esp in adafruit_connection_manager._global_socketpools.values()
164+
165+
assert (
166+
ssl_context_wifi
167+
not in adafruit_connection_manager._global_ssl_contexts.values()
168+
)
169+
assert ssl_context_esp in adafruit_connection_manager._global_ssl_contexts.values()
170+
171+
assert (
172+
socket_pool_wifi
173+
not in adafruit_connection_manager._global_connection_managers.keys()
174+
)
175+
assert (
176+
socket_pool_esp
177+
in adafruit_connection_manager._global_connection_managers.keys()
178+
)

tests/get_radio_test.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def test_get_radio_socketpool_wifi( # pylint: disable=unused-argument
1919
radio = mocket.MockRadio.Radio()
2020
socket_pool = adafruit_connection_manager.get_radio_socketpool(radio)
2121
assert isinstance(socket_pool, mocket.MocketPool)
22+
assert socket_pool in adafruit_connection_manager._global_socketpools.values()
2223

2324

2425
def test_get_radio_socketpool_esp32spi( # pylint: disable=unused-argument
@@ -27,6 +28,7 @@ def test_get_radio_socketpool_esp32spi( # pylint: disable=unused-argument
2728
radio = mocket.MockRadio.ESP_SPIcontrol()
2829
socket_pool = adafruit_connection_manager.get_radio_socketpool(radio)
2930
assert socket_pool.__name__ == "adafruit_esp32spi_socket"
31+
assert socket_pool in adafruit_connection_manager._global_socketpools.values()
3032

3133

3234
def test_get_radio_socketpool_wiznet5k( # pylint: disable=unused-argument
@@ -36,6 +38,7 @@ def test_get_radio_socketpool_wiznet5k( # pylint: disable=unused-argument
3638
with mock.patch("sys.implementation", return_value=[9, 0, 0]):
3739
socket_pool = adafruit_connection_manager.get_radio_socketpool(radio)
3840
assert socket_pool.__name__ == "adafruit_wiznet5k_socket"
41+
assert socket_pool in adafruit_connection_manager._global_socketpools.values()
3942

4043

4144
def test_get_radio_socketpool_unsupported():
@@ -52,31 +55,35 @@ def test_get_radio_socketpool_returns_same_one( # pylint: disable=unused-argume
5255
socket_pool_1 = adafruit_connection_manager.get_radio_socketpool(radio)
5356
socket_pool_2 = adafruit_connection_manager.get_radio_socketpool(radio)
5457
assert socket_pool_1 == socket_pool_2
58+
assert socket_pool_1 in adafruit_connection_manager._global_socketpools.values()
5559

5660

5761
def test_get_radio_ssl_context_wifi( # pylint: disable=unused-argument
5862
circuitpython_socketpool_module,
5963
):
6064
radio = mocket.MockRadio.Radio()
61-
ssl_contexts = adafruit_connection_manager.get_radio_ssl_context(radio)
62-
assert isinstance(ssl_contexts, ssl.SSLContext)
65+
ssl_context = adafruit_connection_manager.get_radio_ssl_context(radio)
66+
assert isinstance(ssl_context, ssl.SSLContext)
67+
assert ssl_context in adafruit_connection_manager._global_ssl_contexts.values()
6368

6469

6570
def test_get_radio_ssl_context_esp32spi( # pylint: disable=unused-argument
6671
adafruit_esp32spi_socket_module,
6772
):
6873
radio = mocket.MockRadio.ESP_SPIcontrol()
69-
ssl_contexts = adafruit_connection_manager.get_radio_ssl_context(radio)
70-
assert isinstance(ssl_contexts, adafruit_connection_manager._FakeSSLContext)
74+
ssl_context = adafruit_connection_manager.get_radio_ssl_context(radio)
75+
assert isinstance(ssl_context, adafruit_connection_manager._FakeSSLContext)
76+
assert ssl_context in adafruit_connection_manager._global_ssl_contexts.values()
7177

7278

7379
def test_get_radio_ssl_context_wiznet5k( # pylint: disable=unused-argument
7480
adafruit_wiznet5k_socket_module,
7581
):
7682
radio = mocket.MockRadio.WIZNET5K()
7783
with mock.patch("sys.implementation", return_value=[9, 0, 0]):
78-
ssl_contexts = adafruit_connection_manager.get_radio_ssl_context(radio)
79-
assert isinstance(ssl_contexts, adafruit_connection_manager._FakeSSLContext)
84+
ssl_context = adafruit_connection_manager.get_radio_ssl_context(radio)
85+
assert isinstance(ssl_context, adafruit_connection_manager._FakeSSLContext)
86+
assert ssl_context in adafruit_connection_manager._global_ssl_contexts.values()
8087

8188

8289
def test_get_radio_ssl_context_unsupported():
@@ -90,6 +97,7 @@ def test_get_radio_ssl_context_returns_same_one( # pylint: disable=unused-argum
9097
circuitpython_socketpool_module,
9198
):
9299
radio = mocket.MockRadio.Radio()
93-
ssl_contexts_1 = adafruit_connection_manager.get_radio_ssl_context(radio)
94-
ssl_contexts_2 = adafruit_connection_manager.get_radio_ssl_context(radio)
95-
assert ssl_contexts_1 == ssl_contexts_2
100+
ssl_context_1 = adafruit_connection_manager.get_radio_ssl_context(radio)
101+
ssl_context_2 = adafruit_connection_manager.get_radio_ssl_context(radio)
102+
assert ssl_context_1 == ssl_context_2
103+
assert ssl_context_1 in adafruit_connection_manager._global_ssl_contexts.values()

0 commit comments

Comments
 (0)