Align PE marker and Subaru build variant tests

This commit is contained in:
Dom
2026-10-22 18:42:16 -05:00
parent 281f5b6b3a
commit 43360170dd
4 changed files with 42 additions and 22 deletions
@@ -30,16 +30,32 @@ class TestPELongProfile(unittest.TestCase):
self.assertEqual(stock.to_dict(), before)
self.assertIsNone(candidate(params(candidate=CAR.KIA_EV9), enabled=True, is_release=False))
def test_exact_alternative_experience_survives_serialization(self):
for experience in (0, 1, 32, 33, 64):
with self.subTest(experience=experience):
cp = candidate(params(), enabled=True, is_release=False)
cp.alternativeExperience = experience
self.assertTrue(required(cp))
self.assertEqual(qualified(cp), experience in (0, 32))
self.assertEqual(qualified(copy_cp(cp)), experience in (0, 32))
def test_malformed_active_pe_cannot_bypass_required_owner(self):
for field, value in (('passive', True), ('dashcamOnly', True), ('pcmCruise', True),
('alternativeExperience', 32), ('startAccel', .2), ('vEgoStarting', .5)):
cp = candidate(params(), enabled=True, is_release=False)
setattr(cp.deprecated if field in ('startAccel', 'vEgoStarting', 'vEgoStopping', 'stoppingDecelRate') else cp, field, value)
self.assertTrue(required(cp))
self.assertFalse(qualified(cp), field)
cp = candidate(params(), enabled=True, is_release=False)
cp.safetyConfigs[0].safetyParam = 0x5C95
self.assertFalse(qualified(cp))
for experience in (0, 32):
for field, value in (('passive', True), ('dashcamOnly', True), ('pcmCruise', True),
('startAccel', .2), ('vEgoStarting', .5)):
with self.subTest(experience=experience, field=field):
cp = candidate(params(), enabled=True, is_release=False)
cp.alternativeExperience = experience
self.assertTrue(qualified(cp))
setattr(cp.deprecated if field in ('startAccel', 'vEgoStarting', 'vEgoStopping', 'stoppingDecelRate') else cp, field, value)
self.assertTrue(required(cp))
self.assertFalse(qualified(cp), field)
with self.subTest(experience=experience, field='safetyParam'):
cp = candidate(params(), enabled=True, is_release=False)
cp.alternativeExperience = experience
self.assertTrue(qualified(cp))
cp.safetyConfigs[0].safetyParam = 0x5C95
self.assertFalse(qualified(cp))
def test_unobserved_topologies_and_missing_physical_identity_sources_stay_stock(self):
for topology in ('lka', 'lfa'):
@@ -48,13 +64,16 @@ class TestPELongProfile(unittest.TestCase):
self.assertIsNone(candidate(params(missing=missing), enabled=True, is_release=False))
def test_nonfinite_calibration_cannot_enter_the_sealed_long_owner(self):
for field in ('startAccel', 'vEgoStarting', 'vEgoStopping', 'stoppingDecelRate', 'longitudinalActuatorDelay'):
for value in (float('nan'), float('inf'), float('-inf')):
with self.subTest(field=field, value=value):
cp = candidate(params(), enabled=True, is_release=False)
setattr(cp.deprecated if field in ('startAccel', 'vEgoStarting', 'vEgoStopping', 'stoppingDecelRate') else cp, field, value)
self.assertTrue(required(cp))
self.assertFalse(qualified(cp))
for experience in (0, 32):
for field in ('startAccel', 'vEgoStarting', 'vEgoStopping', 'stoppingDecelRate', 'longitudinalActuatorDelay'):
for value in (float('nan'), float('inf'), float('-inf')):
with self.subTest(experience=experience, field=field, value=value):
cp = candidate(params(), enabled=True, is_release=False)
cp.alternativeExperience = experience
self.assertTrue(qualified(cp))
setattr(cp.deprecated if field in ('startAccel', 'vEgoStarting', 'vEgoStopping', 'stoppingDecelRate') else cp, field, value)
self.assertTrue(required(cp))
self.assertFalse(qualified(cp))
def test_recorded_2027_inherits_pe_capability_and_release_stays_stock(self):
from opendbc.car.hyundai.tests.test_ioniq5pe_2027 import params as recorded_params
@@ -146,7 +146,7 @@ def test_enable_release_without_main_matches_original_profile_scope(name):
else log.SelfdriveState.OpenpilotState.disabled)
@pytest.mark.parametrize('name,experience', [('pe', 0), ('elantra', 0), ('ev9', 0), ('ev9', 32)])
@pytest.mark.parametrize('name,experience', [('pe', 0), ('pe', 32), ('elantra', 0), ('ev9', 0), ('ev9', 32)])
@pytest.mark.parametrize('field,value', [('brand', 'other'), ('carFingerprint', 'foreign'),
('passive', True), ('notCar', True), ('dashcamOnly', True),
('openpilotLongitudinalControl', False), ('pcmCruise', True),
@@ -159,7 +159,7 @@ def test_main_state_helper_rejects_changed_authority_contract(name, experience,
assert not qualified(cp)
@pytest.mark.parametrize('name,experience', [('pe', 0), ('elantra', 0), ('ev9', 0), ('ev9', 32)])
@pytest.mark.parametrize('name,experience', [('pe', 0), ('pe', 32), ('elantra', 0), ('ev9', 0), ('ev9', 32)])
def test_main_state_helper_rejects_neighbor_native_word(name, experience):
cp = profile(name)
cp.alternativeExperience = experience
@@ -173,4 +173,4 @@ def test_main_state_helper_rejects_neighbor_native_word(name, experience):
def test_main_state_helper_requires_exact_profile_experience(name, experience):
cp = profile(name)
cp.alternativeExperience = experience
assert qualified(cp) == (experience == 0 or (name == 'ev9' and experience == 32))
assert qualified(cp) == (experience == 0 or (name in ('pe', 'ev9') and experience == 32))
@@ -1,4 +1,3 @@
import os
import pytest
from opendbc.car import structs
from opendbc.car.subaru.avh import avh_request, checksum
@@ -35,8 +34,10 @@ def ready(param, ae):
@pytest.mark.parametrize('param', [1169, 1425])
@pytest.mark.parametrize('ae', [0, 32])
def test_exact_pair_debug_only_and_status_never_tx(param, ae):
# Probe the loaded build, not the Subaru authority under test. ready() resets
# native state and selects Subaru before any RX or TX checks.
debug = libsafety_py.libsafety.set_safety_hooks(structs.CarParams.SafetyModel.allOutput, 0) == 0
safety, last = ready(param, ae)
debug = os.environ['SUBARU_NATIVE_VARIANT'] == 'debug'
for step in (1, 2):
if step == 2:
safety.set_timer(11_060_000)
+1 -1
View File
@@ -1 +1 @@
{"protected_inventory_sha256": "a5ff59c8b5d0419360006c10b7f23d15b10d3f5ebdb88cfafdfcc712f38d7654", "schema_version": 1}
{"protected_inventory_sha256": "f40dda21dcd3a36f88cb8ea563fac27b023c7766257dcf2d36027eacb2c668d4", "schema_version": 1}