1% Regression tests for obd_scan 2~ scanner 3 4+ Configuration 5~ conf 6 7= Imports 8 9from test.testsocket import TestSocket, cleanup_testsockets 10from scapy.contrib.automotive.ecu import * # noqa: F403 11 12= Load contribution layer 13 14load_contrib("automotive.obd.obd", globals_dict=globals()) 15load_contrib("automotive.obd.scanner", globals_dict=globals()) 16 17= Create sockets 18 19ecu = TestSocket(OBD) 20tester = TestSocket(OBD) 21ecu.pair(tester) 22 23= Create answers 24 25responses = [ 26 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=0)/OBD_PID00(supported_pids=3191777299)])), 27 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=1)/OBD_PID01(mil=0, dtc_count=0, reserved1=0, continuous_tests_ready=0, reserved2=0, continuous_tests_supported=7, once_per_trip_tests_supported=225, once_per_trip_tests_ready=0)])), 28 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=11)/OBD_PID0B(data=44)])), 29 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=12)/OBD_PID0C(data=857.0)])), 30 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=13)/OBD_PID0D(data=0)])), 31 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=14)/OBD_PID0E(data=3.5)])), 32 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=15)/OBD_PID0F(data=22.0)])), 33 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=17)/OBD_PID11(data=14.51)])), 34 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=19)/OBD_PID13(sensors_present=3)])), 35 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=21)/OBD_PID15(outputVoltage=1.275, trim=99.219)])), 36 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=28)/OBD_PID1C(data=6)])), 37 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=3)/OBD_PID03(fuel_system1=2, fuel_system2=0)])), 38 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=31)/OBD_PID1F(data=13)])), 39 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=32)/OBD_PID20(supported_pids=2684465153)])), 40 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=33)/OBD_PID21(data=0)])), 41 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=35)/OBD_PID23(data=24910)])), 42 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=4)/OBD_PID04(data=9.804)])), 43 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=48)/OBD_PID30(data=19)])), 44 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=49)/OBD_PID31(data=3587)])), 45 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=5)/OBD_PID05(data=41.0)])), 46 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=51)/OBD_PID33(data=97)])), 47 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=52)/OBD_PID34(equivalence_ratio=1.001, current=128.004)])), 48 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=6)/OBD_PID06(data=0.0)])), 49 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=64)/OBD_PID40(supported_pids=244352000)])), 50 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=69)/OBD_PID45(data=3.922)])), 51 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=7)/OBD_PID07(data=-0.781)])), 52 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=70)/OBD_PID46(data=20.0)])), 53 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=71)/OBD_PID47(data=12.549)])), 54 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=73)/OBD_PID49(data=5.49)])), 55 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=76)/OBD_PID4C(data=3.922)])), 56 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=81)/OBD_PID51(data=1)])), 57 EcuResponse(responses=OBD(service=65)/OBD_S01_PR(data_records=[OBD_S01_PR_Record(pid=86)/OBD_PID56(bank1=0.0)])), 58 EcuResponse(responses=OBD(service=67)/OBD_S03_PR(count=0)), 59 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=0)/OBD_MID00(supported_mids=3221225473)])), 60 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=1)/OBD_MIDXX(standardized_test_id=131, unit_and_scaling_id=4, test_value=0.0, min_limit=0.0, max_limit=1.0),OBD_S06_PR_Record(mid=1)/OBD_MIDXX(standardized_test_id=138, unit_and_scaling_id=132, test_value=0.996, min_limit=-32.768, max_limit=1.06),OBD_S06_PR_Record(mid=1)/OBD_MIDXX(standardized_test_id=139, unit_and_scaling_id=132, test_value=0.996, min_limit=0.94, max_limit=32.767)])), 61 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=128)/OBD_MID80(supported_mids=1)])), 62 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=160)/OBD_MIDA0(supported_mids=4160749568)])), 63 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=161)/OBD_MIDXX(standardized_test_id=12, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=65535)])), 64 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=162)/OBD_MIDXX(standardized_test_id=12, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=65535),OBD_S06_PR_Record(mid=162)/OBD_MIDXX(standardized_test_id=11, unit_and_scaling_id=36, test_value=2, min_limit=0, max_limit=65535)])), 65 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=163)/OBD_MIDXX(standardized_test_id=12, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=65535),OBD_S06_PR_Record(mid=163)/OBD_MIDXX(standardized_test_id=11, unit_and_scaling_id=36, test_value=1, min_limit=0, max_limit=65535)])), 66 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=164)/OBD_MIDXX(standardized_test_id=12, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=65535),OBD_S06_PR_Record(mid=164)/OBD_MIDXX(standardized_test_id=11, unit_and_scaling_id=36, test_value=1, min_limit=0, max_limit=65535)])), 67 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=165)/OBD_MIDXX(standardized_test_id=12, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=65535),OBD_S06_PR_Record(mid=165)/OBD_MIDXX(standardized_test_id=11, unit_and_scaling_id=36, test_value=1, min_limit=0, max_limit=65535)])), 68 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=2)/OBD_MIDXX(standardized_test_id=145, unit_and_scaling_id=177, test_value=3944, min_limit=900, max_limit=65534),OBD_S06_PR_Record(mid=2)/OBD_MIDXX(standardized_test_id=149, unit_and_scaling_id=10, test_value=764.696, min_limit=719.556, max_limit=7995.27),OBD_S06_PR_Record(mid=2)/OBD_MIDXX(standardized_test_id=150, unit_and_scaling_id=10, test_value=115.412, min_limit=0.0, max_limit=179.95)])), 69 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=32)/OBD_MID20(supported_mids=2147485697)])), 70 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=33)/OBD_MIDXX(standardized_test_id=132, unit_and_scaling_id=3, test_value=2.63, min_limit=1.0, max_limit=655.35)])), 71 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=128, unit_and_scaling_id=28, test_value=32.42, min_limit=10.0, max_limit=655.35),OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=129, unit_and_scaling_id=28, test_value=25.41, min_limit=10.0, max_limit=655.35),OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=130, unit_and_scaling_id=28, test_value=0.21, min_limit=0.0, max_limit=10.0),OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=131, unit_and_scaling_id=28, test_value=0.0, min_limit=0.0, max_limit=10.0),OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=132, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=3),OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=133, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=3),OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=134, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=3),OBD_S06_PR_Record(mid=53)/OBD_MIDXX(standardized_test_id=135, unit_and_scaling_id=36, test_value=0, min_limit=0, max_limit=3)])), 72 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=64)/OBD_MID40(supported_mids=3221225473)])), 73 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=65)/OBD_MIDXX(standardized_test_id=133, unit_and_scaling_id=22, test_value=720.0, min_limit=700.0, max_limit=6513.5)])), 74 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=66)/OBD_MIDXX(standardized_test_id=144, unit_and_scaling_id=20, test_value=401, min_limit=0, max_limit=800)])), 75 EcuResponse(responses=OBD(service=70)/OBD_S06_PR(data_records=[OBD_S06_PR_Record(mid=96)/OBD_MID60(supported_mids=1)])), 76 EcuResponse(responses=OBD(service=71)/OBD_S07_PR(count=0)), 77 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=0)/OBD_IID00(supported_iids=1430405120)])), 78 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=10)/OBD_IID0A(ecu_names=[b'ECM\x00-EngineControl\x00\x00'], count=1)])), 79 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=15)/Raw(load=b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00HM0876')])), 80 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=18)/Raw(load=b'\x01\x00\xd5')])), 81 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=2)/OBD_IID02(vehicle_identification_numbers=[b'WDD1xxxxxxxxxxx11'], count=1)])), 82 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=4)/OBD_IID04(calibration_identifications=[b'282xxxxxxx300044', b'00090xxxxxx00031'], count=2)])), 83 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=6)/OBD_IID06(calibration_verification_numbers=[b'\xf9\x10\xb9\xfb', b'&6"e'], count=2)])), 84 EcuResponse(responses=OBD(service=73)/OBD_S09_PR(data_records=[OBD_S09_PR_Record(iid=8)/OBD_IID08(data=[9, 189, 8, 9, 0, 0, 8, 9, 0, 0, 22, 9, 0, 0, 0, 0, 8, 9, 0, 0], count=20)])), 85 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=1, response_code=0x12)), 86 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=2, response_code=0x12)), 87 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=3, response_code=0x12)), 88 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=4, response_code=0x12)), 89 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=5, response_code=0x12)), 90 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=6, response_code=0x12)), 91 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=7, response_code=0x12)), 92 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=8, response_code=0x12)), 93 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=9, response_code=0x12)), 94 EcuResponse(responses=OBD(service=127)/OBD_NR(request_service_id=10, response_code=0x12))] 95 96 97+ Simulate scanner 98 99= Run scanner with real world responses short scan 100 101sniff(timeout=0.001, opened_socket=[ecu, tester]) 102 103answering_machine = EcuAnsweringMachine(supported_responses=responses, main_socket=ecu, basecls=OBD) 104sim = threading.Thread(target=answering_machine, kwargs={"timeout": 100, "stop_filter": lambda x: bytes(x) == b"\xff\xff\xff"}) 105sim.start() 106try: 107 s = OBD_Scanner(tester, full_scan=False, timeout=1, retry_if_none_received=True) 108 s.scan(timeout=100) 109 tester.send(b"\xff\xff\xff") 110finally: 111 sim.join(timeout=10) 112 113s.show_testcases() 114 115assert len(s.enumerators) == 8 116assert s.enumerators[0].__class__ == OBD_S01_Enumerator 117assert s.enumerators[1].__class__ == OBD_S02_Enumerator 118assert s.enumerators[2].__class__ == OBD_S06_Enumerator 119assert s.enumerators[3].__class__ == OBD_S08_Enumerator 120assert s.enumerators[4].__class__ == OBD_S09_Enumerator 121assert s.enumerators[5].__class__ == OBD_S03_Enumerator 122assert s.enumerators[6].__class__ == OBD_S07_Enumerator 123assert s.enumerators[7].__class__ == OBD_S0A_Enumerator 124 125print(len(s.enumerators[0].results_with_response)) 126 127assert len(s.enumerators[0].results_with_response) == 33 # 32 pos resps + 1 NR 128assert len(s.enumerators[0].results_with_negative_response) == 1 129assert len(s.enumerators[1].results_with_response) == 1 # 1 NR 130assert len(s.enumerators[1].results_with_negative_response) == 1 131assert len(s.enumerators[2].results_with_response) == 18 # 17 pos resps + 1 NR 132assert len(s.enumerators[2].results_with_negative_response) == 1 133assert len(s.enumerators[3].results_with_response) == 1 # 1 NR 134assert len(s.enumerators[3].results_with_negative_response) == 1 135assert len(s.enumerators[4].results_with_response) == 9 # 8 pos resps + 1 NR 136assert len(s.enumerators[4].results_with_negative_response) == 1 137assert len(s.enumerators[5].results_with_response) == 1 # 1 PR 138assert len(s.enumerators[6].results_with_response) == 1 # 1 PR 139assert len(s.enumerators[7].results_with_response) == 1 # 1 PR 140 141 142= Run scanner with real world responses full scan 143 144sniff(timeout=0.001, opened_socket=[ecu, tester]) 145 146answering_machine = EcuAnsweringMachine(supported_responses=responses, main_socket=ecu, basecls=OBD) 147sim = threading.Thread(target=answering_machine, kwargs={"timeout": 100, "stop_filter": lambda x: bytes(x) == b"\xff\xff\xff"}) 148sim.start() 149try: 150 s = OBD_Scanner(tester, full_scan=True, timeout=1, retry_if_none_received=True) 151 s.scan(timeout=100) 152 tester.send(b"\xff\xff\xff") 153finally: 154 sim.join(timeout=10) 155 156s.show_testcases() 157 158assert len(s.enumerators) == 8 159assert s.enumerators[0].__class__ == OBD_S01_Enumerator 160assert s.enumerators[1].__class__ == OBD_S02_Enumerator 161assert s.enumerators[2].__class__ == OBD_S06_Enumerator 162assert s.enumerators[3].__class__ == OBD_S08_Enumerator 163assert s.enumerators[4].__class__ == OBD_S09_Enumerator 164assert s.enumerators[5].__class__ == OBD_S03_Enumerator 165assert s.enumerators[6].__class__ == OBD_S07_Enumerator 166assert s.enumerators[7].__class__ == OBD_S0A_Enumerator 167 168assert len(s.enumerators[0].results_with_response) == 0x100 # 32 pos resps + 1 NR 169print( len(s.enumerators[0].results_with_negative_response)) 170assert len(s.enumerators[0].results_with_negative_response) == 0x100 - 32 171print( len(s.enumerators[1].results_with_response)) 172assert len(s.enumerators[1].results_with_response) == 0x100 173print( len(s.enumerators[1].results_with_negative_response)) 174assert len(s.enumerators[1].results_with_negative_response) == 0x100 175assert len(s.enumerators[2].results_with_response) == 0x100 # 17 pos resps 176assert len(s.enumerators[2].results_with_negative_response) == 0x100 - 17 177assert len(s.enumerators[3].results_with_response) == 0x100 178assert len(s.enumerators[3].results_with_negative_response) == 0x100 179assert len(s.enumerators[4].results_with_response) == 0x100 # 8 pos resps 180assert len(s.enumerators[4].results_with_negative_response) == 0x100 - 8 181assert len(s.enumerators[5].results_with_response) == 1 # 1 PR 182assert len(s.enumerators[6].results_with_response) == 1 # 1 PR 183assert len(s.enumerators[7].results_with_response) == 1 # 1 PR 184 185 186= Run scanner only for Service 01 real world responses 187 188sniff(timeout=0.001, opened_socket=[ecu, tester]) 189 190answering_machine = EcuAnsweringMachine(supported_responses=responses, main_socket=ecu, basecls=OBD) 191sim = threading.Thread(target=answering_machine, kwargs={"timeout": 100, "stop_filter": lambda x: bytes(x) == b"\xff\xff\xff"}) 192sim.start() 193try: 194 s = OBD_Scanner(tester, test_cases=[OBD_S01_Enumerator], full_scan=False, retry_if_none_received=True, timeout=1) 195 s.scan(timeout=100) 196 tester.send(b"\xff\xff\xff") 197finally: 198 sim.join(timeout=10) 199 200s.show_testcases() 201 202assert len(s.enumerators) == 1 203assert s.enumerators[0].__class__ == OBD_S01_Enumerator 204 205assert len(s.enumerators[0].results_with_response) == 33 # 32 pos resps + 1 NR 206assert len(s.enumerators[0].results_with_negative_response) == 1 207 208 209+ Cleanup 210 211= Delete TestSockets 212 213cleanup_testsockets() 214