diff --git a/Jenkinsfile b/Jenkinsfile index 8a2f83be2f..9b1ea421ac 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -153,6 +153,7 @@ pipeline { ["build master-ci", "cd $SOURCE_DIR/release && TARGET_DIR=$TEST_DIR EXTRA_FILES='tools/' ./build_devel.sh"], ["build openpilot", "cd selfdrive/manager && ./build.py"], ["check dirty", "release/check-dirty.sh"], + ["time to onroad", "cd selfdrive/test/ && pytest test_time_to_onroad.py"], ["onroad tests", "cd selfdrive/test/ && ./test_onroad.py"], ["test car interfaces", "cd selfdrive/car/tests/ && ./test_car_interfaces.py"], ]) diff --git a/release/files_common b/release/files_common index 2fcbf90c91..6f671e1781 100644 --- a/release/files_common +++ b/release/files_common @@ -293,6 +293,7 @@ selfdrive/test/__init__.py selfdrive/test/helpers.py selfdrive/test/setup_device_ci.sh selfdrive/test/test_onroad.py +selfdrive/test/test_time_to_onroad.py selfdrive/ui/.gitignore selfdrive/ui/SConscript diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index 281c902933..9fc80d8d72 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -3,13 +3,19 @@ import time from functools import wraps import cereal.messaging as messaging +from common.params import Params from selfdrive.manager.process_config import managed_processes from system.hardware import PC from system.version import training_version, terms_version def set_params_enabled(): - from common.params import Params + os.environ['PASSIVE'] = "0" + os.environ['REPLAY'] = "1" + os.environ['SKIP_FW_QUERY'] = "1" + os.environ['FINGERPRINT'] = "TOYOTA COROLLA TSS2 2019" + os.environ['LOGPRINT'] = "debug" + params = Params() params.put("HasAcceptedTerms", terms_version) params.put("CompletedTrainingVersion", training_version) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 22ddb6e9cc..327d8d0ff6 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -95,12 +95,6 @@ class TestOnroad(unittest.TestCase): return # setup env - os.environ['PASSIVE'] = "0" - os.environ['REPLAY'] = "1" - os.environ['SKIP_FW_QUERY'] = "1" - os.environ['FINGERPRINT'] = "TOYOTA COROLLA TSS2 2019" - os.environ['LOGPRINT'] = "debug" - params = Params() params.clear_all() set_params_enabled() diff --git a/selfdrive/test/test_time_to_onroad.py b/selfdrive/test/test_time_to_onroad.py new file mode 100755 index 0000000000..65683ed890 --- /dev/null +++ b/selfdrive/test/test_time_to_onroad.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import os +import time +import subprocess +import pytest + +import cereal.messaging as messaging +from common.basedir import BASEDIR +from common.timeout import Timeout +from selfdrive.test.helpers import set_params_enabled + + +def test_time_to_onroad(): + # launch + set_params_enabled() + manager_path = os.path.join(BASEDIR, "selfdrive/manager/manager.py") + proc = subprocess.Popen(["python", manager_path]) + + start_time = time.monotonic() + sm = messaging.SubMaster(['controlsState', 'deviceState']) + try: + # wait for onroad + with Timeout(20, "timed out waiting to go onroad"): + while True: + sm.update(1000) + if sm['deviceState'].started: + break + time.sleep(1) + + # wait for engageability + with Timeout(10, "timed out waiting for engageable"): + while True: + sm.update(1000) + if sm['controlsState'].engageable: + break + time.sleep(1) + print(f"engageable after {time.monotonic() - start_time:.2f}s") + + # once we're enageable, must be for the next few seconds + for _ in range(500): + sm.update(100) + assert sm['controlsState'].engageable + finally: + proc.terminate() + if proc.wait(60) is None: + proc.kill()