Skip to content

Commit c3cc72c

Browse files
committed
Test coverage server 100%.
1 parent 660e87b commit c3cc72c

File tree

6 files changed

+124
-15
lines changed

6 files changed

+124
-15
lines changed

pymodbus/server/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""**Server classes**."""
22

33
__all__ = [
4+
"ModbusBaseServer",
45
"ModbusSerialServer",
56
"ModbusSimulatorServer",
67
"ModbusTcpServer",
@@ -19,6 +20,7 @@
1920
"get_simulator_commandline",
2021
]
2122

23+
from pymodbus.server.base import ModbusBaseServer
2224
from pymodbus.server.server import (
2325
ModbusSerialServer,
2426
ModbusTcpServer,

pymodbus/server/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
class ModbusBaseServer(ModbusProtocol):
1919
"""Common functionality for all server classes."""
2020

21-
active_server: ModbusBaseServer | None
21+
active_server: ModbusBaseServer | None = None
2222

2323
def __init__( # pylint: disable=too-many-arguments
2424
self,

pymodbus/server/simulator/custom_actions.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

pymodbus/server/startstop.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from __future__ import annotations
33

44
import asyncio
5+
import concurrent
56
import os
67

78
from pymodbus.datastore import ModbusServerContext
@@ -158,10 +159,13 @@ async def ServerAsyncStop() -> None:
158159
await ModbusBaseServer.active_server.shutdown()
159160
ModbusBaseServer.active_server = None
160161

161-
162162
def ServerStop() -> None:
163163
"""Terminate server."""
164164
if not ModbusBaseServer.active_server:
165165
raise RuntimeError("Modbus server not running.")
166-
future = asyncio.run_coroutine_threadsafe(ServerAsyncStop(), ModbusBaseServer.active_server.loop)
167-
future.result(timeout=10 if os.name == 'nt' else 0.1)
166+
try:
167+
future = asyncio.run_coroutine_threadsafe(ServerAsyncStop(), ModbusBaseServer.active_server.loop)
168+
future.result(timeout=10 if os.name == 'nt' else 0.1)
169+
except concurrent.futures.TimeoutError:
170+
pass
171+
ModbusBaseServer.active_server = None

test/server/test_server_asyncio.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
ModbusServerContext,
1616
)
1717
from pymodbus.exceptions import NoSuchIdException
18-
from pymodbus.server import ModbusTcpServer, ModbusTlsServer, ModbusUdpServer
18+
from pymodbus.server import (
19+
ModbusTcpServer,
20+
ModbusTlsServer,
21+
ModbusUdpServer,
22+
)
1923

2024

2125
_logger = logging.getLogger()

test/server/test_startstop.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
"""Test server asyncio."""
2+
from unittest import mock
3+
4+
import pytest
5+
6+
from pymodbus.datastore import ModbusDeviceContext, ModbusServerContext
7+
from pymodbus.server import (
8+
ModbusBaseServer,
9+
ServerAsyncStop,
10+
ServerStop,
11+
StartAsyncSerialServer,
12+
StartAsyncTcpServer,
13+
StartAsyncTlsServer,
14+
StartAsyncUdpServer,
15+
StartSerialServer,
16+
StartTcpServer,
17+
StartTlsServer,
18+
StartUdpServer,
19+
)
20+
21+
22+
SERV_ADDR = ("127.0.0.1", 0)
23+
24+
25+
class TestStartStopServer:
26+
"""Test for the pymodbus.server.startstop module."""
27+
28+
async def test_ServerAsyncStop(self):
29+
"""Test ServerAsyncStop."""
30+
ModbusBaseServer.active_server = None
31+
with pytest.raises(RuntimeError):
32+
await ServerAsyncStop()
33+
ModbusBaseServer.active_server = None
34+
with pytest.raises(RuntimeError):
35+
ServerStop()
36+
ModbusBaseServer.active_server = mock.AsyncMock()
37+
await ServerAsyncStop()
38+
ModbusBaseServer.active_server = mock.AsyncMock()
39+
ServerStop()
40+
ModbusBaseServer.active_server = None
41+
42+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
43+
async def test_StartAsyncSerialServer(self, mock_method):
44+
"""Test StartAsyncSerialServer."""
45+
mock_method.return_value=True
46+
await StartAsyncSerialServer(
47+
ModbusServerContext(devices=ModbusDeviceContext(), single=True),
48+
port="/dev/tty01",
49+
)
50+
51+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
52+
async def test_StartAsyncTcpServer(self, mock_method):
53+
"""Test StartAsyncTcpServer."""
54+
mock_method.return_value=True
55+
await StartAsyncTcpServer(
56+
ModbusServerContext(devices=ModbusDeviceContext(), single=True)
57+
)
58+
59+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
60+
async def test_StartAsyncTlsServer(self, mock_method):
61+
"""Test StartAsyncTlsServer."""
62+
mock_method.return_value=True
63+
await StartAsyncTlsServer(
64+
ModbusServerContext(devices=ModbusDeviceContext(), single=True)
65+
)
66+
67+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
68+
async def test_StartAsyncUdpServer(self, mock_method):
69+
"""Test StartAsyncUdpServer."""
70+
mock_method.return_value=True
71+
await StartAsyncUdpServer(
72+
ModbusServerContext(devices=ModbusDeviceContext(), single=True)
73+
)
74+
75+
def test_ServerStop(self):
76+
"""Test ServerStop."""
77+
78+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
79+
def test_StartSerialServer(self, mock_method):
80+
"""Test StartSerialServer."""
81+
mock_method.return_value=True
82+
StartSerialServer(
83+
ModbusServerContext(devices=ModbusDeviceContext(), single=True),
84+
port="/dev/tty01",
85+
)
86+
87+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
88+
def test_StartTcpServer(self, mock_method):
89+
"""Test StartTcpServer."""
90+
mock_method.return_value=True
91+
StartTcpServer(
92+
ModbusServerContext(devices=ModbusDeviceContext(), single=True)
93+
)
94+
95+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
96+
def test_StartTlsServer(self, mock_method):
97+
"""Test StartTlsServer."""
98+
mock_method.return_value=True
99+
StartTlsServer(
100+
ModbusServerContext(devices=ModbusDeviceContext(), single=True)
101+
)
102+
103+
@mock.patch('pymodbus.server.ModbusBaseServer.serve_forever')
104+
def test_StartUdpServer(self, mock_method):
105+
"""Test StartUdpServer."""
106+
mock_method.return_value=True
107+
StartUdpServer(
108+
ModbusServerContext(devices=ModbusDeviceContext(), single=True)
109+
)

0 commit comments

Comments
 (0)