car-diagnostic-agent / test_fault_simulation.py
aldsouza's picture
Fix
ba11077
Raw
History Blame Contribute Delete
2.53 kB
"""Smoke tests: fault profiles change live PIDs and DTCs on the emulator."""
from __future__ import annotations
import logging
import time
import obd
logging.basicConfig(level=logging.WARNING)
from elm_server import start_elm_emulator, stop_elm_emulator
from fault_simulation import apply_fault, clear_faults
from obd_connection import init_obd_session, obd_session_lock
def _read_sample() -> dict:
time.sleep(0.2)
with obd_session_lock:
conn = init_obd_session()
rpm = conn.query(obd.commands.RPM)
stft = conn.query(obd.commands.SHORT_FUEL_TRIM_1)
coolant = conn.query(obd.commands.COOLANT_TEMP)
dtcs = conn.query(obd.commands.GET_DTC)
dtc_list: list[str] = []
if not dtcs.is_null() and dtcs.value:
for entry in dtcs.value:
code = entry[0] if isinstance(entry, tuple) else entry
dtc_list.append(str(code))
return {
"rpm": None if rpm.is_null() else rpm.value.magnitude,
"stft": None if stft.is_null() else float(stft.value.magnitude),
"coolant": None if coolant.is_null() else float(coolant.value.magnitude),
"dtcs": dtc_list,
}
def test_vacuum_leak_changes_pids() -> None:
clear_faults()
healthy = _read_sample()
apply_fault("vacuum_leak")
faulted = _read_sample()
assert faulted["rpm"] is not None and faulted["rpm"] < 1000, faulted
assert faulted["stft"] is not None and faulted["stft"] > 15, faulted
assert healthy != faulted, (healthy, faulted)
def test_vacuum_leak_sets_dtc() -> None:
apply_fault("vacuum_leak")
faulted = _read_sample()
assert any("P0171" in d for d in faulted["dtcs"]), faulted
def test_thermostat_stuck_closed() -> None:
apply_fault("thermostat_stuck_closed")
faulted = _read_sample()
assert faulted["coolant"] is not None and faulted["coolant"] > 100, faulted
def test_clear_restores_healthy() -> None:
apply_fault("vacuum_leak")
clear_faults()
cleared = _read_sample()
assert cleared["dtcs"] == [], cleared
if __name__ == "__main__":
try:
start_elm_emulator()
time.sleep(0.5)
test_vacuum_leak_changes_pids()
print("OK vacuum_leak PIDs")
test_vacuum_leak_sets_dtc()
print("OK vacuum_leak DTC")
test_thermostat_stuck_closed()
print("OK thermostat_stuck_closed")
test_clear_restores_healthy()
print("OK clear_faults")
finally:
stop_elm_emulator()