• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1% Regression tests for ISOTP Message Builder
2
3+ Configuration
4~ conf
5
6= Definition of utility functions
7
8# hexadecimal to bytes convenience function
9dhex = bytes.fromhex
10
11= Import isotp
12
13conf.contribs['ISOTP'] = {'use-can-isotp-kernel-module': False}
14
15load_layer("can", globals_dict=globals())
16load_contrib("isotp", globals_dict=globals())
17
18
19+ Testing ISOTPMessageBuilder
20
21= Create ISOTPMessageBuilder
22m = ISOTPMessageBuilder()
23
24= Feed packets to machine
25ff = CAN(identifier=0x241, data=dhex("10 28 01 02 03 04 05 06"))
26ff.time = 1000
27m.feed(ff)
28m.feed(CAN(identifier=0x641, data=dhex("30 03 00"               )))
29m.feed(CAN(identifier=0x241, data=dhex("21 07 08 09 0A 0B 0C 0D")))
30m.feed(CAN(identifier=0x241, data=dhex("22 0E 0F 10 11 12 13 14")))
31m.feed(CAN(identifier=0x241, data=dhex("23 15 16 17 18 19 1A 1B")))
32m.feed(CAN(identifier=0x641, data=dhex("30 03 00"               )))
33m.feed(CAN(identifier=0x241, data=dhex("24 1C 1D 1E 1F 20 21 22")))
34m.feed(CAN(identifier=0x241, data=dhex("25 23 24 25 26 27 28"   )))
35
36= Verify there is a ready message in the machine
37assert m.count == 1
38
39= Extract the message from the machine
40msg = m.pop()
41assert m.count == 0
42assert msg.rx_id == 0x241
43assert msg.rx_ext_address is None
44assert msg.tx_id == 0x641
45assert msg.ext_address is None
46assert msg.time == 1000
47expected = dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28")
48assert msg.data == expected
49
50= Verify that no error happens when there is not enough data
51m = ISOTPMessageBuilder()
52m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF")))
53msg = m.pop()
54assert msg is None
55
56= Verify that no error happens when there is no data
57m = ISOTPMessageBuilder()
58m.feed(CAN(identifier=0x241, data=dhex("")))
59msg = m.pop()
60assert msg is None
61
62= Verify a single frame without EA
63m = ISOTPMessageBuilder()
64m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF 04")))
65msg = m.pop()
66assert msg.rx_id == 0x241
67assert msg.rx_ext_address is None
68assert msg.data == dhex("AB CD EF 04")
69
70= Single frame without EA, with excessive bytes in CAN frame
71m = ISOTPMessageBuilder()
72m.feed(CAN(identifier=0x241, data=dhex("03 AB CD EF AB CD EF AB")))
73msg = m.pop()
74assert msg.rx_id == 0x241
75assert msg.rx_ext_address is None
76assert msg.data == dhex("AB CD EF")
77
78= Verify a single frame with EA
79m = ISOTPMessageBuilder()
80m.feed(CAN(identifier=0x241, data=dhex("E2 04 01 02 03 04")))
81msg = m.pop()
82assert msg.rx_id == 0x241
83assert msg.rx_ext_address == 0xE2
84assert msg.data == dhex("01 02 03 04")
85
86= Single CAN frame that has 2 valid interpretations
87m = ISOTPMessageBuilder()
88m.feed(CAN(identifier=0x241, data=dhex("04 01 02 03 04")))
89msg = m.pop(0x241, None)
90assert msg.rx_id == 0x241
91assert msg.rx_ext_address is None
92assert msg.data == dhex("01 02 03 04")
93msg = m.pop()
94assert msg.rx_id == 0x241
95assert msg.rx_ext_address == 0x04
96assert msg.data == dhex("02")
97
98= Verify multiple frames with EA
99m = ISOTPMessageBuilder()
100ff = CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05"))
101ff.time = 1005
102m.feed(ff)
103m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00"            )))
104m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")))
105m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")))
106m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")))
107m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00"            )))
108m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")))
109m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")))
110m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28"   )))
111msg = m.pop()
112assert msg.rx_id == 0x241
113assert msg.rx_ext_address == 0xEA
114assert msg.tx_id == 0x641
115assert msg.ext_address == 0xEA
116assert msg.time == 1005
117assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28")
118
119= Verify multiple frames with EA 2
120m = ISOTPMessageBuilder()
121m.feed(CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")))
122m.feed(CAN(identifier=0x641, data=dhex("AE 30 03 00"            )))
123m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")))
124m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")))
125m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")))
126m.feed(CAN(identifier=0x641, data=dhex("AE 30 03 00"            )))
127m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")))
128m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")))
129m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28"   )))
130msg = m.pop()
131assert msg.rx_id == 0x241
132assert msg.rx_ext_address == 0xEA
133assert msg.tx_id == 0x641
134assert msg.ext_address == 0xAE
135assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28")
136
137= Verify that an EA starting with 1 will still work
138m = ISOTPMessageBuilder()
139m.feed(CAN(identifier=0x241, data=dhex("1A 10 14 01 02 03 04 05")))
140m.feed(CAN(identifier=0x641, data=dhex("1A 30 03 00"            )))
141m.feed(CAN(identifier=0x241, data=dhex("1A 21 06 07 08 09 0A 0B")))
142m.feed(CAN(identifier=0x241, data=dhex("1A 22 0C 0D 0E 0F 10 11")))
143m.feed(CAN(identifier=0x241, data=dhex("1A 23 12 13 14 15 16 17")))
144msg = m.pop()
145assert msg.rx_id == 0x241
146assert msg.rx_ext_address == 0x1A
147assert msg.tx_id == 0x641
148assert msg.ext_address == 0x1A
149assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14")
150
151= Verify that an EA of 07 will still work
152m = ISOTPMessageBuilder()
153m.feed(CAN(identifier=0x241, data=dhex("07 10 0A 01 02 03 04 05")))
154m.feed(CAN(identifier=0x641, data=dhex("07 30 03 00"            )))
155m.feed(CAN(identifier=0x241, data=dhex("07 21 06 07 08 09 0A 0B")))
156msg = m.pop(0x241, 0x07)
157assert msg.rx_id == 0x241
158assert msg.rx_ext_address == 0x07
159assert msg.tx_id == 0x641
160assert msg.ext_address == 0x07
161assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A")
162
163= Verify that three interleaved messages can be sniffed simultaneously on the same identifier and extended address (very unrealistic)
164m = ISOTPMessageBuilder()
165ff = CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05"))
166ff.time = 300
167m.feed(ff) # start of message A
168m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00"            )))
169m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")))
170m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")))
171m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")))
172ff = CAN(identifier=0x241, data=dhex("EA 10 10 31 32 33 34 35"))
173ff.time = 400
174m.feed(ff) # start of message B
175m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00"            )))
176sf = CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8"         ))
177sf.time = 200
178m.feed(sf) # single-frame message C
179m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00"            )))
180m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")))
181m.feed(CAN(identifier=0x241, data=dhex("EA 21 36 37 38 39 3A 3B")))
182m.feed(CAN(identifier=0x241, data=dhex("EA 22 3C 3D 3E 3F 40"   ))) # end of message B
183m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")))
184m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28"   ))) # end of message A
185msg = m.pop()
186assert msg.rx_id == 0x241
187assert msg.rx_ext_address == 0xEA
188assert msg.data == dhex("A6 A7 A8")
189assert msg.time == 200
190msg = m.pop()
191assert msg.rx_id == 0x241
192assert msg.rx_ext_address == 0xEA
193assert msg.tx_id == 0x641
194assert msg.ext_address == 0xEA
195assert msg.time == 400
196assert msg.data == dhex("31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40")
197msg = m.pop()
198assert msg.rx_id == 0x241
199assert msg.rx_ext_address == 0xEA
200assert msg.tx_id == 0x641
201assert msg.ext_address == 0xEA
202assert msg.time == 300
203assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28")
204
205
206= Verify multiple frames with EA from list
207m = ISOTPMessageBuilder()
208msgs = [
209    CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")),
210    CAN(identifier=0x641, data=dhex("EA 30 03 00"            )),
211    CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")),
212    CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")),
213    CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")),
214    CAN(identifier=0x641, data=dhex("EA 30 03 00"            )),
215    CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")),
216    CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")),
217    CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28"   ))]
218m.feed(msgs)
219msg = m.pop()
220assert msg.rx_id == 0x241
221assert msg.rx_ext_address == 0xEA
222assert msg.tx_id == 0x641
223assert msg.ext_address == 0xEA
224assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28")
225
226= Verify multiple frames with EA from list and iterator
227m = ISOTPMessageBuilder()
228msgs = [
229    CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")),
230    CAN(identifier=0x641, data=dhex("EA 30 03 00"            )),
231    CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")),
232    CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")),
233    CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")),
234    CAN(identifier=0x641, data=dhex("EA 30 03 00"            )),
235    CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")),
236    CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")),
237    CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28"   )),
238    CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8"         )),
239    CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8"))]
240m.feed(msgs)
241assert m.count == 3
242assert len(m) == 3
243
244isotpmsgs = [x for x in m]
245assert len(isotpmsgs) == 3
246msg = isotpmsgs[0]
247assert msg.rx_id == 0x241
248assert msg.rx_ext_address == 0xEA
249assert msg.tx_id == 0x641
250assert msg.ext_address == 0xEA
251assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28")
252
253assert isotpmsgs[1] == isotpmsgs[2]
254
255= Verify a single frame without EA and different basecls
256m = ISOTPMessageBuilder(basecls=Raw)
257m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF 04")))
258msg = m.pop()
259assert msg.load == dhex("AB CD EF 04")
260assert type(msg) == Raw
261