% Regression tests for the UDS layer

# More information at http://www.secdev.org/projects/UTscapy/


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

+ Basic operations

= Load module
load_contrib("automotive.uds", globals_dict=globals())
load_contrib("automotive.ecu", globals_dict=globals())

from scapy.contrib.automotive.uds_ecu_states import *

= Check if positive response answers

dsc = UDS(b'\x10')
dscpr = UDS(b'\x50')
assert dscpr.answers(dsc)

= Check hashret
dsc.hashret() == dscpr.hashret()

= Check if negative response answers

dsc = UDS(b'\x10')
neg = UDS(b'\x7f\x10\x00')
assert neg.answers(dsc)

= CHECK hashret NEG
dsc.hashret() == neg.hashret()

= Check if negative response answers not

dsc = UDS(b'\x10')
neg = UDS(b'\x7f\x11\x00')
assert not neg.answers(dsc)

= Check if positive response answers not

dsc = UDS(b'\x10')
somePacket = UDS(b'\x49')
assert not somePacket.answers(dsc)

= Check UDS_DSC

dsc = UDS(b'\x10\x01')
assert dsc.service == 0x10
assert dsc.diagnosticSessionType == 0x01

= Check UDS_DSC

dsc = UDS()/UDS_DSC(b'\x01')
assert dsc.service == 0x10
assert dsc.diagnosticSessionType == 0x01

= Check UDS_DSCPR

dscpr = UDS(b'\x50\x02beef')
assert dscpr.service == 0x50
assert dscpr.diagnosticSessionType == 0x02

assert not dscpr.answers(dsc)

= Check UDS_DSCPR

dscpr = UDS()/UDS_DSCPR(b'\x01beef')
assert dscpr.service == 0x50
assert dscpr.diagnosticSessionType == 0x01
assert dscpr.sessionParameterRecord == b"beef"

assert dscpr.answers(dsc)

= Check UDS_DSC

dsc = UDS()/UDS_DSC(b'\x01')
assert dsc.service == 0x10
assert dsc.diagnosticSessionType == 0x01

= Check UDS_DSCPR

dscpr = UDS()/UDS_DSCPR(b'\x01beef')
assert dscpr.service == 0x50
assert dscpr.diagnosticSessionType == 0x01
assert dscpr.sessionParameterRecord == b"beef"

assert dscpr.answers(dsc)

= Check UDS_DSC modifies ecu state

dsc = UDS()/UDS_DSC(b'\x09')
assert dsc.service == 0x10
assert dsc.diagnosticSessionType == 0x09

= Check UDS_DSCPR modifies ecu state

dscpr = UDS()/UDS_DSCPR(b'\x09beef')
assert dscpr.service == 0x50
assert dscpr.diagnosticSessionType == 0x09
assert dscpr.sessionParameterRecord == b"beef"

ecu = Ecu()
ecu.update(dsc)
ecu.update(dscpr)
assert ecu.state.session == 9

= Check UDS_ER

er = UDS(b'\x11\x01')
assert er.service == 0x11
assert er.resetType == 0x01

= Check UDS_ER

er = UDS()/UDS_ER(resetType="hardReset")
assert er.service == 0x11
assert er.resetType == 0x01

= Check UDS_ERPR

erpr = UDS(b'\x51\x01')
assert erpr.service == 0x51
assert erpr.resetType == 0x01

assert erpr.answers(er)

= Check UDS_ERPR

erpr = UDS(b'\x51\x04\x10')
assert erpr.service == 0x51
assert erpr.resetType == 0x04
assert erpr.powerDownTime == 0x10

= Check UDS_ERPR modifies ecu state

erpr = UDS(b'\x51\x01')
assert erpr.service == 0x51
assert erpr.resetType == 0x01

ecu = Ecu()
ecu.state.security_level = 5
ecu.state.session = 3
ecu.state.communication_control = 4
ecu.update(er)
ecu.update(erpr)

assert ecu.state.session == 1

= Check UDS_SA

sa = UDS(b'\x27\x00c0ffee')
assert sa.service == 0x27
assert sa.securityAccessType == 0x0
assert sa.securityKey == b'c0ffee'

= Check UDS_SAPR

sapr = UDS(b'\x67\x00')
assert sapr.service == 0x67
assert sapr.securityAccessType == 0x0

assert sapr.answers(sa)

= Check UDS_SA

sa = UDS(b'\x27\x01c0ffee')
assert sa.service == 0x27
assert sa.securityAccessType == 0x1
assert sa.securityAccessDataRecord == b'c0ffee'

= Check UDS_SAPR

sapr = UDS(b'\x67\x01c0ffee')
assert sapr.service == 0x67
assert sapr.securityAccessType == 0x1
assert sapr.securitySeed == b'c0ffee'

assert sapr.answers(sa)

= Check UDS_SA

sa = UDS(b'\x27\x06c0ffee')
assert sa.service == 0x27
assert sa.securityAccessType == 0x6
assert sa.securityKey == b'c0ffee'


= Check UDS_SAPR modifies ecu state

sapr = UDS(b'\x67\x06')
assert sapr.service == 0x67
assert sapr.securityAccessType == 0x6

ecu = Ecu()
ecu.update(sa)
ecu.update(sapr)
assert ecu.state.security_level == 6

= Check UDS_SA

sa = UDS(b'\x27\x01c0ffee')
assert sa.service == 0x27
assert sa.securityAccessType == 0x1
assert sa.securityAccessDataRecord == b'c0ffee'

= Check UDS_SAPR

sapr = UDS(b'\x67\x01c0ffee')
assert sapr.service == 0x67
assert sapr.securityAccessType == 0x1
assert sapr.securitySeed == b'c0ffee'


= Check UDS_CC

cc = UDS(b'\x28\x01\xff')
assert cc.service == 0x28
assert cc.controlType == 0x1
assert cc.communicationType0 == 0x3
assert cc.communicationType1 == 0x3
assert cc.communicationType2 == 0xf

= Check UDS_CCPR

ccpr = UDS(b'\x68\x01')
assert ccpr.service == 0x68
assert ccpr.controlType == 0x1

assert ccpr.answers(cc)

= Check UDS_CCPR modifies ecu state

ccpr = UDS(b'\x68\x01')
assert ccpr.service == 0x68
assert ccpr.controlType == 0x1

ecu = Ecu()
ecu.update(cc)
ecu.update(ccpr)
assert ecu.state.communication_control == 1

= Check UDS_AUTH

auth = UDS(b"\x29\x00")
assert auth.service == 0x29
assert auth.subFunction == 0x0

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x0)
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x00\x00")
assert authpr.service == 0x69
assert authpr.subFunction == 0x0
assert authpr.returnValue == 0x0

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x0, returnValue=0x0)
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x01\x01\x00\x01\xFF\x00\x01\xFF")
assert auth.service == 0x29
assert auth.subFunction == 0x1
assert auth.communicationConfiguration == 0x1
assert auth.lengthOfCertificateClient == 0x1
assert auth.certificateClient == b"\xFF"
assert auth.lengthOfChallengeClient == 0x1
assert auth.challengeClient == b"\xFF"

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x1, communicationConfiguration=0x1,
                            certificateClient=b"\xFF", challengeClient=b"\xFF")
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x01\x00\x00\x01\xFF\x00\x01\xFE")
assert authpr.service == 0x69
assert authpr.subFunction == 0x1
assert authpr.returnValue == 0x0
assert authpr.lengthOfChallengeServer == 0x1
assert authpr.challengeServer == b"\xFF"
assert authpr.lengthOfEphemeralPublicKeyServer == 0x1
assert authpr.ephemeralPublicKeyServer == b"\xFE"

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x1, returnValue=0x0,
                                challengeServer=b"\xFF",
                                ephemeralPublicKeyServer=b"\xFE")
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x02\x01\x00\x01\xFF\x00\x01\xFF")
assert auth.service == 0x29
assert auth.subFunction == 0x2
assert auth.communicationConfiguration == 0x1
assert auth.lengthOfCertificateClient == 0x1
assert auth.certificateClient == b"\xFF"
assert auth.lengthOfChallengeClient == 0x1
assert auth.challengeClient == b"\xFF"

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x2, communicationConfiguration=0x1,
                            certificateClient=b"\xFF", challengeClient=b"\xFF")
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x02\x00\x00\x01\xFF\x00\x03\xC0\xFF\xEE\x00\x01\x56\x00" +
             b"\x01\xFE")
assert authpr.service == 0x69
assert authpr.subFunction == 0x2
assert authpr.returnValue == 0x0
assert authpr.lengthOfChallengeServer == 0x1
assert authpr.challengeServer == b"\xFF"
assert authpr.lengthOfCertificateServer == 0x3
assert authpr.certificateServer == b"\xC0\xFF\xEE"
assert authpr.lengthOfProofOfOwnershipServer == 0x1
assert authpr.proofOfOwnershipServer == b"\x56"
assert authpr.lengthOfEphemeralPublicKeyServer == 0x1
assert authpr.ephemeralPublicKeyServer == b"\xFE"

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x2, returnValue=0x0,
                                challengeServer=b"\xFF",
                                certificateServer=b"\xC0\xFF\xEE",
                                proofOfOwnershipServer=b"\x56",
                                ephemeralPublicKeyServer=b"\xFE")
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x03\x00\x01\xFF\x00\x02\xFF\xFE")
assert auth.service == 0x29
assert auth.subFunction == 0x3
assert auth.lengthOfProofOfOwnershipClient == 0x1
assert auth.proofOfOwnershipClient == b"\xFF"
assert auth.lengthOfEphemeralPublicKeyClient == 0x2
assert auth.ephemeralPublicKeyClient == b"\xFF\xFE"

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x3, proofOfOwnershipClient=b"\xFF",
                            ephemeralPublicKeyClient=b"\xFF\xFE")
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x03\x00\x00\x01\xFE")
assert authpr.service == 0x69
assert authpr.subFunction == 0x3
assert authpr.returnValue == 0x0
assert authpr.lengthOfSessionKeyInfo == 0x1
assert authpr.sessionKeyInfo == b"\xFE"

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x3, returnValue=0x0,
                                sessionKeyInfo=b"\xFE")
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x04\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE")
assert auth.service == 0x29
assert auth.subFunction == 0x4
assert auth.certificateEvaluationId == 0x3
assert auth.lengthOfCertificateData == 0x5
assert auth.certificateData == b"\xFF\x00\x02\xFF\xFE"

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x4, certificateEvaluationId=0x3,
                            certificateData=b"\xFF\x00\x02\xFF\xFE")
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x04\x00")
assert authpr.service == 0x69
assert authpr.subFunction == 0x4
assert authpr.returnValue == 0x0

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x4, returnValue=0x0)
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x05\x01\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
           b"\xFF\xEE\x20\x01")
assert auth.service == 0x29
assert auth.subFunction == 0x5
assert auth.communicationConfiguration == 0x1
assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
                                  b"\x34\x56\x03\xFF\xEE\x20\x01")

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x5, communicationConfiguration=0x1,
                            algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" +
                                                b"\xFF\xFE\xBE\x34\x56\x03" +
                                                b"\xFF\xEE\x20\x01"))
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x05\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
             b"\xFF\xEE\x20\x01\x00\x01\xFF\x00\x00")
assert authpr.service == 0x69
assert authpr.subFunction == 0x5
assert authpr.returnValue == 0x0
assert authpr.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
                                     b"\x34\x56\x03\xFF\xEE\x20\x01")
assert authpr.lengthOfChallengeServer == 0x1
assert authpr.challengeServer == b"\xFF"
assert authpr.lengthOfNeededAdditionalParameter == 0x0
assert authpr.neededAdditionalParameter == b""

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x5, returnValue=0x0,
                                algorithmIndicator=(b"\x03\x00\x05\xFF\x00" +
                                                    b"\x02\xFF\xFE\xBE\x34" +
                                                    b"\x56\x03\xFF\xEE\x20" +
                                                    b"\x01"),
                                challengeServer=b"\xFF")
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x06\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03\xFF" +
           b"\xEE\x20\x01\x00\x01\xFF\x00\x01\xFF\x00\x00")
assert auth.service == 0x29
assert auth.subFunction == 0x6
assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
assert auth.lengthOfProofOfOwnershipClient == 0x1
assert auth.proofOfOwnershipClient == b"\xFF"
assert auth.lengthOfChallengeClient == 0x1
assert auth.challengeClient == b"\xFF"
assert auth.lengthOfAdditionalParameter == 0x0
assert auth.additionalParameter == b""

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x6,
                            algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" +
                                                b"\xFF\xFE\xBE\x34\x56\x03" +
                                                b"\xFF\xEE\x20\x01"),
                            proofOfOwnershipClient=b"\xFF",
                            challengeClient=b"\xFF")
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x06\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
             b"\xFF\xEE\x20\x01\x00\x01\xFE")
assert authpr.service == 0x69
assert authpr.subFunction == 0x6
assert authpr.returnValue == 0x0
assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
assert authpr.lengthOfSessionKeyInfo == 0x1
assert authpr.sessionKeyInfo == b"\xFE"

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x6, returnValue=0x0,
                                algorithmIndicator=(b"\x03\x00\x05\xFF\x00" +
                                                    b"\x02\xFF\xFE\xBE\x34" +
                                                    b"\x56\x03\xFF\xEE\x20\x01"
                                                    ),
                                sessionKeyInfo=b"\xFE")
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x07\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03\xFF" +
           b"\xEE\x20\x01\x00\x01\xFF\x00\x01\xFF\x00\x02\xC0\xCA")
assert auth.service == 0x29
assert auth.subFunction == 0x7
assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
assert auth.lengthOfProofOfOwnershipClient == 0x1
assert auth.proofOfOwnershipClient == b"\xFF"
assert auth.lengthOfChallengeClient == 0x1
assert auth.challengeClient == b"\xFF"
assert auth.lengthOfAdditionalParameter == 0x2
assert auth.additionalParameter == b"\xC0\xCA"

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x7,
                            algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" +
                                                b"\xFF\xFE\xBE\x34\x56\x03" +
                                                b"\xFF\xEE\x20\x01"),
                            proofOfOwnershipClient=b"\xFF",
                            challengeClient=b"\xFF",
                            additionalParameter=b"\xC0\xCA")
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x07\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
             b"\xFF\xEE\x20\x01\x00\x02\xFE\x20\x00\x01\xFE")
assert authpr.service == 0x69
assert authpr.subFunction == 0x7
assert authpr.returnValue == 0x0
assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
assert authpr.lengthOfProofOfOwnershipServer == 0x2
assert authpr.proofOfOwnershipServer == b"\xFE\x20"
assert authpr.lengthOfSessionKeyInfo == 0x1
assert authpr.sessionKeyInfo == b"\xFE"

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x7, returnValue=0x0,
                                algorithmIndicator=(b"\x03\x00\x05\xFF\x00" +
                                                    b"\x02\xFF\xFE\xBE\x34" +
                                                    b"\x56\x03\xFF\xEE\x20\x01"
                                                    ),
                                proofOfOwnershipServer=b"\xFE\x20",
                                sessionKeyInfo=b"\xFE")
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_AUTH

auth = UDS(b"\x29\x08")
assert auth.service == 0x29
assert auth.subFunction == 0x8

= Build UDS_AUTH

auth_build = UDS()/UDS_AUTH(subFunction=0x8)
assert bytes(auth_build) == bytes(auth)

= Check UDS_AUTHPR

authpr = UDS(b"\x69\x08\x00")
assert authpr.service == 0x69
assert authpr.subFunction == 0x8
assert authpr.returnValue == 0x0

assert authpr.answers(auth)

= Build UDS_AUTHPR

authpr_build = UDS()/UDS_AUTHPR(subFunction=0x8)
assert bytes(authpr_build) == bytes(authpr)

= Check UDS_TP

tp = UDS(b'\x3E\x01')
assert tp.service == 0x3e
assert tp.subFunction == 0x1

= Check UDS_TPPR

tppr = UDS(b'\x7E\x01')
assert tppr.service == 0x7e
assert tppr.zeroSubFunction == 0x1

assert tppr.answers(tp)

= Check UDS_ATP

atp = UDS(b'\x83\x01')
assert atp.service == 0x83
assert atp.timingParameterAccessType == 0x1

= Check UDS_ATPPR

atppr = UDS(b'\xc3\x01')
assert atppr.service == 0xc3
assert atppr.timingParameterAccessType == 0x1

assert atppr.answers(atp)

= Check UDS_ATP

atp = UDS(b'\x83\x04coffee')
assert atp.service == 0x83
assert atp.timingParameterAccessType == 0x4
assert atp.timingParameterRequestRecord == b'coffee'

= Check UDS_ATPPR

atppr = UDS(b'\xc3\x03coffee')
assert atppr.service == 0xc3
assert atppr.timingParameterAccessType == 0x3
assert atppr.timingParameterResponseRecord == b'coffee'

= Check UDS_SDT

sdt = UDS(b'\x84\x80\x00\x01\x12\x34\x13\x37\x01coffee')
assert sdt.service == 0x84
assert sdt.requestMessage == 0x1
assert sdt.preEstablishedKeyUsed == 0x0
assert sdt.encryptedMessage == 0x0
assert sdt.signedMessage == 0x0
assert sdt.signedResponseRequested == 0x0
assert sdt.signatureEncryptionCalculation == 0x1
assert sdt.signatureLength == 0x1234
assert sdt.antiReplayCounter == 0x1337
assert sdt.internalMessageServiceRequestId == 0x1
assert sdt.dataRecord == b'coffee'

= Build UDS_SDT

sdt = UDS()/UDS_SDT(requestMessage=0x1, signatureEncryptionCalculation=0x1,
                    signatureLength=0x1234, antiReplayCounter=0x1337,
                    internalMessageServiceRequestId=0x1, dataRecord=b'coffee')
assert sdt.service == 0x84
assert sdt.requestMessage == 0x1
assert sdt.preEstablishedKeyUsed == 0x0
assert sdt.encryptedMessage == 0x0
assert sdt.signedMessage == 0x0
assert sdt.signedResponseRequested == 0x0
assert sdt.signatureEncryptionCalculation == 0x1
assert sdt.signatureLength == 0x1234
assert sdt.antiReplayCounter == 0x1337
assert sdt.internalMessageServiceRequestId == 0x1
assert sdt.dataRecord == b'coffee'

= Check UDS_SDTPR

sdtpr = UDS(b'\xC4\x04\x00\x01\x12\x34\x13\x37\x01coffee')
assert sdtpr.service == 0xC4
assert sdtpr.requestMessage == 0x0
assert sdtpr.preEstablishedKeyUsed == 0x0
assert sdtpr.encryptedMessage == 0x0
assert sdtpr.signedMessage == 0x1
assert sdtpr.signedResponseRequested == 0x0
assert sdtpr.signatureEncryptionCalculation == 0x1
assert sdtpr.signatureLength == 0x1234
assert sdtpr.antiReplayCounter == 0x1337
assert sdtpr.internalMessageServiceResponseId == 0x1
assert sdtpr.dataRecord == b'coffee'

assert sdtpr.answers(sdt)

= Check UDS_CDTCS

cdtcs = UDS(b'\x85\x00coffee')
assert cdtcs.service == 0x85
assert cdtcs.DTCSettingType == 0
assert cdtcs.DTCSettingControlOptionRecord == b'coffee'

= Check UDS_CDTCSPR

cdtcspr = UDS(b'\xC5\x00')
assert cdtcspr.service == 0xC5
assert cdtcspr.DTCSettingType == 0

assert cdtcspr.answers(cdtcs)

= Check UDS_ROE

roe = UDS(b'\x86\x00\x10coffee')
assert roe.service == 0x86
assert roe.eventType == 0
assert roe.eventWindowTime == 16
assert roe.eventTypeRecord == b'coffee'

= Check UDS_ROEPR

roepr = UDS(b'\xC6\x00\x01\x10coffee')
assert roepr.service == 0xC6
assert roepr.eventType == 0
assert roepr.numberOfIdentifiedEvents == 1
assert roepr.eventWindowTime == 16
assert roepr.eventTypeRecord == b'coffee'

assert roepr.answers(roe)

= Check UDS_LC

lc = UDS(b'\x87\x01\x02')
assert lc.service == 0x87
assert lc.linkControlType == 0x01
assert lc.baudrateIdentifier == 0x02

= Check UDS_LCPR

lcpr = UDS(b'\xC7\x01')
assert lcpr.service == 0xC7
assert lcpr.linkControlType == 0x01

assert lcpr.answers(lc)

= Check UDS_LC

lc = UDS(b'\x87\x02\x02\x03\x04')
assert lc.service == 0x87
assert lc.linkControlType == 0x02
assert lc.baudrateHighByte == 0x02
assert lc.baudrateMiddleByte == 0x03
assert lc.baudrateLowByte == 0x04

= Check UDS_RDBI

rdbi = UDS(b'\x22\x01\x02')
assert rdbi.service == 0x22
assert rdbi.identifiers[0] == 0x0102

= Build UDS_RDBI

rdbi = UDS()/UDS_RDBI(identifiers=[0x102])
assert rdbi.service == 0x22
assert rdbi.identifiers[0] == 0x0102
assert bytes(rdbi) == b'\x22\x01\x02'

= Check UDS_RDBI2

rdbi = UDS(b'\x22\x01\x02\x03\x04')
assert rdbi.service == 0x22
assert rdbi.identifiers[0] == 0x0102
assert rdbi.identifiers[1] == 0x0304
assert raw(rdbi) == b'\x22\x01\x02\x03\x04'

= Build UDS_RDBI2

rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x304])
assert rdbi.service == 0x22
assert rdbi.identifiers[0] == 0x0102
assert rdbi.identifiers[1] == 0x0304
assert raw(rdbi) == b'\x22\x01\x02\x03\x04'

= Test observable dict used in UDS_RDBI, setter

UDS_RDBI.dataIdentifiers[0x102] = "turbo"
UDS_RDBI.dataIdentifiers[0x103] = "fullspeed"

rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103])

assert "turbo" in plain_str(repr(rdbi))
assert "fullspeed" in plain_str(repr(rdbi))

= Test observable dict used in UDS_RDBI, deleter

UDS_RDBI.dataIdentifiers[0x102] = "turbo"

rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103])
assert "turbo" in plain_str(repr(rdbi))

del UDS_RDBI.dataIdentifiers[0x102]
UDS_RDBI.dataIdentifiers[0x103] = "slowspeed"

rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103])

assert "turbo" not in plain_str(repr(rdbi))
assert "slowspeed" in plain_str(repr(rdbi))

= Check UDS_RDBIPR

rdbipr = UDS(b'\x62\x01\x02dieselgate')
assert rdbipr.service == 0x62
assert rdbipr.dataIdentifier == 0x0102
assert rdbipr.load == b'dieselgate'

assert rdbipr.answers(rdbi)

= Check UDS_RMBA

rmba = UDS(b'\x23\x11\x02\x02')
assert rmba.service == 0x23
assert rmba.memorySizeLen == 1
assert rmba.memoryAddressLen == 1
assert rmba.memoryAddress1 == 2
assert rmba.memorySize1 == 2

= Check UDS_RMBA

rmba = UDS(b'\x23\x22\x02\x02\x03\x03')
assert rmba.service == 0x23
assert rmba.memorySizeLen == 2
assert rmba.memoryAddressLen == 2
assert rmba.memoryAddress2 == 0x202
assert rmba.memorySize2 == 0x303

= Check UDS_RMBA

rmba = UDS(b'\x23\x33\x02\x02\x02\x03\x03\x03')
assert rmba.service == 0x23
assert rmba.memorySizeLen == 3
assert rmba.memoryAddressLen == 3
assert rmba.memoryAddress3 == 0x20202
assert rmba.memorySize3 == 0x30303

= Check UDS_RMBA

rmba = UDS(b'\x23\x44\x02\x02\x02\x02\x03\x03\x03\x03')
assert rmba.service == 0x23
assert rmba.memorySizeLen == 4
assert rmba.memoryAddressLen == 4
assert rmba.memoryAddress4 == 0x2020202
assert rmba.memorySize4 == 0x3030303

= Check UDS_RMBAPR

rmbapr = UDS(b'\x63muchData')
assert rmbapr.service == 0x63
assert rmbapr.dataRecord == b'muchData'

assert rmbapr.answers(rmba)

= Check UDS_RSDBI

rsdbi = UDS(b'\x24\x12\x34')
assert rsdbi.service == 0x24
assert rsdbi.dataIdentifier == 0x1234

= Check UDS_RSDBIPR

rsdbipr = UDS(b'\x64\x12\x34\xffmuchData')
assert rsdbipr.service == 0x64
assert rsdbipr.dataIdentifier == 0x1234
assert rsdbipr.scalingByte == 255
assert rsdbipr.dataRecord == b'muchData'

assert rsdbipr.answers(rsdbi)

= Check UDS_RSDBPI

rsdbpi = UDS(b'\x2a\x12\x34coffee')
assert rsdbpi.service == 0x2a
assert rsdbpi.transmissionMode == 0x12
assert rsdbpi.periodicDataIdentifier == 0x34
assert rsdbpi.furtherPeriodicDataIdentifier == b'coffee'

= Check UDS_RSDBPIPR

rsdbpipr = UDS(b'\x6a\xff\x12\x34')
assert rsdbpipr.service == 0x6a
assert rsdbpipr.periodicDataIdentifier == 255
assert rsdbpipr.dataRecord == b'\x12\x34'

assert not rsdbpipr.answers(rsdbpi)

= Check UDS_RSDBPIPR

rsdbpipr = UDS(b'\x6a\x34\x12\x34')
assert rsdbpipr.service == 0x6a
assert rsdbpipr.periodicDataIdentifier == 0x34
assert rsdbpipr.dataRecord == b'\x12\x34'

assert rsdbpipr.answers(rsdbpi)

= Check UDS_DDDI

dddi = UDS(b'\x2c\x12coffee')
assert dddi.service == 0x2c
assert dddi.subFunction == 0x12
assert dddi.dataRecord == b'coffee'

= Check UDS_DDDIPR

dddipr = UDS(b'\x6c\x12\x44\x55')
assert dddipr.service == 0x6c
assert dddipr.subFunction == 0x12
assert dddipr.dynamicallyDefinedDataIdentifier == 0x4455

assert dddipr.answers(dddi)

= Check UDS_WDBI

wdbi = UDS(b'\x2e\x01\x02dieselgate')
assert wdbi.service == 0x2e
assert wdbi.dataIdentifier == 0x0102
assert wdbi.load == b'dieselgate'

= Build UDS_WDBI

wdbi = UDS()/UDS_WDBI(dataIdentifier=0x0102)/Raw(load=b'dieselgate')
assert wdbi.service == 0x2e
assert wdbi.dataIdentifier == 0x0102
assert wdbi.load == b'dieselgate'
assert bytes(wdbi) == b'\x2e\x01\x02dieselgate'

= Check UDS_WDBI

wdbi = UDS(b'\x2e\x01\x02dieselgate')
assert wdbi.service == 0x2e
assert wdbi.dataIdentifier == 0x0102
assert wdbi.load == b'dieselgate'

wdbi = UDS(b'\x2e\x02\x02benzingate')
assert wdbi.service == 0x2e
assert wdbi.dataIdentifier == 0x0202
assert wdbi.load == b'benzingate'


= Check UDS_WDBIPR

wdbipr = UDS(b'\x6e\x02\x02')
assert wdbipr.service == 0x6e
assert wdbipr.dataIdentifier == 0x0202

assert wdbipr.answers(wdbi)

= Check UDS_WMBA

wmba = UDS(b'\x3d\x11\x02\x02muchData')
assert wmba.service == 0x3d
assert wmba.memorySizeLen == 1
assert wmba.memoryAddressLen == 1
assert wmba.memoryAddress1 == 2
assert wmba.memorySize1 == 2
assert wmba.dataRecord == b'muchData'

= Check UDS_WMBAPR

wmbapr = UDS(b'\x7d\x11\x02\x02')
assert wmbapr.service == 0x7d
assert wmbapr.memorySizeLen == 1
assert wmbapr.memoryAddressLen == 1
assert wmbapr.memoryAddress1 == 2
assert wmbapr.memorySize1 == 2

assert wmbapr.answers(wmba)

= Check UDS_WMBA

wmba = UDS(b'\x3d\x22\x02\x02\x03\x03muchData')
assert wmba.service == 0x3d
assert wmba.memorySizeLen == 2
assert wmba.memoryAddressLen == 2
assert wmba.memoryAddress2 == 0x202
assert wmba.memorySize2 == 0x303
assert wmba.dataRecord == b'muchData'

= Check UDS_WMBAPR

wmbapr = UDS(b'\x7d\x22\x02\x02\x03\x03')
assert wmbapr.service == 0x7d
assert wmbapr.memorySizeLen == 2
assert wmbapr.memoryAddressLen == 2
assert wmbapr.memoryAddress2 == 0x202
assert wmbapr.memorySize2 == 0x303

assert wmbapr.answers(wmba)

= Check UDS_WMBA

wmba = UDS(b'\x3d\x33\x02\x02\x02\x03\x03\x03muchData')
assert wmba.service == 0x3d
assert wmba.memorySizeLen == 3
assert wmba.memoryAddressLen == 3
assert wmba.memoryAddress3 == 0x20202
assert wmba.memorySize3 == 0x30303
assert wmba.dataRecord == b'muchData'

= Check UDS_WMBA

wmba = UDS(b'\x3d\x44\x02\x02\x02\x02\x03\x03\x03\x03muchData')
assert wmba.service == 0x3d
assert wmba.memorySizeLen == 4
assert wmba.memoryAddressLen == 4
assert wmba.memoryAddress4 == 0x2020202
assert wmba.memorySize4 == 0x3030303
assert wmba.dataRecord == b'muchData'

= Check UDS_WMBAPR

wmbapr = UDS(b'\x7d\x33\x02\x02\x02\x03\x03\x03')
assert wmbapr.service == 0x7d
assert wmbapr.memorySizeLen == 3
assert wmbapr.memoryAddressLen == 3
assert wmbapr.memoryAddress3 == 0x20202
assert wmbapr.memorySize3 == 0x30303

assert not wmbapr.answers(wmba)

= Check UDS_WMBAPR

wmbapr = UDS(b'\x7d\x44\x02\x02\x02\x02\x03\x03\x03\x03')
assert wmbapr.service == 0x7d
assert wmbapr.memorySizeLen == 4
assert wmbapr.memoryAddressLen == 4
assert wmbapr.memoryAddress4 == 0x2020202
assert wmbapr.memorySize4 == 0x3030303

assert wmbapr.answers(wmba)

= Check UDS_CDTCI

cdtci = UDS(b'\x14\x44\x02\x03')
assert cdtci.service == 0x14
assert cdtci.groupOfDTCHighByte == 0x44
assert cdtci.groupOfDTCMiddleByte == 0x02
assert cdtci.groupOfDTCLowByte == 0x3

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x44')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x44

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x01\xff')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x01
assert rdtci.DTCStatusMask == 0xff

= Check UDS_RDTCIPR

rdtcipr = UDS(b'\x59\x01\xff\xee\xdd\xaa')
assert rdtcipr.service == 0x59
assert rdtcipr.reportType == 1
assert rdtcipr.DTCStatusAvailabilityMask == 0xff
assert rdtcipr.DTCFormatIdentifier == 0xee
assert rdtcipr.DTCCount == 0xddaa

assert rdtcipr.answers(rdtci)

rdtcipr1 = UDS(b'\x59\x02\xff\x11\x07\x11\'\x022\x12\'\x01\x07\x11\'\x01\x18\x12\'\x01\x13\x12\'\x01"\x11\'\x06C\x00\'\x06S\x00\'\x161\x00\'\x14\x03\x12\'')

assert len(rdtcipr1.DTCAndStatusRecord) == 10
assert rdtcipr1.DTCAndStatusRecord[0].dtc.system == 0
assert rdtcipr1.DTCAndStatusRecord[0].dtc.type == 1
assert rdtcipr1.DTCAndStatusRecord[0].dtc.numeric_value_code == 263
assert rdtcipr1.DTCAndStatusRecord[0].dtc.additional_information_code == 17
assert rdtcipr1.DTCAndStatusRecord[0].status == 0x27
assert rdtcipr1.DTCAndStatusRecord[-1].dtc.system == 0
assert rdtcipr1.DTCAndStatusRecord[-1].dtc.type == 1
assert rdtcipr1.DTCAndStatusRecord[-1].dtc.numeric_value_code == 1027
assert rdtcipr1.DTCAndStatusRecord[-1].dtc.additional_information_code == 18
assert rdtcipr1.DTCAndStatusRecord[-1].status == 0x27

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x02\xff')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x02
assert rdtci.DTCStatusMask == 0xff

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x0f\xff')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x0f
assert rdtci.DTCStatusMask == 0xff

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x11\xff')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x11
assert rdtci.DTCStatusMask == 0xff

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x12\xff')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x12
assert rdtci.DTCStatusMask == 0xff

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x13\xff')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x13
assert rdtci.DTCStatusMask == 0xff

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x03\xff\xee\xdd\xaa')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x03
assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
assert rdtci.DTCSnapshotRecordNumber == 0xaa

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x04\xff\xee\xdd\xaa')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x04
assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
assert rdtci.DTCSnapshotRecordNumber == 0xaa

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x05\xaa')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x05
assert rdtci.DTCSnapshotRecordNumber == 0xaa

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x06\xff\xee\xdd\xaa')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x06
assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
assert rdtci.DTCExtendedDataRecordNumber == 0xaa

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x07\xaa\xbb')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x07
assert rdtci.DTCSeverityMask == 0xaa
assert rdtci.DTCStatusMask == 0xbb

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x08\xaa\xbb')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x08
assert rdtci.DTCSeverityMask == 0xaa
assert rdtci.DTCStatusMask == 0xbb

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x09\xff\xee\xdd')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x09
assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))

= Check UDS_RDTCI

rdtci = UDS(b'\x19\x10\xff\xee\xdd\xaa')
assert rdtci.service == 0x19
assert rdtci.reportType == 0x10
assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
assert rdtci.DTCExtendedDataRecordNumber == 0xaa


= Check UDS_RDTCIPR

rdtcipr = UDS(b'\x59\x02\xff\xee\xdd\xaa\x02')
rdtcipr.show()
assert rdtcipr.service == 0x59
assert rdtcipr.reportType == 2
assert rdtcipr.DTCStatusAvailabilityMask == 0xff
assert rdtcipr.DTCAndStatusRecord[0].dtc.system == 3
assert rdtcipr.DTCAndStatusRecord[0].dtc.type == 2
assert rdtcipr.DTCAndStatusRecord[0].dtc.numeric_value_code == 3805
assert rdtcipr.DTCAndStatusRecord[0].dtc.additional_information_code == 170
assert rdtcipr.DTCAndStatusRecord[0].status == 2

assert not rdtcipr.answers(rdtci)

= Check UDS_RDTCIPR

rdtcipr = UDS(b'\x59\x03\xff\xee\xdd\xaa')
assert rdtcipr.service == 0x59
assert rdtcipr.reportType == 3
assert rdtcipr.dataRecord == b'\xff\xee\xdd\xaa'


= Check UDS_RDTCIPR 2
req = UDS(bytes.fromhex("1904480a46ff"))
resp = UDS(bytes.fromhex("5904480a46af000b170002ff6417010a8278fa170c2ff1800000800104800200028003400a8004808005054002400a400004010b170002ff6417010a82ec69170c2f2c800000800100800200028003400a80048080050540024017400004"))

assert resp.answers(req)

req = UDS(bytes.fromhex("1904480a47ff"))
resp = UDS(bytes.fromhex("5904480a46af000b170002ff6417010a8278fa170c2ff1800000800104800200028003400a8004808005054002400a400004010b170002ff6417010a82ec69170c2f2c800000800100800200028003400a80048080050540024017400004"))

assert not resp.answers(req)

req = UDS(bytes.fromhex("1906480a46ff"))
resp = UDS(bytes.fromhex("5906480a46af010002070328"))

assert resp.answers(req)

= Check UDS_RC

rc = UDS(b'\x31\x03\xff\xee\xdd\xaa')
assert rc.service == 0x31
assert rc.routineControlType == 3
assert rc.routineIdentifier == 0xffee
assert rc.load == b'\xdd\xaa'

= Check UDS_RC

rc = UDS(b'\x31\x03\xff\xee\xdd\xaa')
assert rc.service == 0x31
assert rc.routineControlType == 3
assert rc.routineIdentifier == 0xffee
assert rc.load == b'\xdd\xaa'


= Check UDS_RCPR

rcpr = UDS(b'\x71\x03\xff\xee\xdd\xaa')
assert rcpr.service == 0x71
assert rcpr.routineControlType == 3
assert rcpr.routineIdentifier == 0xffee
assert rcpr.load == b'\xdd\xaa'

= Check UDS_RD

rd = UDS(b'\x34\xaa\x11\x02\x02')
assert rd.service == 0x34
assert rd.dataFormatIdentifier == 0xaa
assert rd.memorySizeLen == 1
assert rd.memoryAddressLen == 1
assert rd.memoryAddress1 == 2
assert rd.memorySize1 == 2


= Check UDS_RD

rd = UDS(b'\x34\xaa\x22\x02\x02\x03\x03')
assert rd.service == 0x34
assert rd.dataFormatIdentifier == 0xaa
assert rd.memorySizeLen == 2
assert rd.memoryAddressLen == 2
assert rd.memoryAddress2 == 0x202
assert rd.memorySize2 == 0x303

= Check UDS_RD

rd = UDS(b'\x34\xaa\x33\x02\x02\x02\x03\x03\x03')
assert rd.service == 0x34
assert rd.dataFormatIdentifier == 0xaa
assert rd.memorySizeLen == 3
assert rd.memoryAddressLen == 3
assert rd.memoryAddress3 == 0x20202
assert rd.memorySize3 == 0x30303

= Check UDS_RD

rd = UDS(b'\x34\xaa\x44\x02\x02\x02\x02\x03\x03\x03\x03')
assert rd.service == 0x34
assert rd.dataFormatIdentifier == 0xaa
assert rd.memorySizeLen == 4
assert rd.memoryAddressLen == 4
assert rd.memoryAddress4 == 0x2020202
assert rd.memorySize4 == 0x3030303


= Check UDS_RDPR

rdpr = UDS(b'\x74\x40\x02\x02\x02\x02\x03\x03\x03\x03')
assert rdpr.service == 0x74
assert rdpr.memorySizeLen == 4
assert rdpr.reserved == 0
assert rdpr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03'

assert rdpr.answers(rd)

= Check UDS_RU

ru = UDS(b'\x35\xaa\x11\x02\x02')
assert ru.service == 0x35
assert ru.dataFormatIdentifier == 0xaa
assert ru.memorySizeLen == 1
assert ru.memoryAddressLen == 1
assert ru.memoryAddress1 == 2
assert ru.memorySize1 == 2

= Check UDS_RU

ru = UDS(b'\x35\xaa\x22\x02\x02\x03\x03')
assert ru.service == 0x35
assert ru.dataFormatIdentifier == 0xaa
assert ru.memorySizeLen == 2
assert ru.memoryAddressLen == 2
assert ru.memoryAddress2 == 0x202
assert ru.memorySize2 == 0x303


= Check UDS_RU

ru = UDS(b'\x35\xaa\x33\x02\x02\x02\x03\x03\x03')
assert ru.service == 0x35
assert ru.dataFormatIdentifier == 0xaa
assert ru.memorySizeLen == 3
assert ru.memoryAddressLen == 3
assert ru.memoryAddress3 == 0x20202
assert ru.memorySize3 == 0x30303


= Check UDS_RU

ru = UDS(b'\x35\xaa\x44\x02\x02\x02\x02\x03\x03\x03\x03')
assert ru.service == 0x35
assert ru.dataFormatIdentifier == 0xaa
assert ru.memorySizeLen == 4
assert ru.memoryAddressLen == 4
assert ru.memoryAddress4 == 0x2020202
assert ru.memorySize4 == 0x3030303


= Check UDS_RUPR

rupr = UDS(b'\x75\x40\x02\x02\x02\x02\x03\x03\x03\x03')
assert rupr.service == 0x75
assert rupr.memorySizeLen == 4
assert rupr.reserved == 0
assert rupr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03'

assert rupr.answers(ru)

= Check UDS_TD

td = UDS(b'\x36\xaapayload')
assert td.service == 0x36
assert td.blockSequenceCounter == 0xaa
assert td.transferRequestParameterRecord == b'payload'

= Check UDS_TD

td = UDS(b'\x36\xaapayload')
assert td.service == 0x36
assert td.blockSequenceCounter == 0xaa
assert td.transferRequestParameterRecord == b'payload'

= Check UDS_TDPR

tdpr = UDS(b'\x76\xaapayload')
assert tdpr.service == 0x76
assert tdpr.blockSequenceCounter == 0xaa
assert tdpr.transferResponseParameterRecord == b'payload'

assert tdpr.answers(td)

= Check UDS_RTE

rte = UDS(b'\x37payload')
assert rte.service == 0x37
assert rte.transferRequestParameterRecord == b'payload'

= Check UDS_RTEPR

rtepr = UDS(b'\x77payload')
assert rtepr.service == 0x77
assert rtepr.transferResponseParameterRecord == b'payload'

assert rtepr.answers(rte)

= Check UDS_IOCBI

iocbi = UDS(b'\x2f\x23\x34\xffcoffee')
assert iocbi.service == 0x2f
assert iocbi.dataIdentifier == 0x2334
assert iocbi.load == b'\xffcoffee'

= Check UDS_RFT

rft = UDS(b'\x38\x01\x00\x1ED:\\mapdata\\europe\\germany1.yxz\x11\x02\xC3\x50\x75\x30')
assert rft.service == 0x38
assert rft.modeOfOperation == 0x01
assert rft.filePathAndNameLength == 0x001e
assert rft.filePathAndName == b'D:\\mapdata\\europe\\germany1.yxz'
assert rft.compressionMethod == 1
assert rft.encryptingMethod == 1
assert rft.fileSizeParameterLength == 0x02
assert rft.fileSizeUnCompressed == b'\xc3\x50'
assert rft.fileSizeCompressed == b'\x75\x30'

= Build UDS_RFT

rft_build = UDS()/UDS_RFT(modeOfOperation=0x1,
                          filePathAndName=(b'D:\\mapdata\\europe\\' +
                                           b'germany1.yxz'),
                          compressionMethod=1, encryptingMethod=1,
                          fileSizeUnCompressed=b'\xc3\x50',
                          fileSizeCompressed=b'\x75\x30')
assert bytes(rft_build) == bytes(rft)

= Check UDS_RFTPR

rftpr = UDS(b'\x78\x01\x02\xc3\x50\x11')
assert rftpr.service == 0x78
assert rftpr.modeOfOperation == 0x01
assert rftpr.lengthFormatIdentifier == 0x02
assert rftpr.maxNumberOfBlockLength == b'\xc3\x50'
assert rftpr.compressionMethod == 1
assert rftpr.encryptingMethod == 1

assert rftpr.answers(rft)

= Build UDS_RFTPR
rftpr_build = UDS()/UDS_RFTPR(modeOfOperation=0x1,
                              maxNumberOfBlockLength=b'\xc3\x50',
                              compressionMethod=1, encryptingMethod=1)
assert bytes(rftpr_build) == bytes(rftpr)

= Check (invalid) UDS_NRC, no reply-to service

nrc = UDS(b'\x7f')
assert nrc.service == 0x7f

= Check UDS_NRC

nrc = UDS(b'\x7f\x22\x33')
assert nrc.service == 0x7f
assert nrc.requestServiceId == 0x22
assert nrc.negativeResponseCode == 0x33
