% Regression tests for the XCP using CANSockets

############
############

+ Configuration
~ conf

= Imports

from test.testsocket import TestSocket, cleanup_testsockets

= Load module

load_contrib("automotive.xcp.xcp",  globals_dict=globals())

= Connect

sock1 = TestSocket(XCPOnCAN)
sock2 = TestSocket(XCPOnCAN)
sock1.pair(sock2)

response = XCPOnCAN(identifier=0x700) / CTOResponse() / ConnectPositiveResponse(b'\x15\xC0\x08\x08\x00\x10\x10')
sniffer = AsyncSniffer(opened_socket=sock2, count=1, timeout=5, prn=lambda x: sock2.send(response))
sniffer.start()
pkt = XCPOnCAN(identifier=0x700) / CTORequest() / Connect()
ans = sock1.sr1(pkt, timeout=0.5, verbose=False)
sniffer.join(timeout=1)

assert ans.identifier == 0x700
cto_response = ans["CTOResponse"]
assert cto_response.packet_code == 0xff

connect_response = cto_response["ConnectPositiveResponse"]

assert connect_response.resource == 0x15
assert connect_response.comm_mode_basic == 0xC0
assert connect_response.max_cto == 8
assert connect_response.max_dto is None
assert connect_response.max_dto_le == 8

assert connect_response.xcp_protocol_layer_version_number_msb == 0x10
assert connect_response.xcp_transport_layer_version_number_msb == 0x10


cto_request = XCPOnCAN(identifier=0x700) / CTORequest() / Connect()

assert cto_request.identifier == 0x700
assert cto_request.pid == 0xFF
assert cto_request.connection_mode == 0
assert bytes(cto_request) == b'\x00\x00\x07\x00\x02\x00\x00\x00\xff\x00'

xcp_on_can = XCPOnCAN(b'\x00\x00\x05\x00\x08\x00\x00\x00\xff\x15\xC0\x08\x08\x00\x10\x10')
assert xcp_on_can.identifier == 0x500
assert xcp_on_can.answers(cto_request)

cto_response = xcp_on_can["CTOResponse"]
assert cto_response.packet_code == 0xFF

connect_response = cto_response["ConnectPositiveResponse"]
assert connect_response.resource == 0x15
assert connect_response.comm_mode_basic == 0xC0
assert connect_response.max_cto == 8
assert connect_response.max_cto == 8

assert connect_response.xcp_protocol_layer_version_number_msb == 0x10
assert connect_response.xcp_transport_layer_version_number_msb == 0x10

assert conf.contribs['XCP']['byte_order'] == 0
assert conf.contribs['XCP']['MAX_CTO'] == 8
assert conf.contribs['XCP']['MAX_DTO'] == 8
assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1


= Endianness test for ConnectPositiveResponse

p = ConnectPositiveResponse(b"\x00\xFF\x01\x00\xFF\x05\x05")
assert p.max_dto_le is None
assert p.max_dto == 0xff

p = ConnectPositiveResponse(b"\x00\x00\x01\xFF\x00\x05\x05")
assert p.max_dto_le == 0xff
assert p.max_dto is None


= Wrong answer

request = XCPOnCAN(identifier=0x700) / CTORequest() / Connect()

# This response has not enough bytes for a ConnectPositiveResponse
response = XCPOnCAN(identifier=0x90) / CTOResponse() / Raw(b'\x01\x02\x03\x04')

assert not response.answers(request)


+ Cleanup

= Delete TestSockets

cleanup_testsockets()

