1% Regression tests for ISOTP Message Builder 2 3+ Configuration 4~ conf 5 6= Definition of utility functions 7 8# hexadecimal to bytes convenience function 9dhex = bytes.fromhex 10 11= Import isotp 12 13conf.contribs['ISOTP'] = {'use-can-isotp-kernel-module': False} 14 15load_layer("can", globals_dict=globals()) 16load_contrib("isotp", globals_dict=globals()) 17 18 19+ Testing ISOTPMessageBuilder 20 21= Create ISOTPMessageBuilder 22m = ISOTPMessageBuilder() 23 24= Feed packets to machine 25ff = CAN(identifier=0x241, data=dhex("10 28 01 02 03 04 05 06")) 26ff.time = 1000 27m.feed(ff) 28m.feed(CAN(identifier=0x641, data=dhex("30 03 00" ))) 29m.feed(CAN(identifier=0x241, data=dhex("21 07 08 09 0A 0B 0C 0D"))) 30m.feed(CAN(identifier=0x241, data=dhex("22 0E 0F 10 11 12 13 14"))) 31m.feed(CAN(identifier=0x241, data=dhex("23 15 16 17 18 19 1A 1B"))) 32m.feed(CAN(identifier=0x641, data=dhex("30 03 00" ))) 33m.feed(CAN(identifier=0x241, data=dhex("24 1C 1D 1E 1F 20 21 22"))) 34m.feed(CAN(identifier=0x241, data=dhex("25 23 24 25 26 27 28" ))) 35 36= Verify there is a ready message in the machine 37assert m.count == 1 38 39= Extract the message from the machine 40msg = m.pop() 41assert m.count == 0 42assert msg.rx_id == 0x241 43assert msg.rx_ext_address is None 44assert msg.tx_id == 0x641 45assert msg.ext_address is None 46assert msg.time == 1000 47expected = dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") 48assert msg.data == expected 49 50= Verify that no error happens when there is not enough data 51m = ISOTPMessageBuilder() 52m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF"))) 53msg = m.pop() 54assert msg is None 55 56= Verify that no error happens when there is no data 57m = ISOTPMessageBuilder() 58m.feed(CAN(identifier=0x241, data=dhex(""))) 59msg = m.pop() 60assert msg is None 61 62= Verify a single frame without EA 63m = ISOTPMessageBuilder() 64m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF 04"))) 65msg = m.pop() 66assert msg.rx_id == 0x241 67assert msg.rx_ext_address is None 68assert msg.data == dhex("AB CD EF 04") 69 70= Single frame without EA, with excessive bytes in CAN frame 71m = ISOTPMessageBuilder() 72m.feed(CAN(identifier=0x241, data=dhex("03 AB CD EF AB CD EF AB"))) 73msg = m.pop() 74assert msg.rx_id == 0x241 75assert msg.rx_ext_address is None 76assert msg.data == dhex("AB CD EF") 77 78= Verify a single frame with EA 79m = ISOTPMessageBuilder() 80m.feed(CAN(identifier=0x241, data=dhex("E2 04 01 02 03 04"))) 81msg = m.pop() 82assert msg.rx_id == 0x241 83assert msg.rx_ext_address == 0xE2 84assert msg.data == dhex("01 02 03 04") 85 86= Single CAN frame that has 2 valid interpretations 87m = ISOTPMessageBuilder() 88m.feed(CAN(identifier=0x241, data=dhex("04 01 02 03 04"))) 89msg = m.pop(0x241, None) 90assert msg.rx_id == 0x241 91assert msg.rx_ext_address is None 92assert msg.data == dhex("01 02 03 04") 93msg = m.pop() 94assert msg.rx_id == 0x241 95assert msg.rx_ext_address == 0x04 96assert msg.data == dhex("02") 97 98= Verify multiple frames with EA 99m = ISOTPMessageBuilder() 100ff = CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")) 101ff.time = 1005 102m.feed(ff) 103m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) 104m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B"))) 105m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11"))) 106m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17"))) 107m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) 108m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D"))) 109m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23"))) 110m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))) 111msg = m.pop() 112assert msg.rx_id == 0x241 113assert msg.rx_ext_address == 0xEA 114assert msg.tx_id == 0x641 115assert msg.ext_address == 0xEA 116assert msg.time == 1005 117assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") 118 119= Verify multiple frames with EA 2 120m = ISOTPMessageBuilder() 121m.feed(CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05"))) 122m.feed(CAN(identifier=0x641, data=dhex("AE 30 03 00" ))) 123m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B"))) 124m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11"))) 125m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17"))) 126m.feed(CAN(identifier=0x641, data=dhex("AE 30 03 00" ))) 127m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D"))) 128m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23"))) 129m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))) 130msg = m.pop() 131assert msg.rx_id == 0x241 132assert msg.rx_ext_address == 0xEA 133assert msg.tx_id == 0x641 134assert msg.ext_address == 0xAE 135assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") 136 137= Verify that an EA starting with 1 will still work 138m = ISOTPMessageBuilder() 139m.feed(CAN(identifier=0x241, data=dhex("1A 10 14 01 02 03 04 05"))) 140m.feed(CAN(identifier=0x641, data=dhex("1A 30 03 00" ))) 141m.feed(CAN(identifier=0x241, data=dhex("1A 21 06 07 08 09 0A 0B"))) 142m.feed(CAN(identifier=0x241, data=dhex("1A 22 0C 0D 0E 0F 10 11"))) 143m.feed(CAN(identifier=0x241, data=dhex("1A 23 12 13 14 15 16 17"))) 144msg = m.pop() 145assert msg.rx_id == 0x241 146assert msg.rx_ext_address == 0x1A 147assert msg.tx_id == 0x641 148assert msg.ext_address == 0x1A 149assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14") 150 151= Verify that an EA of 07 will still work 152m = ISOTPMessageBuilder() 153m.feed(CAN(identifier=0x241, data=dhex("07 10 0A 01 02 03 04 05"))) 154m.feed(CAN(identifier=0x641, data=dhex("07 30 03 00" ))) 155m.feed(CAN(identifier=0x241, data=dhex("07 21 06 07 08 09 0A 0B"))) 156msg = m.pop(0x241, 0x07) 157assert msg.rx_id == 0x241 158assert msg.rx_ext_address == 0x07 159assert msg.tx_id == 0x641 160assert msg.ext_address == 0x07 161assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A") 162 163= Verify that three interleaved messages can be sniffed simultaneously on the same identifier and extended address (very unrealistic) 164m = ISOTPMessageBuilder() 165ff = CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")) 166ff.time = 300 167m.feed(ff) # start of message A 168m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) 169m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B"))) 170m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11"))) 171m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17"))) 172ff = CAN(identifier=0x241, data=dhex("EA 10 10 31 32 33 34 35")) 173ff.time = 400 174m.feed(ff) # start of message B 175m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) 176sf = CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8" )) 177sf.time = 200 178m.feed(sf) # single-frame message C 179m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) 180m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D"))) 181m.feed(CAN(identifier=0x241, data=dhex("EA 21 36 37 38 39 3A 3B"))) 182m.feed(CAN(identifier=0x241, data=dhex("EA 22 3C 3D 3E 3F 40" ))) # end of message B 183m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23"))) 184m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))) # end of message A 185msg = m.pop() 186assert msg.rx_id == 0x241 187assert msg.rx_ext_address == 0xEA 188assert msg.data == dhex("A6 A7 A8") 189assert msg.time == 200 190msg = m.pop() 191assert msg.rx_id == 0x241 192assert msg.rx_ext_address == 0xEA 193assert msg.tx_id == 0x641 194assert msg.ext_address == 0xEA 195assert msg.time == 400 196assert msg.data == dhex("31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40") 197msg = m.pop() 198assert msg.rx_id == 0x241 199assert msg.rx_ext_address == 0xEA 200assert msg.tx_id == 0x641 201assert msg.ext_address == 0xEA 202assert msg.time == 300 203assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") 204 205 206= Verify multiple frames with EA from list 207m = ISOTPMessageBuilder() 208msgs = [ 209 CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")), 210 CAN(identifier=0x641, data=dhex("EA 30 03 00" )), 211 CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")), 212 CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")), 213 CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")), 214 CAN(identifier=0x641, data=dhex("EA 30 03 00" )), 215 CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")), 216 CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")), 217 CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))] 218m.feed(msgs) 219msg = m.pop() 220assert msg.rx_id == 0x241 221assert msg.rx_ext_address == 0xEA 222assert msg.tx_id == 0x641 223assert msg.ext_address == 0xEA 224assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") 225 226= Verify multiple frames with EA from list and iterator 227m = ISOTPMessageBuilder() 228msgs = [ 229 CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")), 230 CAN(identifier=0x641, data=dhex("EA 30 03 00" )), 231 CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")), 232 CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")), 233 CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")), 234 CAN(identifier=0x641, data=dhex("EA 30 03 00" )), 235 CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")), 236 CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")), 237 CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" )), 238 CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8" )), 239 CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8"))] 240m.feed(msgs) 241assert m.count == 3 242assert len(m) == 3 243 244isotpmsgs = [x for x in m] 245assert len(isotpmsgs) == 3 246msg = isotpmsgs[0] 247assert msg.rx_id == 0x241 248assert msg.rx_ext_address == 0xEA 249assert msg.tx_id == 0x641 250assert msg.ext_address == 0xEA 251assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") 252 253assert isotpmsgs[1] == isotpmsgs[2] 254 255= Verify a single frame without EA and different basecls 256m = ISOTPMessageBuilder(basecls=Raw) 257m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF 04"))) 258msg = m.pop() 259assert msg.load == dhex("AB CD EF 04") 260assert type(msg) == Raw 261