Skip to content

Commit d22b83e

Browse files
committed
transport_connect -> bool.
1 parent fd2a1c4 commit d22b83e

File tree

11 files changed

+48
-39
lines changed

11 files changed

+48
-39
lines changed

API_changes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
PyModbus - API changes.
33
=======================
44

5+
-------------
6+
Version 3.4.0
7+
-------------
8+
- Modbus<x>Client .connect() returns True/False (connected or not)
9+
510
-------------
611
Version 3.3.1
712
-------------

pymodbus/client/serial.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def connected(self):
7474
"""Connect internal."""
7575
return self.transport is not None
7676

77-
async def connect(self):
77+
async def connect(self) -> bool:
7878
"""Connect Async client."""
7979
# if reconnect_delay_current was set to 0 by close(), we need to set it back again
8080
# so this instance will work

pymodbus/client/tcp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def __init__(
5858
else:
5959
self.setup_tcp(False, host, port)
6060

61-
async def connect(self):
61+
async def connect(self) -> bool:
6262
"""Initiate connection to start client."""
6363

6464
# if reconnect_delay_current was set to 0 by close(), we need to set it back again

pymodbus/client/tls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def __init__(
9393
False, host, port, sslctx, certfile, keyfile, password, server_hostname
9494
)
9595

96-
async def connect(self):
96+
async def connect(self) -> bool:
9797
"""Initiate connection to start client."""
9898

9999
# if reconnect_delay_current was set to 0 by close(), we need to set it back again

pymodbus/client/udp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def connected(self):
6161
"""Return true if connected."""
6262
return self.transport is not None
6363

64-
async def connect(self):
64+
async def connect(self) -> bool:
6565
"""Start reconnecting asynchronous udp client.
6666
6767
:meta private:

pymodbus/transport/transport.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import asyncio
77
import ssl
88
import sys
9-
from contextlib import suppress
109
from dataclasses import dataclass
1110
from typing import Any, Callable, Coroutine
1211

@@ -97,8 +96,6 @@ def __init__(
9796
self.transport: asyncio.BaseTransport | asyncio.Server = None
9897
self.protocol: asyncio.BaseProtocol = None
9998
self.loop: asyncio.AbstractEventLoop = None
100-
with suppress(RuntimeError):
101-
self.loop = asyncio.get_running_loop()
10299
self.reconnect_task: asyncio.Task = None
103100
self.recv_buffer: bytes = b""
104101
self.call_connect_listen: Callable[[], Coroutine[Any, Any, Any]] = lambda: None
@@ -264,7 +261,7 @@ def setup_serial(
264261
timeout=self.comm_params.timeout_connect,
265262
)
266263

267-
async def transport_connect(self):
264+
async def transport_connect(self) -> bool:
268265
"""Handle generic connect and call on to specific transport connect."""
269266
Log.debug("Connecting {}", self.comm_params.comm_name)
270267
if not self.loop:
@@ -281,7 +278,8 @@ async def transport_connect(self):
281278
) as exc:
282279
Log.warning("Failed to connect {}", exc)
283280
self.close(reconnect=True)
284-
return self.transport, self.protocol
281+
return False
282+
return bool(self.transport)
285283

286284
async def transport_listen(self):
287285
"""Handle generic listen and call on to specific transport listen."""
@@ -383,15 +381,15 @@ async def reconnect_connect(self):
383381
"""Handle reconnect as a task."""
384382
try:
385383
self.reconnect_delay_current = self.comm_params.reconnect_delay
386-
transport = None
387-
while not transport:
384+
while True:
388385
Log.debug(
389386
"Wait {} {} ms before reconnecting.",
390387
self.comm_params.comm_name,
391388
self.reconnect_delay_current * 1000,
392389
)
393390
await asyncio.sleep(self.reconnect_delay_current)
394-
transport, _protocol = await self.transport_connect()
391+
if await self.transport_connect():
392+
break
395393
self.reconnect_delay_current = min(
396394
2 * self.reconnect_delay_current,
397395
self.comm_params.reconnect_delay_max,

test/transport/conftest.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Test transport."""
2+
import asyncio
23
import os
4+
from contextlib import suppress
35
from dataclasses import dataclass
46
from unittest import mock
57

@@ -63,7 +65,7 @@ def prepare_testparams():
6365
@pytest.fixture(name="transport")
6466
async def prepare_transport():
6567
"""Prepare transport object."""
66-
return Transport(
68+
transport = Transport(
6769
BaseParams.comm_name,
6870
BaseParams.reconnect_delay,
6971
BaseParams.reconnect_delay_max,
@@ -72,12 +74,15 @@ async def prepare_transport():
7274
mock.Mock(name="cb_connection_lost"),
7375
mock.Mock(name="cb_handle_data", return_value=0),
7476
)
77+
with suppress(RuntimeError):
78+
transport.loop = asyncio.get_running_loop()
79+
return transport
7580

7681

7782
@pytest_asyncio.fixture(name="transport_server")
7883
async def prepare_transport_server():
7984
"""Prepare transport object."""
80-
return Transport(
85+
transport = Transport(
8186
BaseParams.comm_name,
8287
BaseParams.reconnect_delay,
8388
BaseParams.reconnect_delay_max,
@@ -86,3 +91,6 @@ async def prepare_transport_server():
8691
mock.Mock(name="cb_connection_lost"),
8792
mock.Mock(name="cb_handle_data", return_value=0),
8893
)
94+
with suppress(RuntimeError):
95+
transport.loop = asyncio.get_running_loop()
96+
return transport

test/transport/test_basic.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,11 @@ async def test_handle_listen(self, transport):
137137
async def test_reconnect_connect(self, transport):
138138
"""Test handle_listen()."""
139139
transport.comm_params.reconnect_delay = 0.01
140-
transport.transport_connect = mock.AsyncMock(
141-
side_effect=[(None, None), (117, 118)]
142-
)
140+
transport.transport_connect = mock.AsyncMock(side_effect=[False, True])
143141
await transport.reconnect_connect()
144142
assert (
145143
transport.reconnect_delay_current
146-
== transport.comm_params.reconnect_delay * 4
144+
== transport.comm_params.reconnect_delay * 2
147145
)
148146
assert not transport.reconnect_task
149147
transport.transport_connect = mock.AsyncMock(
@@ -183,11 +181,11 @@ async def test_connect(self, params, transport):
183181
mocker = mock.AsyncMock()
184182
transport.loop.create_unix_connection = mocker
185183
mocker.side_effect = FileNotFoundError("testing")
186-
assert await transport.transport_connect() == (None, None)
184+
assert not await transport.transport_connect()
187185
mocker.side_effect = None
188186

189187
mocker.return_value = (mock.Mock(), mock.Mock())
190-
assert mocker.return_value == await transport.transport_connect()
188+
assert await transport.transport_connect()
191189
transport.close()
192190

193191
async def test_listen(self, params, transport):
@@ -223,11 +221,11 @@ async def test_connect(self, params, transport):
223221
mocker = mock.AsyncMock()
224222
transport.loop.create_connection = mocker
225223
mocker.side_effect = asyncio.TimeoutError("testing")
226-
assert await transport.transport_connect() == (None, None)
224+
assert not await transport.transport_connect()
227225
mocker.side_effect = None
228226

229227
mocker.return_value = (mock.Mock(), mock.Mock())
230-
assert mocker.return_value == await transport.transport_connect()
228+
assert await transport.transport_connect()
231229
transport.close()
232230

233231
async def test_listen(self, params, transport):
@@ -285,11 +283,11 @@ async def test_connect(self, params, transport):
285283
mocker = mock.AsyncMock()
286284
transport.loop.create_connection = mocker
287285
mocker.side_effect = asyncio.TimeoutError("testing")
288-
assert await transport.transport_connect() == (None, None)
286+
assert not await transport.transport_connect()
289287
mocker.side_effect = None
290288

291289
mocker.return_value = (mock.Mock(), mock.Mock())
292-
assert mocker.return_value == await transport.transport_connect()
290+
assert await transport.transport_connect()
293291
transport.close()
294292

295293
async def test_listen(self, params, transport):
@@ -334,11 +332,11 @@ async def test_connect(self, params, transport):
334332
mocker = mock.AsyncMock()
335333
transport.loop.create_datagram_endpoint = mocker
336334
mocker.side_effect = asyncio.TimeoutError("testing")
337-
assert await transport.transport_connect() == (None, None)
335+
assert not await transport.transport_connect()
338336
mocker.side_effect = None
339337

340338
mocker.return_value = (mock.Mock(), mock.Mock())
341-
assert mocker.return_value == await transport.transport_connect()
339+
assert await transport.transport_connect()
342340
transport.close()
343341

344342
async def test_listen(self, params, transport):
@@ -393,11 +391,11 @@ async def test_connect(self, params, transport):
393391
"pymodbus.transport.transport.create_serial_connection", new=mocker
394392
):
395393
mocker.side_effect = asyncio.TimeoutError("testing")
396-
assert await transport.transport_connect() == (None, None)
394+
assert not await transport.transport_connect()
397395
mocker.side_effect = None
398396

399397
mocker.return_value = (mock.Mock(), mock.Mock())
400-
assert mocker.return_value == await transport.transport_connect()
398+
assert await transport.transport_connect()
401399
transport.close()
402400

403401
async def test_listen(self, params, transport):

test/transport/test_comm.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async def test_connect(self, transport, domain_socket):
3333
"""Test connect_unix()."""
3434
transport.setup_unix(False, domain_socket)
3535
start = time.time()
36-
assert await transport.transport_connect() == (None, None)
36+
assert not await transport.transport_connect()
3737
delta = time.time() - start
3838
assert delta < transport.comm_params.timeout_connect * 1.2
3939
transport.close()
@@ -56,7 +56,7 @@ async def test_connected(self, transport, transport_server, domain_socket):
5656
await transport_server.transport_listen()
5757

5858
transport.setup_unix(False, domain_socket)
59-
assert await transport.transport_connect() != (None, None)
59+
assert await transport.transport_connect()
6060
transport.close()
6161
transport_server.close()
6262

@@ -69,7 +69,7 @@ async def test_connect(self, transport, domain_host):
6969
"""Test connect_tcp()."""
7070
transport.setup_tcp(False, domain_host, BASE_PORT + 1)
7171
start = time.time()
72-
assert await transport.transport_connect() == (None, None)
72+
assert not await transport.transport_connect()
7373
delta = time.time() - start
7474
assert delta < transport.comm_params.timeout_connect * 1.2
7575
transport.close()
@@ -92,7 +92,7 @@ async def test_connected(self, transport, transport_server, domain_host):
9292
server = await transport_server.transport_listen()
9393
assert server
9494
transport.setup_tcp(False, domain_host, BASE_PORT + 3)
95-
assert await transport.transport_connect() != (None, None)
95+
assert await transport.transport_connect()
9696
transport.close()
9797
transport_server.close()
9898
server.close()
@@ -115,7 +115,7 @@ async def test_connect(self, transport, params, domain_host):
115115
"localhost",
116116
)
117117
start = time.time()
118-
assert await transport.transport_connect() == (None, None)
118+
assert not await transport.transport_connect()
119119
delta = time.time() - start
120120
assert delta < transport.comm_params.timeout_connect * 1.2
121121
transport.close()
@@ -157,7 +157,7 @@ async def test_connected(self, transport, transport_server, params, domain_host)
157157
assert server
158158

159159
transport.setup_tcp(False, domain_host, BASE_PORT + 7)
160-
assert await transport.transport_connect() != (None, None)
160+
assert await transport.transport_connect()
161161
transport.close()
162162
transport_server.close()
163163
server.close()
@@ -188,7 +188,7 @@ async def test_connected(self, transport, transport_server, domain_host):
188188
server = await transport_server.transport_listen()
189189
assert server
190190
transport.setup_udp(False, domain_host, BASE_PORT + 11)
191-
assert await transport.transport_connect() != (None, None)
191+
assert await transport.transport_connect()
192192
transport.close()
193193
transport_server.close()
194194
server.close()
@@ -212,7 +212,7 @@ async def test_connect(self, transport, positive):
212212
2,
213213
)
214214
start = time.time()
215-
assert await transport.transport_connect() == (None, None)
215+
assert not await transport.transport_connect()
216216
delta = time.time() - start
217217
assert delta < transport.comm_params.timeout_connect * 1.2
218218
transport.close()
@@ -247,7 +247,7 @@ async def test_connected(self, transport, transport_server):
247247
"E",
248248
2,
249249
)
250-
assert await transport.transport_connect() != (None, None)
250+
assert await transport.transport_connect()
251251
transport.close()
252252
transport_server.close()
253253
server.close()

test/transport/test_data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ async def test_client_send(self, transport, transport_server):
1515
assert transport_server.transport
1616

1717
transport.setup_tcp(False, "localhost", BASE_PORT + 1)
18-
assert await transport.transport_connect() != (None, None)
18+
assert await transport.transport_connect()
1919
await transport.send(b"ABC")
2020
await asyncio.sleep(2)
2121
assert transport_server.recv_buffer == b"ABC"

0 commit comments

Comments
 (0)