Skip to content

Commit fe1f55a

Browse files
committed
Test case for UDP issue
1 parent f815003 commit fe1f55a

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

test/conftest.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Configure pytest."""
22
import functools
33
import platform
4+
from collections import deque
45

56
import pytest
67

@@ -132,6 +133,64 @@ def setblocking(self, _flag):
132133
"""Set blocking."""
133134
return None
134135

136+
class mockSocket2: # pylint: disable=invalid-name
137+
"""Mock socket."""
138+
139+
timeout = 2
140+
141+
def __init__(self):
142+
"""Initialize."""
143+
self.receive = deque()
144+
self.send = deque()
145+
146+
def mock_prepare_receive(self, msg):
147+
"""Store message."""
148+
self.receive.append(msg);
149+
150+
def mock_read_sent(self):
151+
self.send.popleft()
152+
153+
def mock_retrieve(self, size):
154+
"""Get message."""
155+
if len(self.receive) == 0 or not size:
156+
return b"";
157+
if size >= len(self.receive[0]):
158+
retval = self.receive.popleft()
159+
else:
160+
retval = self.receive[0][0:size]
161+
self.data[0] = self.receive[0][size:-1]
162+
return retval
163+
164+
def close(self):
165+
"""Close."""
166+
return True
167+
168+
def recv(self, size):
169+
"""Receive."""
170+
return self.mock_retrieve(size)
171+
172+
def read(self, size):
173+
"""Read."""
174+
return self.mock_retrieve(size)
175+
176+
def send(self, msg):
177+
"""Send."""
178+
self.mock_store(msg)
179+
return len(msg)
180+
181+
def recvfrom(self, size):
182+
"""Receive from."""
183+
return [self.mock_retrieve(size)]
184+
185+
def sendto(self, msg, *_args):
186+
"""Send to."""
187+
self.send.append(msg)
188+
return len(msg)
189+
190+
def setblocking(self, _flag):
191+
"""Set blocking."""
192+
return None
193+
135194

136195
def run_coroutine(coro):
137196
"""Run a coroutine as top-level task by iterating through all yielded steps."""

test/test_client_sync.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import ssl
33
from itertools import count
44
from test.conftest import mockSocket
5+
from test.conftest import mockSocket2
56
from unittest import mock
67

78
import pytest
@@ -79,6 +80,27 @@ def test_udp_client_recv(self):
7980
assert client.recv(0) == b""
8081
assert client.recv(4) == b"\x00" * 4
8182

83+
def test_udp_client_recv_duplicate(self):
84+
"""Test the udp client receive method"""
85+
client = ModbusUdpClient("127.0.0.1")
86+
87+
client.socket = mockSocket2()
88+
client.socket.mock_prepare_receive(b"\x00\x01\x00\x00\x00\x05\x01\x04\x02\x00\x03"); # Response 1
89+
reply1 = client.read_input_registers(0x820, 1, 1)
90+
client.socket.mock_prepare_receive(b"\x00\x01\x00\x00\x00\x05\x01\x04\x02\x00\x03"); # Duplicate response 1
91+
client.socket.mock_prepare_receive(b"\x00\x02\x00\x00\x00\x07\x01\x04\x04\x00\x03\xf6\x3e") # Response 2
92+
reply2 = client.read_input_registers(0x820, 2, 1)
93+
reply3 = client.read_input_registers(0x820, 100, 1)
94+
95+
print(reply1.registers)
96+
print(reply2.registers)
97+
print(reply3.registers)
98+
print(reply1.transaction_id)
99+
print(reply2.transaction_id)
100+
print(reply3.transaction_id)
101+
102+
assert 1 == 0
103+
82104
def test_udp_client_repr(self):
83105
"""Test udp client representation."""
84106
client = ModbusUdpClient("127.0.0.1")

0 commit comments

Comments
 (0)