• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1% Regression tests for the XCP
2# More information at http://www.secdev.org/projects/UTscapy/
3
4############
5############
6
7+ Basic operations
8
9= Load module
10
11load_layer("can", globals_dict=globals())
12conf.contribs['CAN']['swap-bytes'] = False
13load_contrib("automotive.xcp.xcp",  globals_dict=globals())
14
15
16= Test padding
17
18conf.contribs["XCP"]["add_padding_for_can"] = True
19
20pkt = XCPOnCAN(identifier=0x700) / CTORequest() / Connect()
21build_pkt = bytes(pkt)
22hexdump(build_pkt)
23assert build_pkt == b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\xcc\xcc\xcc\xcc\xcc\xcc'
24conf.contribs["XCP"]["add_padding_for_can"] = False
25
26= test_get_com_mode_info
27conf.contribs["XCP"]["add_padding_for_can"] = False
28
29cto_request = CTORequest() / GetCommModeInfo()
30assert cto_request.pid == 0xfb
31assert bytes(cto_request) == b'\xfb'
32
33cto_response = CTOResponse(b'\xff\x00\x01\x00\x02\x00\x00\x64')
34assert cto_response.packet_code == 0xFF
35
36assert cto_response.answers(cto_request)
37
38get_comm_mode_info_response = cto_response["CommonModeInfoPositiveResponse"]
39assert "master_block_mode" in get_comm_mode_info_response.comm_mode_optional
40assert get_comm_mode_info_response.max_bs == 0x02
41assert get_comm_mode_info_response.min_st == 0x00
42assert get_comm_mode_info_response.xcp_driver_version_number == 0x64
43
44= test_get_status
45
46cto_request = CTORequest() / GetStatus()
47assert cto_request.pid == 0xfd
48assert bytes(cto_request) == b'\xfd'
49
50cto_response = CTOResponse(b'\xff\x00\x15\x00\x00\x00')
51assert cto_response.packet_code == 0xFF
52assert cto_response.answers(cto_request)
53
54get_comm_mode_info_response = cto_response["StatusPositiveResponse"]
55assert get_comm_mode_info_response.current_session_status == 0x00
56assert "cal_pag" in get_comm_mode_info_response.current_resource_protection_status
57assert "x1" not in get_comm_mode_info_response.current_resource_protection_status
58assert "daq" in get_comm_mode_info_response.current_resource_protection_status
59assert "stim" not in get_comm_mode_info_response.current_resource_protection_status
60assert "pgm" in get_comm_mode_info_response.current_resource_protection_status
61assert "x5" not in get_comm_mode_info_response.current_resource_protection_status
62assert "x6" not in get_comm_mode_info_response.current_resource_protection_status
63assert "x7" not in get_comm_mode_info_response.current_resource_protection_status
64
65assert get_comm_mode_info_response.session_configuration_id == 0x0000
66
67= test_get_seed
68
69conf.contribs['XCP']['MAX_CTO'] = 8
70cto_request = CTORequest() / GetSeed(b'\x00\x01')
71assert cto_request.pid == 0xf8
72assert bytes(cto_request) == b'\xf8\x00\x01'
73
74cto_response = CTOResponse(b'\xff\x06\x00\x01\x02\x03\x04\x05')
75assert cto_response.packet_code == 0xFF
76assert cto_response.answers(cto_request)
77
78get_seed_response = cto_response["SeedPositiveResponse"]
79assert get_seed_response.seed_length == 0x06
80assert get_seed_response.seed == b'\x00\x01\x02\x03\x04\x05'
81
82= test_unlock
83
84conf.contribs['XCP']['MAX_CTO'] = 8
85cto_request = CTORequest() / Unlock(b'\x06\x69\xAB\xA6\x00\x00\x00')
86assert cto_request.pid == 0xf7
87assert cto_request['Unlock'].len == 0x06
88assert cto_request['Unlock'].seed == b'\x69\xAB\xA6\x00\x00\x00'
89assert bytes(cto_request) == b'\xf7\x06\x69\xAB\xA6\x00\x00\x00'
90
91cto_response = CTOResponse(b'\xff\x14')
92assert cto_response.packet_code == 0xFF
93assert cto_response.answers(cto_request)
94
95unlock_response = cto_response["UnlockPositiveResponse"]
96assert unlock_response.current_resource_protection_status == 0x14
97assert "cal_pag" not in unlock_response.current_resource_protection_status
98assert "x1" not in unlock_response.current_resource_protection_status
99assert "daq" in unlock_response.current_resource_protection_status
100assert "stim" not in unlock_response.current_resource_protection_status
101assert "pgm" in unlock_response.current_resource_protection_status
102assert "x5" not in unlock_response.current_resource_protection_status
103assert "x6" not in unlock_response.current_resource_protection_status
104assert "x7" not in unlock_response.current_resource_protection_status
105
106= test_get_id
107
108conf.contribs['XCP']['byte_order'] = 0
109cto_request = CTORequest() / GetId(b'\x01')
110assert cto_request.pid == 0xfa
111assert bytes(cto_request) == b'\xfa\x01'
112assert cto_request['GetId'].identification_type == 0x01
113
114cto_response = CTOResponse(b'\xff\x00\x00\x00\x06\x00\x00\x00')
115assert cto_response.packet_code == 0xFF
116assert cto_response.answers(cto_request)
117
118get_id_response = cto_response["IdPositiveResponse"]
119assert get_id_response.mode == 0x00
120assert get_id_response.length == 6
121
122
123= test_upload
124
125conf.contribs['XCP']['MAX_CTO'] = 8
126conf.contribs['XCP']['Address_Granularity_Byte'] = 1
127
128cto_request = CTORequest() / Upload(b'\x06')
129assert cto_request.pid == 0xf5
130assert bytes(cto_request) == b'\xf5\x06'
131assert cto_request['Upload'].nr_of_data_elements == 0x06
132
133cto_response = CTOResponse(b'\xff\x58\x43\x50\x53\x49\x4D')
134assert cto_response.packet_code == 0xFF
135assert cto_response.answers(cto_request)
136
137upload_response = cto_response["UploadPositiveResponse"]
138assert upload_response.element == b'\x58\x43\x50\x53\x49\x4D'
139
140= test_cal_page
141
142cto_request = CTORequest() / GetCalPage(b'\x01\x00')
143assert cto_request.pid == 0xea
144assert bytes(cto_request) == b'\xea\x01\x00'
145
146cto_response = CTOResponse(b'\xff\x00\x00\x01')
147assert cto_response.packet_code == 0xFF
148assert cto_response.answers(cto_request)
149
150get_cal_page_response = cto_response["CalPagePositiveResponse"]
151assert get_cal_page_response.logical_data_page_number == 0x01
152
153= test_set_mta
154
155conf.contribs['XCP']['byte_order'] = 0
156
157cto_request = CTORequest() / SetMta(b'\xff\xff\x00\x3c\x00\x00\x00')
158assert cto_request.pid == 0xf6
159assert bytes(cto_request) == b'\xf6\xff\xff\x00\x3c\x00\x00\x00'
160assert cto_request['SetMta'].address_extension == 0x00
161assert cto_request['SetMta'].address == 0x3C
162
163cto_response = CTOResponse(b'\xff')
164assert cto_response.packet_code == 0xFF
165assert cto_response.answers(cto_request)
166
167= test_build_checksum
168
169conf.contribs['XCP']['byte_order'] = 0
170
171cto_request = CTORequest() / BuildChecksum(b'\xff\xff\xff\xad\x0d\x00\x00')
172assert cto_request.pid == 0xf3
173assert bytes(cto_request) == b'\xf3\xff\xff\xff\xad\x0d\x00\x00'
174assert hex(cto_request['BuildChecksum'].block_size) == '0xdad'
175
176cto_response = CTOResponse(b'\xff\x02\xff\xff\x2C\x87\x00\x00')
177assert cto_response.packet_code == 0xFF
178assert cto_response.answers(cto_request)
179
180build_checksum_response = cto_response["ChecksumPositiveResponse"]
181assert build_checksum_response.checksum_type == 0x02
182assert hex(build_checksum_response.checksum) == '0x872c'
183
184= test_download
185
186conf.contribs['XCP']['byte_order'] = 0
187conf.contribs['XCP']['MAX_CTO'] = 8
188conf.contribs['XCP']['Address_Granularity_Byte'] = 1
189
190cto_request = CTORequest() / Download(b'\x04\x00\x00\x80\x3f')
191assert cto_request.pid == 0xf0
192assert bytes(cto_request) == b'\xf0\x04\x00\x00\x80\x3f'
193assert cto_request['Download'].nr_of_data_elements == 0x04
194assert cto_request['Download'].data_elements == b'\x00\x00\x80\x3f'
195
196cto_response = CTOResponse(b'\xff')
197assert cto_response.packet_code == 0xFF
198assert cto_response.answers(cto_request)
199
200= test_short_upload
201
202conf.contribs['XCP']['byte_order'] = 0
203conf.contribs['XCP']['MAX_CTO'] = 8
204conf.contribs['XCP']['Address_Granularity_Byte'] = 1
205
206cto_request = CTORequest() / ShortUpload(b'\04\xff\x00\x60\x00\x00\x00')
207assert cto_request.pid == 0xf4
208assert bytes(cto_request) == b'\xf4\x04\xff\x00\x60\x00\x00\x00'
209assert cto_request['ShortUpload'].nr_of_data_elements == 0x04
210assert cto_request['ShortUpload'].address_extension == 0x00
211assert hex(cto_request['ShortUpload'].address) == '0x60'
212
213cto_response = CTOResponse(b'\xff\x00\x00\x80\x3F')
214assert cto_response.packet_code == 0xFF
215assert cto_response.answers(cto_request)
216
217upload_response = cto_response["ShortUploadPositiveResponse"]
218assert upload_response.element == b'\x00\x00\x80\x3F'
219
220= test_copy_cal_page
221
222cto_request = CTORequest() / CopyCalPage(b'\00\x01\x02\x03')
223assert cto_request.pid == 0xe4
224assert bytes(cto_request) == b'\xe4\00\x01\x02\x03'
225assert cto_request['CopyCalPage'].segment_num_src == 0x00
226assert cto_request['CopyCalPage'].page_num_src == 0x01
227assert cto_request['CopyCalPage'].segment_num_dst == 0x02
228assert cto_request['CopyCalPage'].page_num_dst == 0x03
229
230cto_response = CTOResponse(b'\xff')
231assert cto_response.packet_code == 0xFF
232assert cto_response.answers(cto_request)
233
234= test_get_daq_processor_info
235
236conf.contribs['XCP']['byte_order'] = 0
237
238cto_request = CTORequest() / GetDaqProcessorInfo()
239assert cto_request.pid == 0xda
240assert bytes(cto_request) == b'\xda'
241cto_response = CTOResponse(b'\xff\x11\x00\x00\x01\x00\x00\x40')
242assert cto_response.packet_code == 0xFF
243assert cto_response.answers(cto_request)
244
245processor_info_response = cto_response["DAQProcessorInfoPositiveResponse"]
246assert processor_info_response.daq_properties == 0x11
247assert "daq_config_type" in processor_info_response.daq_properties
248assert "timestamp_supported" in processor_info_response.daq_properties
249
250assert "prescaler_supported" not in processor_info_response.daq_properties
251assert "resume_supported" not in processor_info_response.daq_properties
252assert "bit_stim_supported" not in processor_info_response.daq_properties
253assert "pid_off_supported" not in processor_info_response.daq_properties
254assert "overload_msb" not in processor_info_response.daq_properties
255assert "overload_event" not in processor_info_response.daq_properties
256
257assert processor_info_response.max_daq == 0x0000
258assert processor_info_response.max_event_channel == 0x0001
259assert processor_info_response.min_daq == 0x00
260assert processor_info_response.daq_key_byte == 0x40
261assert "optimisation_type_0" not in processor_info_response.daq_key_byte
262assert "optimisation_type_1" not in processor_info_response.daq_key_byte
263assert "optimisation_type_2" not in processor_info_response.daq_key_byte
264assert "optimisation_type_3" not in processor_info_response.daq_key_byte
265assert "identification_field_type_0" in processor_info_response.daq_key_byte
266assert "identification_field_type_1" not in processor_info_response.daq_key_byte
267
268assert "address_extension_odt" not in processor_info_response.daq_key_byte
269assert "address_extension_daq" not in processor_info_response.daq_key_byte
270assert "address_extension_daq" not in processor_info_response.daq_key_byte
271
272= test_daq_resolution_info
273
274conf.contribs['XCP']['byte_order'] = 0
275
276cto_request = CTORequest() / GetDaqResolutionInfo()
277assert cto_request.pid == 0xd9
278assert bytes(cto_request) == b'\xd9'
279
280cto_response = CTOResponse(b'\xff\x02\xfd\xff\xff\x62\x0a\x00')
281assert cto_response.packet_code == 0xFF
282assert cto_response.answers(cto_request)
283
284resolution_info_response = cto_response["DAQResolutionInfoPositiveResponse"]
285assert resolution_info_response.granularity_odt_entry_size_daq == 0x02
286assert resolution_info_response.max_odt_entry_size_daq == 0xfd
287assert resolution_info_response.granularity_odt_entry_size_stim == 0xff
288assert resolution_info_response.max_odt_entry_size_stim == 0xff
289assert resolution_info_response.timestamp_mode == 0x62
290assert "size_0" not in resolution_info_response.timestamp_mode
291assert "size_1" in resolution_info_response.timestamp_mode
292assert "size_2" not in resolution_info_response.timestamp_mode
293assert "timestamp_fixed" not in resolution_info_response.timestamp_mode
294assert "unit_0" not in resolution_info_response.timestamp_mode
295assert "unit_1" in resolution_info_response.timestamp_mode
296assert "unit_2" in resolution_info_response.timestamp_mode
297assert "unit_3" not in resolution_info_response.timestamp_mode
298
299assert resolution_info_response.timestamp_ticks == 0x000A
300
301= test_daq_event_info
302
303conf.contribs['XCP']['byte_order'] = 0
304
305cto_request = CTORequest() / GetDaqEventInfo(b'\xff\x00\x00')
306assert cto_request.pid == 0xd7
307assert bytes(cto_request) == b'\xd7\xff\x00\x00'
308assert cto_request['GetDaqEventInfo'].event_channel_num == 0x0000
309
310cto_response = CTOResponse(b'\xFF\x04\x01\x05\x0A\x60\x00')
311assert cto_response.packet_code == 0xFF
312assert cto_response.answers(cto_request)
313
314event_info_response = cto_response["DAQEventInfoPositiveResponse"]
315assert event_info_response.daq_event_properties == 0x04
316assert "x_0" not in event_info_response.daq_event_properties
317assert "x_1" not in event_info_response.daq_event_properties
318assert "daq" in event_info_response.daq_event_properties
319assert "stim" not in event_info_response.daq_event_properties
320assert "x_4" not in event_info_response.daq_event_properties
321assert "x_5" not in event_info_response.daq_event_properties
322assert "x_6" not in event_info_response.daq_event_properties
323assert "x_7" not in event_info_response.daq_event_properties
324
325assert event_info_response.max_daq_list == 0x01
326assert event_info_response.event_channel_name_length == 0x05
327assert event_info_response.event_channel_time_cycle == 0x0a
328assert event_info_response.event_channel_time_unit == 0x60
329assert event_info_response.event_channel_priority == 0x00
330
331= test_daq_list_info
332
333conf.contribs['XCP']['byte_order'] = 0
334
335cto_request = CTORequest() / GetDaqListInfo(b'\xff\x00\x00')
336assert cto_request.pid == 0xd8
337assert bytes(cto_request) == b'\xd8\xff\x00\x00'
338assert cto_request['GetDaqListInfo'].daq_list_num == 0x0000
339
340cto_response = CTOResponse(b'\xFF\x04\x03\x0a\x00\x00')
341assert cto_response.packet_code == 0xFF
342assert cto_response.answers(cto_request)
343
344list_info_response = cto_response["DAQListInfoPositiveResponse"]
345assert list_info_response.daq_list_properties == 0x04
346assert "predefined" not in list_info_response.daq_list_properties
347assert "event_fixed" not in list_info_response.daq_list_properties
348assert "daq" in list_info_response.daq_list_properties
349assert "stim" not in list_info_response.daq_list_properties
350assert "x_4" not in list_info_response.daq_list_properties
351assert "x_5" not in list_info_response.daq_list_properties
352assert "x_6" not in list_info_response.daq_list_properties
353assert "x_7" not in list_info_response.daq_list_properties
354
355assert list_info_response.max_odt == 0x03
356assert list_info_response.max_odt_entries == 0x0a
357assert list_info_response.fixed_event == 0x00
358
359= test_clear_daq_list
360
361conf.contribs['XCP']['byte_order'] = 0
362
363cto_request = CTORequest() / ClearDaqList(b'\xff\x00\x00')
364assert cto_request.pid == 0xe3
365assert bytes(cto_request) == b'\xe3\xff\x00\x00'
366assert cto_request['ClearDaqList'].daq_list_num == 0x0000
367
368cto_response = CTOResponse(b'\xFF')
369assert cto_response.packet_code == 0xFF
370assert cto_response.answers(cto_request)
371
372= test_alloc_daq
373
374conf.contribs['XCP']['byte_order'] = 0
375
376cto_request = CTORequest() / AllocDaq(b'\xff\x01\x00')
377assert cto_request.pid == 0xd5
378assert bytes(cto_request) == b'\xd5\xff\x01\x00'
379assert cto_request['AllocDaq'].daq_count == 0x0001
380
381cto_response = CTOResponse(b'\xFF')
382assert cto_response.packet_code == 0xFF
383assert cto_response.answers(cto_request)
384
385= test_alloc_odt
386
387conf.contribs['XCP']['byte_order'] = 0
388
389cto_request = CTORequest() / AllocOdt(b'\xff\x00\x00\x01')
390assert cto_request.pid == 0xd4
391assert bytes(cto_request) == b'\xd4\xff\x00\x00\x01'
392assert cto_request['AllocOdt'].daq_list_num == 0x0000
393assert cto_request['AllocOdt'].odt_count == 0x01
394
395cto_response = CTOResponse(b'\xFF')
396assert cto_response.packet_code == 0xFF
397assert cto_response.answers(cto_request)
398
399= test_alloc_odt_entry
400
401conf.contribs['XCP']['byte_order'] = 0
402
403cto_request = CTORequest() / AllocOdtEntry(b'\xff\x00\x00\x00\x02')
404assert cto_request.pid == 0xd3
405assert bytes(cto_request) == b'\xd3\xff\x00\x00\x00\x02'
406assert cto_request['AllocOdtEntry'].daq_list_num == 0x0000
407assert cto_request['AllocOdtEntry'].odt_num == 0x00
408assert cto_request['AllocOdtEntry'].odt_entries_count == 0x02
409
410cto_response = CTOResponse(b'\xFF')
411assert cto_response.packet_code == 0xFF
412assert cto_response.answers(cto_request)
413
414= test_set_daq_ptr
415
416conf.contribs['XCP']['byte_order'] = 0
417
418cto_request = CTORequest() / SetDaqPtr(b'\xff\x00\x00\x00\x00')
419assert cto_request.pid == 0xe2
420assert bytes(cto_request) == b'\xe2\xff\x00\x00\x00\x00'
421assert cto_request['SetDaqPtr'].daq_list_num == 0x0000
422assert cto_request['SetDaqPtr'].odt_num == 0x00
423assert cto_request['SetDaqPtr'].odt_entry_num == 0x00
424
425cto_response = CTOResponse(b'\xFF')
426assert cto_response.packet_code == 0xFF
427assert cto_response.answers(cto_request)
428
429= test_write_daq
430
431conf.contribs['XCP']['byte_order'] = 0
432
433cto_request = CTORequest() / WriteDaq(b'\xFF\x04\x00\x08\x55\x0C\x00')
434assert cto_request.pid == 0xe1
435assert bytes(cto_request) == b'\xe1\xFF\x04\x00\x08\x55\x0C\x00'
436assert cto_request['WriteDaq'].bit_offset == 0xff
437assert cto_request['WriteDaq'].size_of_daq_element == 0x04
438assert cto_request['WriteDaq'].address_extension == 0x00
439assert cto_request['WriteDaq'].address == 0x000C5508
440
441cto_response = CTOResponse(b'\xFF')
442assert cto_response.packet_code == 0xFF
443assert cto_response.answers(cto_request)
444
445= test_set_daq_list_mode(self):
446conf.contribs['XCP']['byte_order'] = 0
447
448cto_request = CTORequest() / SetDaqListMode(b'\x10\x00\x00\x00\x00\x01\x00')
449assert cto_request.pid == 0xe0
450assert bytes(cto_request) == b'\xe0\x10\x00\x00\x00\x00\x01\x00'
451set_daq_list_mode_request = cto_request['SetDaqListMode']
452assert set_daq_list_mode_request.mode == 0x10
453assert "x0" not in set_daq_list_mode_request.mode
454assert "direction" not in set_daq_list_mode_request.mode
455assert "x2" not in set_daq_list_mode_request.mode
456assert "x3" not in set_daq_list_mode_request.mode
457assert "timestamp" in set_daq_list_mode_request.mode
458assert "pid_off" not in set_daq_list_mode_request.mode
459assert "x6" not in set_daq_list_mode_request.mode
460assert "x7" not in set_daq_list_mode_request.mode
461
462assert set_daq_list_mode_request.daq_list_num == 0x0000
463assert set_daq_list_mode_request.event_channel_num == 0x0000
464assert set_daq_list_mode_request.transmission_rate_prescaler == 0x01
465assert set_daq_list_mode_request.daq_list_prio == 0x00
466
467cto_response = CTOResponse(b'\xFF')
468assert cto_response.packet_code == 0xFF
469assert cto_response.answers(cto_request)
470
471= test_start_stop_daq_list
472
473conf.contribs['XCP']['byte_order'] = 0
474
475cto_request = CTORequest() / StartStopDaqList(b'\x02\x00\x00')
476assert cto_request.pid == 0xde
477assert bytes(cto_request) == b'\xde\x02\x00\x00'
478assert cto_request['StartStopDaqList'].mode == 0x02
479assert cto_request['StartStopDaqList'].daq_list_number == 0x0000
480
481cto_response = CTOResponse(b'\xFF\xbb')
482assert cto_response.packet_code == 0xFF
483assert cto_response.answers(cto_request)
484
485assert cto_response['StartStopDAQListPositiveResponse'].first_pid == 0xbb
486
487= test_get_daq_clock
488
489conf.contribs['XCP']['byte_order'] = 0
490
491cto_request = CTORequest() / GetDaqClock()
492assert cto_request.pid == 0xdc
493assert bytes(cto_request) == b'\xdc'
494
495cto_response = CTOResponse(b'\xFF\xFF\xFF\xFF\xAA\xC5\x00\x00')
496assert cto_response.packet_code == 0xFF
497assert cto_response.answers(cto_request)
498
499get_daq_clock_response = cto_response["DAQClockListPositiveResponse"]
500
501assert get_daq_clock_response.receive_timestamp == 0x0000C5AA
502
503= Test negative response
504
505cto_request = CTORequest() / GetCommModeInfo()
506cto_response = CTOResponse() / NegativeResponse()
507assert cto_response.packet_code == 0xFE
508assert cto_response.answers(cto_request)
509
510= test_start_stop_synch
511
512conf.contribs['XCP']['byte_order'] = 0
513
514cto_request = CTORequest() / StartStopSynch(b'\x01')
515assert cto_request.pid == 0xdd
516assert bytes(cto_request) == b'\xdd\x01'
517assert cto_request['StartStopSynch'].mode == 0x01
518
519cto_response = CTOResponse(b'\xFF')
520assert cto_response.packet_code == 0xFF
521assert cto_response.answers(cto_request)
522
523= test_program_start
524
525conf.contribs['XCP']['byte_order'] = 0
526
527cto_request = CTORequest() / ProgramStart()
528assert cto_request.pid == 0xd2
529assert bytes(cto_request) == b'\xd2'
530
531cto_response = CTOResponse(b'\xFF\xff\x01\x08\x2A\xFF\xdd')
532assert cto_response.packet_code == 0xFF
533assert cto_response.answers(cto_request)
534
535program_start_response = cto_response['ProgramStartPositiveResponse']
536
537assert program_start_response.comm_mode_pgm == 0x01
538assert "master_block_mode" in program_start_response.comm_mode_pgm
539assert "interleaved_mode" not in program_start_response.comm_mode_pgm
540assert "x2" not in program_start_response.comm_mode_pgm
541assert "x3" not in program_start_response.comm_mode_pgm
542assert "x4" not in program_start_response.comm_mode_pgm
543assert "x5" not in program_start_response.comm_mode_pgm
544assert "slave_block_mode" not in program_start_response.comm_mode_pgm
545assert "x7" not in program_start_response.comm_mode_pgm
546
547assert program_start_response.max_cto_pgm == 0x08
548assert program_start_response.max_bs_pgm == 0x2a
549assert program_start_response.min_bs_pgm == 0xff
550assert program_start_response.queue_size_pgm == 0xdd
551
552= test_program_clear(self):
553conf.contribs['XCP']['byte_order'] = 0
554
555cto_request = CTORequest() / ProgramClear(b'\x00\xff\xff\x00\x01\x00\x00')
556assert cto_request.pid == 0xd1
557assert bytes(cto_request) == b'\xd1\x00\xff\xff\x00\x01\x00\x00'
558
559assert cto_request['ProgramClear'].mode == 0x00
560assert cto_request['ProgramClear'].clear_range == 0x00000100
561
562cto_response = CTOResponse(b'\xff')
563assert cto_response.packet_code == 0xFF
564assert cto_response.answers(cto_request)
565
566= test_program
567
568conf.contribs['XCP']['byte_order'] = 0
569conf.contribs['XCP']['MAX_CTO'] = 8
570conf.contribs['XCP']['Address_Granularity_Byte'] = 1
571
572cto_request = CTORequest() / Program(b'\x06\x00\x01\x02\x03\x04\x05')
573assert cto_request.pid == 0xd0
574assert bytes(cto_request) == b'\xd0\x06\x00\x01\x02\x03\x04\x05'
575
576assert cto_request['Program'].nr_of_data_elements == 0x06
577assert cto_request['Program'].data_elements == b"\x00\x01\x02\x03\x04\x05"
578
579cto_response = CTOResponse(b'\xff')
580assert cto_response.packet_code == 0xFF
581assert cto_response.answers(cto_request)
582
583
584+ Tests for XCPonUDP
585
586= CONNECT
587
588cto_request = XCPOnUDP(ctr=0, sport=1, dport=1) / CTORequest() / Connect()
589
590assert cto_request.length is None
591assert cto_request.ctr == 0
592
593assert cto_request.pid == 0xFF
594assert cto_request.connection_mode == 0
595assert bytes(cto_request).endswith(b'\x00\x02\x00\x00\xff\x00')
596xcp_on_udp = XCPOnUDP(b'\x00\x01\x00\x01\x00\x0c\x00\x00\x00\x08\x00\x01\xff\x15\xC0\x08\x08\x00\x10\x10')
597assert xcp_on_udp.length == 8
598assert xcp_on_udp.ctr == 1
599
600assert xcp_on_udp.answers(cto_request)
601cto_response = xcp_on_udp["CTOResponse"]
602assert cto_response.packet_code == 0xFF
603
604connect_response = cto_response["ConnectPositiveResponse"]
605assert connect_response.resource == 0x15
606assert connect_response.comm_mode_basic == 0xC0
607assert connect_response.max_cto == 8
608assert connect_response.max_cto == 8
609
610assert connect_response.xcp_protocol_layer_version_number_msb == 0x10
611assert connect_response.xcp_transport_layer_version_number_msb == 0x10
612
613assert conf.contribs['XCP']['byte_order'] == 0
614assert conf.contribs['XCP']['MAX_CTO'] == 8
615assert conf.contribs['XCP']['MAX_DTO'] == 8
616assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1
617
618= CONNECT 2
619
620prt1, prt2 = 12345, 54321
621xcp_on_udp_request = XCPOnUDP(sport=prt1, dport=prt2, ctr=0) / CTORequest() / Connect()
622
623assert xcp_on_udp_request.length is None
624assert xcp_on_udp_request.ctr == 0
625assert xcp_on_udp_request.pid == 0xFF
626assert xcp_on_udp_request.connection_mode == 0
627assert bytes(xcp_on_udp_request).endswith(b'\x00\x02\x00\x00\xff\x00')
628
629xcp_on_udp_response = XCPOnUDP(b'\xd4109\x00\x0c\x00\x00\x00\x08\x00\x01\xff\x15\xC0\x08\x08\x00\x10\x10')
630assert xcp_on_udp_response.length == 8
631assert xcp_on_udp_response.ctr == 1
632assert xcp_on_udp_response.answers(xcp_on_udp_request)
633
634cto_response = xcp_on_udp_response["CTOResponse"]
635assert cto_response.packet_code == 0xFF
636
637connect_response = cto_response["ConnectPositiveResponse"]
638assert connect_response.resource == 0x15
639assert connect_response.comm_mode_basic == 0xC0
640assert connect_response.max_cto == 8
641assert connect_response.max_cto == 8
642assert connect_response.xcp_protocol_layer_version_number_msb == 0x10
643assert connect_response.xcp_transport_layer_version_number_msb == 0x10
644assert conf.contribs['XCP']['byte_order'] == 0
645assert conf.contribs['XCP']['MAX_CTO'] == 8
646assert conf.contribs['XCP']['MAX_DTO'] == 8
647assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1
648
649= XCPOnUDP post build length
650
651xcp_on_udp_request = XCPOnUDP(sport=1, dport=2, ctr=0) / CTORequest() / Connect()
652assert bytes(xcp_on_udp_request)[8:10] == b'\x00\x02'
653
654+ Tests XCPonTCP
655
656= CONNECT
657
658prt1, prt2 = 12345, 54321
659
660xcp_on_tcp_request = XCPOnTCP(sport=prt1, dport=prt2, ctr=0) / CTORequest() / Connect()
661assert xcp_on_tcp_request.length is None
662assert xcp_on_tcp_request.ctr == 0
663assert xcp_on_tcp_request.pid == 0xFF
664assert xcp_on_tcp_request.connection_mode == 0
665assert bytes(xcp_on_tcp_request).endswith(b'\x00\x02\x00\x00\xff\x00')
666
667xcp_on_tcp_response = XCPOnTCP(b'\xd4109\x00\x00\x00\x00\x00\x00\x00\x00P\x12 \x00\x00\x00\x00\x00\x00\x08\x00\x01\xff\x15\xC0\x08\x08\x00\x10\x10')
668assert xcp_on_tcp_response.length == 8
669assert xcp_on_tcp_response.ctr == 1
670assert xcp_on_tcp_response.answers(xcp_on_tcp_request)
671
672cto_response = xcp_on_tcp_response["CTOResponse"]
673assert cto_response.packet_code == 0xFF
674
675connect_response = cto_response["ConnectPositiveResponse"]
676assert connect_response.resource == 0x15
677assert connect_response.comm_mode_basic == 0xC0
678assert connect_response.max_cto == 8
679assert connect_response.max_cto == 8
680assert connect_response.xcp_protocol_layer_version_number_msb == 0x10
681assert connect_response.xcp_transport_layer_version_number_msb == 0x10
682assert conf.contribs['XCP']['byte_order'] == 0
683assert conf.contribs['XCP']['MAX_CTO'] == 8
684assert conf.contribs['XCP']['MAX_DTO'] == 8
685assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1
686
687
688= XCPOnTCP post build length
689
690xcp_on_tcp_request = XCPOnTCP(sport=prt1, dport=prt2, ctr=0) / CTORequest() / Connect()
691assert bytes(xcp_on_tcp_request)[20:22] == b'\x00\x02'
692