mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-07-16 21:42:06 +08:00
14318d2f09
# Conflicts: # .github/labeler.yaml # .github/workflows/auto_pr_review.yaml # .github/workflows/docs.yaml # .github/workflows/release.yaml # .github/workflows/repo-maintenance.yaml # .github/workflows/tests.yaml # .github/workflows/ui_preview.yaml # README.md # SConstruct # conftest.py # docs/CARS.md # msgq_repo # opendbc_repo # openpilot/cereal/messaging/tests/validate_sp_cereal_upstream.py # openpilot/common/api.py # openpilot/common/hardware/hw.py # openpilot/common/version.py # openpilot/selfdrive/assets/fonts/Audiowide-Regular.ttf # openpilot/selfdrive/assets/sounds/prompt_single_high.wav # openpilot/selfdrive/assets/sounds/prompt_single_low.wav # openpilot/selfdrive/car/card.py # openpilot/selfdrive/car/helpers.py # openpilot/selfdrive/car/tests/test_car_interfaces.py # openpilot/selfdrive/car/tests/test_cruise_speed.py # openpilot/selfdrive/controls/lib/desire_helper.py # openpilot/selfdrive/controls/lib/longcontrol.py # openpilot/selfdrive/controls/plannerd.py # openpilot/selfdrive/controls/radard.py # openpilot/selfdrive/controls/tests/test_longcontrol.py # openpilot/selfdrive/modeld/compile_warp.py # openpilot/selfdrive/modeld/modeld.py # openpilot/selfdrive/monitoring/policy.py # openpilot/selfdrive/monitoring/test_monitoring.py # openpilot/selfdrive/selfdrived/events.py # openpilot/selfdrive/selfdrived/selfdrived.py # openpilot/selfdrive/ui/layouts/onboarding.py # openpilot/selfdrive/ui/mici/layouts/onboarding.py # openpilot/selfdrive/ui/soundd.py # openpilot/selfdrive/ui/tests/diff/replay.py # openpilot/selfdrive/ui/translations/app.pot # openpilot/system/athena/athenad.py # openpilot/system/athena/manage_athenad.py # openpilot/system/hardware/hardwared.py # openpilot/system/loggerd/config.py # openpilot/system/manager/github_runner.sh # openpilot/system/manager/manager.py # openpilot/system/updated/updated.py # panda # pyproject.toml # scripts/lint/lint.sh # system/manager/process_config.py # system/statsd.py # tinygrad_repo # tools/release/build_release.sh # tools/release/build_stripped.sh # uv.lock
100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
import contextlib
|
|
import gc
|
|
import os
|
|
import pytest
|
|
|
|
from openpilot.common.prefix import OpenpilotPrefix
|
|
from openpilot.system.manager import manager
|
|
from openpilot.common.hardware import TICI, HARDWARE
|
|
|
|
# these are heavy CI-only tests, invoked explicitly in .github/workflows/tests.yaml
|
|
collect_ignore = [
|
|
"openpilot/selfdrive/test/process_replay/test_processes.py",
|
|
"openpilot/selfdrive/test/process_replay/test_regen.py",
|
|
|
|
"openpilot/tools/sim/",
|
|
|
|
# tinygrad JIT has process-global state. Other test files import modeld → tinygrad,
|
|
# which corrupts JIT captures for test_warp.py in the same process. Run separately in CI.
|
|
"openpilot/sunnypilot/modeld_v2/tests/test_warp.py",
|
|
]
|
|
|
|
|
|
def pytest_sessionstart(session):
|
|
# TODO: fix tests and enable test order randomization
|
|
if session.config.pluginmanager.hasplugin('randomly'):
|
|
session.config.option.randomly_reorganize = False
|
|
|
|
|
|
@pytest.hookimpl(hookwrapper=True, trylast=True)
|
|
def pytest_runtest_call(item):
|
|
# ensure we run as a hook after capturemanager's
|
|
if item.get_closest_marker("nocapture") is not None:
|
|
capmanager = item.config.pluginmanager.getplugin("capturemanager")
|
|
with capmanager.global_and_fixture_disabled():
|
|
yield
|
|
else:
|
|
yield
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def clean_env():
|
|
starting_env = dict(os.environ)
|
|
yield
|
|
os.environ.clear()
|
|
os.environ.update(starting_env)
|
|
|
|
|
|
@pytest.fixture(scope="function", autouse=True)
|
|
def openpilot_function_fixture(request):
|
|
with clean_env():
|
|
# setup a clean environment for each test
|
|
with OpenpilotPrefix(shared_download_cache=request.node.get_closest_marker("shared_download_cache") is not None) as prefix:
|
|
prefix = os.environ["OPENPILOT_PREFIX"]
|
|
|
|
yield
|
|
|
|
# ensure the test doesn't change the prefix
|
|
assert "OPENPILOT_PREFIX" in os.environ and prefix == os.environ["OPENPILOT_PREFIX"]
|
|
|
|
# cleanup any started processes
|
|
manager.manager_cleanup()
|
|
|
|
# some processes disable gc for performance, re-enable here
|
|
if not gc.isenabled():
|
|
gc.enable()
|
|
gc.collect()
|
|
|
|
# If you use setUpClass, the environment variables won't be cleared properly,
|
|
# so we need to hook both the function and class pytest fixtures
|
|
@pytest.fixture(scope="class", autouse=True)
|
|
def openpilot_class_fixture():
|
|
with clean_env():
|
|
yield
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
def tici_setup_fixture(request, openpilot_function_fixture):
|
|
"""Ensure a consistent state for tests on-device. Needs the openpilot function fixture to run first."""
|
|
if 'skip_tici_setup' in request.keywords:
|
|
return
|
|
HARDWARE.initialize_hardware()
|
|
HARDWARE.set_power_save(False)
|
|
os.system("pkill -9 -f athena")
|
|
|
|
|
|
@pytest.hookimpl(tryfirst=True)
|
|
def pytest_collection_modifyitems(config, items):
|
|
skipper = pytest.mark.skip(reason="Skipping tici test on PC")
|
|
for item in items:
|
|
if "tici" in item.keywords:
|
|
if not TICI:
|
|
item.add_marker(skipper)
|
|
else:
|
|
item.fixturenames.append('tici_setup_fixture')
|
|
|
|
if "xdist_group_class_property" in item.keywords:
|
|
class_property_name = item.get_closest_marker('xdist_group_class_property').args[0]
|
|
class_property_value = getattr(item.cls, class_property_name)
|
|
item.add_marker(pytest.mark.xdist_group(class_property_value))
|