diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_ioniq5pe_long_profile.py b/opendbc_repo/opendbc/car/hyundai/tests/test_ioniq5pe_long_profile.py index 587f1cc69b..14fc06fd91 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_ioniq5pe_long_profile.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_ioniq5pe_long_profile.py @@ -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 diff --git a/opendbc_repo/opendbc/car/hyundai/tests/test_long_main_buttons.py b/opendbc_repo/opendbc/car/hyundai/tests/test_long_main_buttons.py index e89923052b..854118c33d 100644 --- a/opendbc_repo/opendbc/car/hyundai/tests/test_long_main_buttons.py +++ b/opendbc_repo/opendbc/car/hyundai/tests/test_long_main_buttons.py @@ -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)) diff --git a/opendbc_repo/opendbc/safety/tests/test_subaru_avh_startup.py b/opendbc_repo/opendbc/safety/tests/test_subaru_avh_startup.py index 6ce13471ec..09d0ab8442 100644 --- a/opendbc_repo/opendbc/safety/tests/test_subaru_avh_startup.py +++ b/opendbc_repo/opendbc/safety/tests/test_subaru_avh_startup.py @@ -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) diff --git a/prebuilt.json b/prebuilt.json index f12a653a96..cccba4dadf 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "a5ff59c8b5d0419360006c10b7f23d15b10d3f5ebdb88cfafdfcc712f38d7654", "schema_version": 1} +{"protected_inventory_sha256": "f40dda21dcd3a36f88cb8ea563fac27b023c7766257dcf2d36027eacb2c668d4", "schema_version": 1}