from missionledger.dsl import PlanDelta from missionledger.csfd import generate_csfd def test_csfd_generation_small_plandelta(): pd = PlanDelta(delta={"move": True, "safe_buffer": 0.5}, version=2, metadata={ "invariants": {"collision": True, "energy": True}, "proof_stub_hash": "stub-abc", "expected_resource_bounds": {"energy": [0, 100]}, }) csfd = generate_csfd(pd, signer="planner-v1", n_frames=3) assert csfd is not None assert csfd.signer == "planner-v1" # frames count should be at least 1 and at most requested assert 1 <= len(csfd.frames) <= 3 # digest hex should be a 64-char hex string assert isinstance(csfd.digest_hex, str) assert len(csfd.digest_hex) == 64 def test_csfd_size_bound(): # Create a PlanDelta with large metadata to force truncation path large_meta = {f"k{i}": "v" * 200 for i in range(5)} pd = PlanDelta(delta={"x": 1}, version=1, metadata={"invariants": {"a": True}, **large_meta}) csfd = generate_csfd(pd, signer="s", n_frames=5) # Ensure serialized representation is <= 512 bytes as enforced import json serialized = json.dumps({"frames": [f.__dict__ for f in csfd.frames], "signer": csfd.signer, "digest_hex": csfd.digest_hex}, sort_keys=True, separators=(",", ":")) assert len(serialized.encode()) <= 512 def test_csfd_signing_and_verification(): import pytest pytest.importorskip("nacl") # now import local helpers from missionledger.dsl import PlanDelta from missionledger.csfd import generate_csfd, sign_csfd, verify_csfd_signature # create a small plandelta pd = PlanDelta(delta={"x": 1}, version=1, metadata={"invariants": {"a": True}}) csfd = generate_csfd(pd, signer="s", n_frames=1) # Generate an ephemeral Ed25519 keypair for signing from nacl.signing import SigningKey sk = SigningKey.generate() sig_hex = sign_csfd(csfd, sk.encode()) assert isinstance(sig_hex, str) assert len(sig_hex) > 0 vk = sk.verify_key ok = verify_csfd_signature(csfd, sig_hex, vk.encode()) assert ok is True