Files
StarPilot/openpilot/starpilot/flm/tests/test_learning_name_retention.py
T
2026-10-17 21:23:30 -05:00

45 lines
1.9 KiB
Python

"""Actual Cereal named-field decoding keeps content and fixed cache bounds."""
import struct
import pytest
from openpilot.cereal import custom
from openpilot.starpilot.flm import learning_wire as wire
def row(values):
return custom.LearningControlEvidence.new_message(replayInputs=values).as_reader().replayInputs
def test_actual_cereal_names_share_only_exact_validated_keys():
wire._evidence_field_name.cache_clear()
values=row([{'name':'steeringAngleDeg','number':-0.0},{'name':'steeringPressed','boolean':False},
{'name':'sourceText','text':'unchanged'}])
first=wire._read_named_values(values,32)
second=wire._read_named_values(values,32)
assert first==second
assert all(a[0] is b[0] for a,b in zip(first,second,strict=True))
assert struct.pack('!d',first[0][1])==struct.pack('!d',-0.0)
assert type(first[1][1]) is bool and first[1][1] is False
assert first[2][1]=='unchanged'
different=wire._read_named_values(row([{'name':'steeringAngleDEG','number':1.}]),32)
assert different[0][0]!=first[0][0]
assert different[0][0] is not first[0][0]
@pytest.mark.parametrize('name',['','x'*97])
def test_invalid_names_never_enter_receiver_key_cache(name):
wire._evidence_field_name.cache_clear()
with pytest.raises(ValueError,match='bounded string'):
wire._read_named_values(row([{'name':name,'number':1.}]),32)
assert wire._evidence_field_name.cache_info().currsize==0
def test_receiver_key_cache_has_fixed_bound_and_original_wire_bound_remains():
wire._evidence_field_name.cache_clear()
for i in range(2200):
value=wire._read_named_values(row([{'name':f'field-{i}','number':float(i)}]),32)
assert value==((f'field-{i}',float(i)),)
assert wire._evidence_field_name.cache_info().currsize==2048
with pytest.raises(ValueError,match='replay scalar bounds'):
wire._read_named_values(row([{'name':'field','number':1.}]*33),32)
assert wire._evidence_field_name.cache_info().currsize==2048