Skip to content

Commit 08bb81f

Browse files
committed
Add an interface to override to output payload of the client. Fix #37
1 parent 7cd5b92 commit 08bb81f

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

test/client/test_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,29 @@ def _test_p2_star_timeout(self):
107107
self.assertGreater(diff, timeout, 'Timeout raised after %.3f seconds when it should be %.3f sec' % (diff, timeout))
108108
self.assertLess(diff, timeout+0.5, 'Timeout raised after %.3f seconds when it should be %.3f sec' % (diff, timeout))
109109

110+
111+
def test_payload_override_literal(self):
112+
request = self.conn.touserqueue.get(timeout=0.2)
113+
self.assertEqual(request, b'\x12\x34\x56\x78')
114+
self.conn.fromuserqueue.put(b"\x7E\x00")
115+
116+
def _test_payload_override_literal(self):
117+
req = Request(service = services.TesterPresent, subfunction=0)
118+
with self.udsclient.payload_override(b'\x12\x34\x56\x78'):
119+
response = self.udsclient.send_request(req)
120+
self.assertEqual(response.original_payload, b'\x7E\x00')
121+
122+
123+
def test_payload_override_func(self):
124+
request = self.conn.touserqueue.get(timeout=0.2)
125+
self.assertEqual(request, b'\x99\x88\x77\x66')
126+
self.conn.fromuserqueue.put(b"\x7E\x00")
127+
128+
def _test_payload_override_func(self):
129+
def func(payload):
130+
return b'\x99\x88\x77\x66'
131+
132+
req = Request(service = services.TesterPresent, subfunction=0)
133+
with self.udsclient.payload_override(func):
134+
response = self.udsclient.send_request(req)
135+
self.assertEqual(response.original_payload, b'\x7E\x00')

udsoncan/client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,30 @@ def __enter__(self):
3737
def __exit__(self, type, value, traceback):
3838
self.enabled = False
3939

40+
class PayloadOverrider:
41+
def __init__(self):
42+
self.modifier = None
43+
self.enabled = False
44+
45+
def __enter__(self):
46+
self.enabled = True
47+
return self
48+
49+
def __exit__(self, type, value, traceback):
50+
self.modifier = None
51+
self.enabled = False
52+
53+
def __call__(self, modifier):
54+
self.modifier = modifier
55+
return self
56+
57+
def get_overrided_payload(self, original_payload):
58+
if callable(self.modifier):
59+
return self.modifier(original_payload)
60+
else:
61+
return self.modifier
62+
63+
4064
def __init__(self, conn, config=default_client_config, request_timeout=None):
4165
self.conn = conn
4266
self.config = dict(config) # Makes a copy of given configuration
@@ -45,6 +69,7 @@ def __init__(self, conn, config=default_client_config, request_timeout=None):
4569
if request_timeout is not None:
4670
self.config['request_timeout'] = request_timeout
4771
self.suppress_positive_response = Client.SuppressPositiveResponse()
72+
self.payload_override = Client.PayloadOverrider()
4873
self.last_response = None
4974

5075
self.refresh_config()
@@ -1435,6 +1460,9 @@ def send_request(self, request, timeout=-1):
14351460
else:
14361461
payload = request.get_payload()
14371462

1463+
if self.payload_override.enabled:
1464+
payload = self.payload_override.get_overrided_payload(payload)
1465+
14381466
if self.suppress_positive_response.enabled and not request.service.use_subfunction():
14391467
self.logger.warning('SuppressPositiveResponse cannot be used for service %s. Ignoring' % (request.service.get_name()))
14401468

0 commit comments

Comments
 (0)