Skip to content

Commit b7ce6d9

Browse files
committed
unit tests for #191, #149 , fix obvious server_start errors
1 parent 99a2524 commit b7ce6d9

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

pymodbus/server/sync.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -405,9 +405,9 @@ def __init__(self, context, framer=None, identity=None, **kwargs):
405405
self.timeout = kwargs.get('timeout', Defaults.Timeout)
406406
self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves)
407407
self.socket = None
408-
self._connect()
409-
self.is_running = True
410-
self._build_handler()
408+
if self._connect():
409+
self.is_running = True
410+
self._build_handler()
411411

412412
def _connect(self):
413413
''' Connect to the serial server
@@ -429,6 +429,7 @@ def _build_handler(self):
429429
430430
:returns: A patched handler
431431
'''
432+
432433
request = self.socket
433434
request.send = request.write
434435
request.recv = request.read
@@ -442,11 +443,14 @@ def serve_forever(self):
442443
:param request: The request to handle
443444
:param client: The address of the client
444445
'''
445-
_logger.debug("Started thread to serve client")
446-
if not self.handler:
447-
self._build_handler()
448-
while self.is_running:
449-
self.handler.handle()
446+
if self._connect():
447+
_logger.debug("Started thread to serve client")
448+
if not self.handler:
449+
self._build_handler()
450+
while self.is_running:
451+
self.handler.handle()
452+
else:
453+
_logger.error("Error opening serial port , Unable to start server!!")
450454

451455
def server_close(self):
452456
''' Callback for stopping the running server

test/test_client_sync.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,13 @@ def testSyncSerialClientInstantiation(self):
202202
self.assertTrue(isinstance(ModbusSerialClient(method='binary').framer, ModbusBinaryFramer))
203203
self.assertRaises(ParameterException, lambda: ModbusSerialClient(method='something'))
204204

205+
def testSyncSerialRTUClientTimeouts(self):
206+
client = ModbusSerialClient(method="rtu", baudrate=9600)
207+
assert client._silent_interval == (3.5 * 11/9600)
208+
client = ModbusSerialClient(method="rtu", baudrate=38400)
209+
assert client._silent_interval == (1.75/1000)
210+
211+
205212
@patch("serial.Serial")
206213
def testBasicSyncSerialClient(self, mock_serial):
207214
''' Test the basic methods for the serial sync client'''

test/test_server_sync.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def __init__(self):
3333
self.threads = []
3434
self.context = {}
3535

36+
3637
#---------------------------------------------------------------------------#
3738
# Fixture
3839
#---------------------------------------------------------------------------#
@@ -280,24 +281,30 @@ def testUdpServerProcess(self):
280281
#-----------------------------------------------------------------------#
281282
def testSerialServerConnect(self):
282283
with patch.object(serial, 'Serial') as mock_serial:
283-
mock_serial.return_value = "socket"
284-
identity = ModbusDeviceIdentification(info={0x00: 'VendorName'})
285-
server = ModbusSerialServer(context=None, identity=identity)
286-
self.assertEqual(server.socket, "socket")
287-
self.assertEqual(server.control.Identity.VendorName, 'VendorName')
288-
289-
server._connect()
290-
self.assertEqual(server.socket, "socket")
284+
# mock_serial.return_value = "socket"
285+
mock_serial.write = lambda x: len(x)
286+
mock_serial.read = lambda size: '\x00' * size
287+
identity = ModbusDeviceIdentification(info={0x00: 'VendorName'})
288+
server = ModbusSerialServer(context=None, identity=identity, port="dummy")
289+
# # mock_serial.return_value = "socket"
290+
# self.assertEqual(server.socket.port, "dummy")
291+
self.assertEquals(server.handler.__class__.__name__, "CustomSingleRequestHandler")
292+
self.assertEqual(server.control.Identity.VendorName, 'VendorName')
293+
294+
server._connect()
295+
# self.assertEqual(server.socket, "socket")
291296

292297
with patch.object(serial, 'Serial') as mock_serial:
298+
mock_serial.write = lambda x: len(x)
299+
mock_serial.read = lambda size: '\x00' * size
293300
mock_serial.side_effect = serial.SerialException()
294-
server = ModbusSerialServer(None)
301+
server = ModbusSerialServer(None, port="dummy")
295302
self.assertEqual(server.socket, None)
296303

297304
def testSerialServerServeForever(self):
298305
''' test that the synchronous serial server closes correctly '''
299306
with patch.object(serial, 'Serial') as mock_serial:
300-
with patch('pymodbus.server.sync.ModbusSingleRequestHandler') as mock_handler:
307+
with patch('pymodbus.server.sync.CustomSingleRequestHandler') as mock_handler:
301308
server = ModbusSerialServer(None)
302309
instance = mock_handler.return_value
303310
instance.handle.side_effect = server.server_close

0 commit comments

Comments
 (0)