1% Regression tests for the XCP using CANSockets 2 3############ 4############ 5 6+ Configuration 7~ conf 8 9= Imports 10 11from test.testsocket import TestSocket, cleanup_testsockets 12 13= Load module 14 15load_contrib("automotive.xcp.xcp", globals_dict=globals()) 16 17= Connect 18 19sock1 = TestSocket(XCPOnCAN) 20sock2 = TestSocket(XCPOnCAN) 21sock1.pair(sock2) 22 23response = XCPOnCAN(identifier=0x700) / CTOResponse() / ConnectPositiveResponse(b'\x15\xC0\x08\x08\x00\x10\x10') 24sniffer = AsyncSniffer(opened_socket=sock2, count=1, timeout=5, prn=lambda x: sock2.send(response)) 25sniffer.start() 26pkt = XCPOnCAN(identifier=0x700) / CTORequest() / Connect() 27ans = sock1.sr1(pkt, timeout=0.5, verbose=False) 28sniffer.join(timeout=1) 29 30assert ans.identifier == 0x700 31cto_response = ans["CTOResponse"] 32assert cto_response.packet_code == 0xff 33 34connect_response = cto_response["ConnectPositiveResponse"] 35 36assert connect_response.resource == 0x15 37assert connect_response.comm_mode_basic == 0xC0 38assert connect_response.max_cto == 8 39assert connect_response.max_dto is None 40assert connect_response.max_dto_le == 8 41 42assert connect_response.xcp_protocol_layer_version_number_msb == 0x10 43assert connect_response.xcp_transport_layer_version_number_msb == 0x10 44 45 46cto_request = XCPOnCAN(identifier=0x700) / CTORequest() / Connect() 47 48assert cto_request.identifier == 0x700 49assert cto_request.pid == 0xFF 50assert cto_request.connection_mode == 0 51assert bytes(cto_request) == b'\x00\x00\x07\x00\x02\x00\x00\x00\xff\x00' 52 53xcp_on_can = XCPOnCAN(b'\x00\x00\x05\x00\x08\x00\x00\x00\xff\x15\xC0\x08\x08\x00\x10\x10') 54assert xcp_on_can.identifier == 0x500 55assert xcp_on_can.answers(cto_request) 56 57cto_response = xcp_on_can["CTOResponse"] 58assert cto_response.packet_code == 0xFF 59 60connect_response = cto_response["ConnectPositiveResponse"] 61assert connect_response.resource == 0x15 62assert connect_response.comm_mode_basic == 0xC0 63assert connect_response.max_cto == 8 64assert connect_response.max_cto == 8 65 66assert connect_response.xcp_protocol_layer_version_number_msb == 0x10 67assert connect_response.xcp_transport_layer_version_number_msb == 0x10 68 69assert conf.contribs['XCP']['byte_order'] == 0 70assert conf.contribs['XCP']['MAX_CTO'] == 8 71assert conf.contribs['XCP']['MAX_DTO'] == 8 72assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1 73 74 75= Endianness test for ConnectPositiveResponse 76 77p = ConnectPositiveResponse(b"\x00\xFF\x01\x00\xFF\x05\x05") 78assert p.max_dto_le is None 79assert p.max_dto == 0xff 80 81p = ConnectPositiveResponse(b"\x00\x00\x01\xFF\x00\x05\x05") 82assert p.max_dto_le == 0xff 83assert p.max_dto is None 84 85 86= Wrong answer 87 88request = XCPOnCAN(identifier=0x700) / CTORequest() / Connect() 89 90# This response has not enough bytes for a ConnectPositiveResponse 91response = XCPOnCAN(identifier=0x90) / CTOResponse() / Raw(b'\x01\x02\x03\x04') 92 93assert not response.answers(request) 94 95 96+ Cleanup 97 98= Delete TestSockets 99 100cleanup_testsockets() 101 102