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