Files
StarPilot/openpilot/starpilot/tests/test_ford_initial_epoch.py
T

87 lines
3.9 KiB
Python

"""Initial integrity epoch zero is valid; ownership/deadlines remain unchanged."""
import pytest
from openpilot.starpilot.aol.intent_companion import IntentCompanion
from openpilot.starpilot.tests import test_ford_reverse_intent as reverse
from openpilot.starpilot.tests import test_ford_alpha_reverse_intent as alpha_reverse
from openpilot.starpilot.tests import test_ford_physical_pause_intent as physical
from openpilot.starpilot.tests import test_ford_typed_gas_intent as gas
from openpilot.starpilot.tests import test_ford_command_pause as command
from openpilot.starpilot.tests import ford_alpha_test_support as alpha_support
from openpilot.starpilot.car.ford.reverse_intent import retain_reverse_intent
from openpilot.starpilot.car.ford.physical_pause import retain_physical_pause_intent
from openpilot.starpilot.car.ford.command_pause import retain_command_pause_intent
from openpilot.starpilot.car.ford.gas_override import retained_gas_lateral_native
CASES = ['stock-reverse','alpha-reverse','command','typed-gas',*physical.REASONS]
def initial_epoch_receipts(monkeypatch):
epoch = IntentCompanion(None).integrity_epoch
assert epoch == 0
original = reverse.sample
def zero(*args, **kwargs):
peers, native = original(*args, **kwargs)
reverse.change(peers, 'aolAxisState', lambda axis: setattr(axis, 'intentIntegrityEpoch', epoch))
return peers, native
for module in (reverse, physical, alpha_support, command):
monkeypatch.setattr(module, 'sample', zero)
return zero
def setup_case(case, monkeypatch):
zero = initial_epoch_receipts(monkeypatch)
now = reverse.NOW + 20_000_000
if case == 'stock-reverse':
cp, cs, feedback = reverse.baseline()
cs.gearShifter = 'reverse'
peers, _ = zero(cp, reverse.NOW + 10_000_000, now, 2, allowed=False)
function = retain_reverse_intent
elif case == 'alpha-reverse':
cp, cs, feedback, peers, _ = alpha_reverse.setup()
function = retain_reverse_intent
elif case == 'command':
cp, cs, feedback, peers, _ = command.pause()
now = reverse.NOW + 40_000_000
function = retain_command_pause_intent
elif case == 'typed-gas':
cp, cs, feedback, peers, _ = gas.setup()
function = retained_gas_lateral_native
else:
cp, cs, feedback, peers, _ = physical.setup(case)
function = retain_physical_pause_intent
assert feedback.availability_epoch == feedback.signature[15] == peers['aolAxisState'].intentIntegrityEpoch == 0
return cp, cs, feedback, peers, now, function
@pytest.mark.parametrize('case', CASES)
def test_valid_initial_consumer_epoch_preserves_only_qualified_existing_intent(case, monkeypatch):
cp, cs, feedback, peers, now, function = setup_case(case, monkeypatch)
before = dict(vars(feedback))
result = function(feedback, peers, cp, cs, peers['aolAxisState'], now, latched=True, producer=reverse.PRODUCER)
assert result is not None and result is not False
assert vars(feedback) == before
@pytest.mark.parametrize('case', CASES)
@pytest.mark.parametrize('fault',['no-baseline','different-current','different-previous','producer','expired'])
def test_initial_zero_cannot_replace_missing_or_changed_owner_or_extend_deadline(case, fault, monkeypatch):
cp, cs, feedback, peers, now, function = setup_case(case, monkeypatch)
producer = reverse.PRODUCER
if fault == 'no-baseline':
feedback.availability_epoch = None
elif fault == 'different-current':
reverse.change(peers, 'aolAxisState', lambda axis: setattr(axis, 'intentIntegrityEpoch', 1))
elif fault == 'different-previous':
previous = list(feedback.signature)
previous[15] = 1
feedback.signature = tuple(previous)
elif fault == 'producer':
producer = 'different-card'
else:
now += 200_000_001
before = dict(vars(feedback))
result = function(feedback, peers, cp, cs, peers['aolAxisState'], now, latched=True, producer=producer)
assert result is None or result is False
assert vars(feedback) == before