• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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