test_mpack_frames.py
python
sha256:b636f72dcba9e190afb980bece906fa5b717fbde014b76ef023df8cb96e01eb9
docs: expand cache plan with all seven testing tiers and do…
Sonnet 4.6
131 days ago
| 1 | """Tests for MPack frame TypedDicts and protocol constants. |
| 2 | |
| 3 | Coverage tiers |
| 4 | -------------- |
| 5 | - Constants: MPACK_VERSION, MPACK_CONTENT_TYPE, all frame tag values |
| 6 | - Frame TypedDicts: required fields, type annotations, total/partial flags |
| 7 | - Frame tag registry: every tag maps to a TypedDict |
| 8 | - Canonical signature payload: deterministic bytes, field coverage |
| 9 | - Forward-compatibility: unknown frame tags are single ASCII characters |
| 10 | """ |
| 11 | from __future__ import annotations |
| 12 | |
| 13 | import msgpack |
| 14 | from typing import get_type_hints |
| 15 | |
| 16 | |
| 17 | # --------------------------------------------------------------------------- |
| 18 | # Constants |
| 19 | # --------------------------------------------------------------------------- |
| 20 | |
| 21 | |
| 22 | class TestConstants: |
| 23 | def test_mpack_version(self) -> None: |
| 24 | from muse.core.mpack import MPACK_VERSION |
| 25 | assert MPACK_VERSION == "mpack/1.0" |
| 26 | |
| 27 | def test_mpack_content_type(self) -> None: |
| 28 | from muse.core.mpack import MPACK_CONTENT_TYPE |
| 29 | assert MPACK_CONTENT_TYPE == "application/x-muse-mpack" |
| 30 | |
| 31 | def test_frame_tags_are_single_uppercase_ascii(self) -> None: |
| 32 | from muse.core.mpack import ( |
| 33 | FRAME_HEADER, FRAME_OBJECT, FRAME_COMMIT_PACK, FRAME_END, |
| 34 | FRAME_PROGRESS, FRAME_ERROR, FRAME_RESULT, FRAME_ACK, |
| 35 | ) |
| 36 | for tag in (FRAME_HEADER, FRAME_OBJECT, FRAME_COMMIT_PACK, FRAME_END, |
| 37 | FRAME_PROGRESS, FRAME_ERROR, FRAME_RESULT, FRAME_ACK): |
| 38 | assert isinstance(tag, str) and len(tag) == 1 and tag.isupper(), ( |
| 39 | f"Frame tag {tag!r} must be a single uppercase ASCII character" |
| 40 | ) |
| 41 | |
| 42 | def test_frame_tags_are_distinct(self) -> None: |
| 43 | from muse.core.mpack import ( |
| 44 | FRAME_HEADER, FRAME_OBJECT, FRAME_COMMIT_PACK, FRAME_END, |
| 45 | FRAME_PROGRESS, FRAME_ERROR, FRAME_RESULT, FRAME_ACK, |
| 46 | ) |
| 47 | tags = [FRAME_HEADER, FRAME_OBJECT, FRAME_COMMIT_PACK, FRAME_END, |
| 48 | FRAME_PROGRESS, FRAME_ERROR, FRAME_RESULT, FRAME_ACK] |
| 49 | assert len(set(tags)) == len(tags), "All frame tags must be unique" |
| 50 | |
| 51 | def test_frame_header_tag_is_H(self) -> None: |
| 52 | from muse.core.mpack import FRAME_HEADER |
| 53 | assert FRAME_HEADER == "H" |
| 54 | |
| 55 | def test_frame_object_tag_is_O(self) -> None: |
| 56 | from muse.core.mpack import FRAME_OBJECT |
| 57 | assert FRAME_OBJECT == "O" |
| 58 | |
| 59 | def test_frame_commit_pack_tag_is_C(self) -> None: |
| 60 | from muse.core.mpack import FRAME_COMMIT_PACK |
| 61 | assert FRAME_COMMIT_PACK == "C" |
| 62 | |
| 63 | def test_frame_end_tag_is_E(self) -> None: |
| 64 | from muse.core.mpack import FRAME_END |
| 65 | assert FRAME_END == "E" |
| 66 | |
| 67 | def test_frame_progress_tag_is_P(self) -> None: |
| 68 | from muse.core.mpack import FRAME_PROGRESS |
| 69 | assert FRAME_PROGRESS == "P" |
| 70 | |
| 71 | def test_frame_error_tag_is_X(self) -> None: |
| 72 | from muse.core.mpack import FRAME_ERROR |
| 73 | assert FRAME_ERROR == "X" |
| 74 | |
| 75 | def test_frame_result_tag_is_R(self) -> None: |
| 76 | from muse.core.mpack import FRAME_RESULT |
| 77 | assert FRAME_RESULT == "R" |
| 78 | |
| 79 | def test_frame_ack_tag_is_A(self) -> None: |
| 80 | from muse.core.mpack import FRAME_ACK |
| 81 | assert FRAME_ACK == "A" |
| 82 | |
| 83 | |
| 84 | # --------------------------------------------------------------------------- |
| 85 | # Frame TypedDicts — field annotations |
| 86 | # --------------------------------------------------------------------------- |
| 87 | |
| 88 | |
| 89 | class TestMPackHeaderFrame: |
| 90 | def test_exists(self) -> None: |
| 91 | from muse.core.mpack import MPackHeaderFrame |
| 92 | assert MPackHeaderFrame is not None |
| 93 | |
| 94 | def test_has_t_field(self) -> None: |
| 95 | from muse.core.mpack import MPackHeaderFrame |
| 96 | hints = get_type_hints(MPackHeaderFrame) |
| 97 | assert "t" in hints |
| 98 | |
| 99 | def test_has_version_field(self) -> None: |
| 100 | from muse.core.mpack import MPackHeaderFrame |
| 101 | hints = get_type_hints(MPackHeaderFrame) |
| 102 | assert "v" in hints |
| 103 | |
| 104 | def test_has_op_field(self) -> None: |
| 105 | from muse.core.mpack import MPackHeaderFrame |
| 106 | hints = get_type_hints(MPackHeaderFrame) |
| 107 | assert "op" in hints |
| 108 | |
| 109 | def test_has_branch_field(self) -> None: |
| 110 | from muse.core.mpack import MPackHeaderFrame |
| 111 | hints = get_type_hints(MPackHeaderFrame) |
| 112 | assert "branch" in hints |
| 113 | |
| 114 | def test_has_n_objects_field(self) -> None: |
| 115 | from muse.core.mpack import MPackHeaderFrame |
| 116 | hints = get_type_hints(MPackHeaderFrame) |
| 117 | assert "n_objects" in hints |
| 118 | |
| 119 | def test_has_n_commits_field(self) -> None: |
| 120 | from muse.core.mpack import MPackHeaderFrame |
| 121 | hints = get_type_hints(MPackHeaderFrame) |
| 122 | assert "n_commits" in hints |
| 123 | |
| 124 | def test_has_objects_bytes_field(self) -> None: |
| 125 | from muse.core.mpack import MPackHeaderFrame |
| 126 | hints = get_type_hints(MPackHeaderFrame) |
| 127 | assert "objects_bytes" in hints |
| 128 | |
| 129 | def test_has_agent_id_field(self) -> None: |
| 130 | from muse.core.mpack import MPackHeaderFrame |
| 131 | hints = get_type_hints(MPackHeaderFrame) |
| 132 | assert "agent_id" in hints |
| 133 | |
| 134 | def test_has_model_id_field(self) -> None: |
| 135 | from muse.core.mpack import MPackHeaderFrame |
| 136 | hints = get_type_hints(MPackHeaderFrame) |
| 137 | assert "model_id" in hints |
| 138 | |
| 139 | def test_has_signer_key_field(self) -> None: |
| 140 | from muse.core.mpack import MPackHeaderFrame |
| 141 | hints = get_type_hints(MPackHeaderFrame) |
| 142 | assert "signer_key" in hints |
| 143 | |
| 144 | def test_has_signature_field(self) -> None: |
| 145 | from muse.core.mpack import MPackHeaderFrame |
| 146 | hints = get_type_hints(MPackHeaderFrame) |
| 147 | assert "signature" in hints |
| 148 | |
| 149 | def test_has_domains_field(self) -> None: |
| 150 | from muse.core.mpack import MPackHeaderFrame |
| 151 | hints = get_type_hints(MPackHeaderFrame) |
| 152 | assert "domains" in hints |
| 153 | |
| 154 | def test_has_have_field(self) -> None: |
| 155 | from muse.core.mpack import MPackHeaderFrame |
| 156 | hints = get_type_hints(MPackHeaderFrame) |
| 157 | assert "have" in hints |
| 158 | |
| 159 | |
| 160 | class TestMPackObjectFrame: |
| 161 | def test_exists(self) -> None: |
| 162 | from muse.core.mpack import MPackObjectFrame |
| 163 | assert MPackObjectFrame is not None |
| 164 | |
| 165 | def test_has_t_field(self) -> None: |
| 166 | from muse.core.mpack import MPackObjectFrame |
| 167 | hints = get_type_hints(MPackObjectFrame) |
| 168 | assert "t" in hints |
| 169 | |
| 170 | def test_has_id_field(self) -> None: |
| 171 | from muse.core.mpack import MPackObjectFrame |
| 172 | hints = get_type_hints(MPackObjectFrame) |
| 173 | assert "id" in hints |
| 174 | |
| 175 | def test_has_content_field(self) -> None: |
| 176 | from muse.core.mpack import MPackObjectFrame |
| 177 | hints = get_type_hints(MPackObjectFrame) |
| 178 | assert "content" in hints |
| 179 | |
| 180 | def test_has_enc_field(self) -> None: |
| 181 | from muse.core.mpack import MPackObjectFrame |
| 182 | hints = get_type_hints(MPackObjectFrame) |
| 183 | assert "enc" in hints |
| 184 | |
| 185 | def test_has_sz_field(self) -> None: |
| 186 | """sz = uncompressed byte size — receiver budgets before decode.""" |
| 187 | from muse.core.mpack import MPackObjectFrame |
| 188 | hints = get_type_hints(MPackObjectFrame) |
| 189 | assert "sz" in hints |
| 190 | |
| 191 | def test_has_dom_field(self) -> None: |
| 192 | """dom = domain: code | midi | audio | model-weights | ...""" |
| 193 | from muse.core.mpack import MPackObjectFrame |
| 194 | hints = get_type_hints(MPackObjectFrame) |
| 195 | assert "dom" in hints |
| 196 | |
| 197 | def test_has_path_field(self) -> None: |
| 198 | from muse.core.mpack import MPackObjectFrame |
| 199 | hints = get_type_hints(MPackObjectFrame) |
| 200 | assert "path" in hints |
| 201 | |
| 202 | |
| 203 | class TestMPackCommitPackFrame: |
| 204 | def test_exists(self) -> None: |
| 205 | from muse.core.mpack import MPackCommitPackFrame |
| 206 | assert MPackCommitPackFrame is not None |
| 207 | |
| 208 | def test_has_required_fields(self) -> None: |
| 209 | from muse.core.mpack import MPackCommitPackFrame |
| 210 | hints = get_type_hints(MPackCommitPackFrame) |
| 211 | for f in ("t", "commits", "snapshots"): |
| 212 | assert f in hints, f"MPackCommitPackFrame missing field {f!r}" |
| 213 | |
| 214 | |
| 215 | class TestMPackEndFrame: |
| 216 | def test_exists(self) -> None: |
| 217 | from muse.core.mpack import MPackEndFrame |
| 218 | assert MPackEndFrame is not None |
| 219 | |
| 220 | def test_has_n_objects_for_integrity_check(self) -> None: |
| 221 | from muse.core.mpack import MPackEndFrame |
| 222 | hints = get_type_hints(MPackEndFrame) |
| 223 | assert "n_objects" in hints |
| 224 | |
| 225 | def test_has_n_commits_for_integrity_check(self) -> None: |
| 226 | from muse.core.mpack import MPackEndFrame |
| 227 | hints = get_type_hints(MPackEndFrame) |
| 228 | assert "n_commits" in hints |
| 229 | |
| 230 | |
| 231 | class TestMPackProgressFrame: |
| 232 | def test_has_pct_field(self) -> None: |
| 233 | """pct enables real progress bars (0.0–100.0), not just text.""" |
| 234 | from muse.core.mpack import MPackProgressFrame |
| 235 | hints = get_type_hints(MPackProgressFrame) |
| 236 | assert "pct" in hints |
| 237 | |
| 238 | def test_has_msg_field(self) -> None: |
| 239 | from muse.core.mpack import MPackProgressFrame |
| 240 | hints = get_type_hints(MPackProgressFrame) |
| 241 | assert "msg" in hints |
| 242 | |
| 243 | |
| 244 | class TestMPackErrorFrame: |
| 245 | def test_has_msg_and_code(self) -> None: |
| 246 | from muse.core.mpack import MPackErrorFrame |
| 247 | hints = get_type_hints(MPackErrorFrame) |
| 248 | assert "msg" in hints |
| 249 | assert "code" in hints |
| 250 | |
| 251 | |
| 252 | class TestMPackResultFrame: |
| 253 | def test_has_ok_msg_heads_head(self) -> None: |
| 254 | from muse.core.mpack import MPackResultFrame |
| 255 | hints = get_type_hints(MPackResultFrame) |
| 256 | for f in ("ok", "msg", "heads", "head"): |
| 257 | assert f in hints, f"MPackResultFrame missing field {f!r}" |
| 258 | |
| 259 | |
| 260 | class TestMPackAckFrame: |
| 261 | def test_has_ack_common_ready(self) -> None: |
| 262 | from muse.core.mpack import MPackAckFrame |
| 263 | hints = get_type_hints(MPackAckFrame) |
| 264 | for f in ("ack", "common", "ready"): |
| 265 | assert f in hints, f"MPackAckFrame missing field {f!r}" |
| 266 | |
| 267 | |
| 268 | # --------------------------------------------------------------------------- |
| 269 | # Canonical signature payload |
| 270 | # --------------------------------------------------------------------------- |
| 271 | |
| 272 | |
| 273 | class TestCanonicalHeaderPayload: |
| 274 | def test_returns_bytes(self) -> None: |
| 275 | from muse.core.mpack import _canonical_header_payload |
| 276 | result = _canonical_header_payload( |
| 277 | op="push", branch="main", n_objects=10, n_commits=5, |
| 278 | agent_id="claude-code", model_id="claude-sonnet-4-6", |
| 279 | ) |
| 280 | assert isinstance(result, bytes) |
| 281 | |
| 282 | def test_is_valid_msgpack(self) -> None: |
| 283 | from muse.core.mpack import _canonical_header_payload |
| 284 | payload = _canonical_header_payload( |
| 285 | op="push", branch="main", n_objects=10, n_commits=5, |
| 286 | agent_id="claude-code", model_id="claude-sonnet-4-6", |
| 287 | ) |
| 288 | decoded = msgpack.unpackb(payload, raw=False) |
| 289 | assert isinstance(decoded, dict) |
| 290 | |
| 291 | def test_contains_version(self) -> None: |
| 292 | from muse.core.mpack import _canonical_header_payload, MPACK_VERSION |
| 293 | payload = _canonical_header_payload( |
| 294 | op="push", branch="main", n_objects=10, n_commits=5, |
| 295 | agent_id="", model_id="", |
| 296 | ) |
| 297 | decoded = msgpack.unpackb(payload, raw=False) |
| 298 | assert decoded["v"] == MPACK_VERSION |
| 299 | |
| 300 | def test_covers_all_signing_fields(self) -> None: |
| 301 | from muse.core.mpack import _canonical_header_payload |
| 302 | payload = _canonical_header_payload( |
| 303 | op="push", branch="dev", n_objects=3, n_commits=1, |
| 304 | agent_id="claude-code", model_id="claude-sonnet-4-6", |
| 305 | ) |
| 306 | decoded = msgpack.unpackb(payload, raw=False) |
| 307 | for field in ("v", "op", "branch", "n_objects", "n_commits", "agent_id", "model_id"): |
| 308 | assert field in decoded, f"Canonical payload missing field {field!r}" |
| 309 | |
| 310 | def test_deterministic_across_calls(self) -> None: |
| 311 | from muse.core.mpack import _canonical_header_payload |
| 312 | kwargs = dict(op="push", branch="main", n_objects=5, n_commits=2, |
| 313 | agent_id="claude-code", model_id="claude-sonnet-4-6") |
| 314 | a = _canonical_header_payload(**kwargs) |
| 315 | b = _canonical_header_payload(**kwargs) |
| 316 | assert a == b, "Canonical payload must be deterministic" |
| 317 | |
| 318 | def test_different_inputs_produce_different_payloads(self) -> None: |
| 319 | from muse.core.mpack import _canonical_header_payload |
| 320 | a = _canonical_header_payload( |
| 321 | op="push", branch="main", n_objects=5, n_commits=2, |
| 322 | agent_id="claude-code", model_id="claude-sonnet-4-6", |
| 323 | ) |
| 324 | b = _canonical_header_payload( |
| 325 | op="fetch", branch="dev", n_objects=10, n_commits=3, |
| 326 | agent_id="agentception", model_id="claude-opus-4-6", |
| 327 | ) |
| 328 | assert a != b |
| 329 | |
| 330 | |
| 331 | # --------------------------------------------------------------------------- |
| 332 | # Docstring |
| 333 | # --------------------------------------------------------------------------- |
| 334 | |
| 335 | |
| 336 | class TestDocstring: |
| 337 | def _doc(self) -> str: |
| 338 | import muse.core.mpack as mod |
| 339 | return mod.__doc__ or "" |
| 340 | |
| 341 | def test_documents_frame_sequence(self) -> None: |
| 342 | assert "H" in self._doc() and "O" in self._doc() and "C" in self._doc() |
| 343 | |
| 344 | def test_documents_mpack_version(self) -> None: |
| 345 | assert "mpack/1.0" in self._doc() |
| 346 | |
| 347 | def test_documents_content_type(self) -> None: |
| 348 | assert "application/x-muse-mpack" in self._doc() |
| 349 | |
| 350 | def test_documents_provenance(self) -> None: |
| 351 | assert "agent_id" in self._doc() or "provenance" in self._doc().lower() |
| 352 | |
| 353 | def test_documents_compression(self) -> None: |
| 354 | assert "zstd" in self._doc() or "zlib" in self._doc() |
File History
2 commits
sha256:b636f72dcba9e190afb980bece906fa5b717fbde014b76ef023df8cb96e01eb9
docs: expand cache plan with all seven testing tiers and do…
Sonnet 4.6
131 days ago
sha256:7f9e2ef5286aedad9c1e6011b4c46ca27f39dbdad6e3409357e36b26e46b3b7c
docs: docstring sprint for-each-ref→hotspots — idiomatic ru…
Sonnet 4.6
patch
137 days ago