Skip to main content

laser_wire/
fixtures.rs

1// The golden corpus, embedded so a consumer (LaserData Cloud, the Iggy server, a port's
2// conformance suite) can assert against the exact canonical bytes in its own
3// CI without copying files.
4
5macro_rules! corpus {
6    ($($name:literal),+ $(,)?) => {
7        /// Every fixture in the corpus as `(file name, canonical bytes)`.
8        pub const ALL: &[(&str, &[u8])] = &[
9            $(($name, include_bytes!(concat!("../fixtures/", $name)))),+
10        ];
11    };
12}
13
14corpus!(
15    // The agent surface (DRAFT-grade until a real multi-agent application
16    // has bent the envelope: the `agent_invalid_*` negatives must fail
17    // `validate()` identically in every port).
18    "accepted_operation.json",
19    "agent_body_ref.bin",
20    "agent_card.bin",
21    "agent_chunk.bin",
22    "agent_chunk_open.bin",
23    "agent_chunk_terminal.bin",
24    "agent_command.bin",
25    "agent_command_signed.bin",
26    "agent_dead_letter.bin",
27    "agent_error.bin",
28    "agent_error_body.bin",
29    "agent_event.bin",
30    "agent_invalid_chunk_late_deadline.bin",
31    "agent_invalid_chunk_no_sequence.bin",
32    "agent_invalid_chunk_open_no_operation.bin",
33    "agent_invalid_command_no_correlation.bin",
34    "agent_invalid_error_last.bin",
35    "agent_invalid_event_task_state.bin",
36    "agent_invalid_response_channel.bin",
37    "agent_invalid_status_bad_operation.bin",
38    "agent_invalid_status_no_operation.bin",
39    "agent_must_understand.bin",
40    "agent_presence.bin",
41    "agent_record.bin",
42    "agent_response.bin",
43    "agent_session_end.bin",
44    "agent_session_parking.bin",
45    "agent_session_start.bin",
46    "agent_session_status.bin",
47    "agent_session_transition.bin",
48    "session_get.bin",
49    "session_list.bin",
50    "session_events.bin",
51    "session_state.bin",
52    "session_links.bin",
53    "session_sources.bin",
54    "session_sources_lane_only.bin",
55    "session_changes.bin",
56    "session_link_surface.bin",
57    "session_link_relation.bin",
58    "session_heartbeat.bin",
59    "session_reply_info.bin",
60    "session_reply_page.bin",
61    "session_reply_page_rebuilding.bin",
62    "session_reply_events.bin",
63    "session_reply_state.bin",
64    "session_reply_links.bin",
65    "session_reply_sources.bin",
66    "session_reply_changes.bin",
67    "session_reply_error.bin",
68    "session_http_info.json",
69    "session_http_page.json",
70    "session_http_page_rebuilding.json",
71    "session_http_events.json",
72    "session_http_state.json",
73    "session_http_links.json",
74    "session_http_sources.json",
75    "session_http_error.json",
76    "session_http_changes_start_new.json",
77    "session_http_changes_start.json",
78    "session_http_changes_legacy.json",
79    "session_http_changes_page.json",
80    "session_http_changes_no_retained_rows.json",
81    "session_http_changes_gap.json",
82    "session_http_changes_empty.json",
83    "session_http_changes_truncated.json",
84    "session_http_changes_origins.json",
85    "agent_signature.bin",
86    "agent_status_card.bin",
87    "agent_status_session.bin",
88    "agent_status_task.bin",
89    "agent_usage_cost.bin",
90    "authz_bind_roles.bin",
91    "authz_get_role_reply.bin",
92    "authz_history_reply.bin",
93    "authz_history_request.bin",
94    "authz_role.bin",
95    "authz_whoami_reply.bin",
96    "arrow_ipc_metadata.bin",
97    "arrow_ipc_policy.bin",
98    "backend_announce.bin",
99    "backend_announce_topology.bin",
100    "backend_announce_unavailable.bin",
101    "batch_reply.bin",
102    "batch_request.bin",
103    "browse_projections.json",
104    "browse_reply_decoded.bin",
105    "browse_reply_projections.bin",
106    "browse_reply_schema_registered.bin",
107    "browse_reply_schemas.bin",
108    "browse_schemas.json",
109    "capabilities.json",
110    "change_record.bin",
111    "checkpoint_mutation_replicated.bin",
112    "checkpoint_public_mutation_discriminants.bin",
113    "checkpoint_reply_destination.bin",
114    "checkpoint_reply_query_route.bin",
115    "checkpoint_request_public.bin",
116    "client_metadata_list.bin",
117    "client_metadata_query.bin",
118    "producer_presence.bin",
119    "context_manifest.bin",
120    "context_compaction.bin",
121    "context_retrieval.bin",
122    "control_apply_binding.bin",
123    "control_filter_catalog.bin",
124    "control_drop_schema.bin",
125    "control_register_projection.bin",
126    "control_register_schema_avro.bin",
127    "control_register_schema_json.bin",
128    "control_register_schema_protobuf.bin",
129    "control_accept_gap.bin",
130    "control_skip_record.bin",
131    "control_stamped_remove_binding.bin",
132    "control_register_session_source_all.bin",
133    "control_register_session_source_named.bin",
134    "control_remove_binding.bin",
135    "control_remove_session_source.bin",
136    "decode_record.bin",
137    "data_stack_string_discriminants.bin",
138    "destination_checkpoint_status.bin",
139    "destination_issue.json",
140    "destination_page.json",
141    "error_body.json",
142    "fold_snapshot.bin",
143    "filter_catalog_reply_bound.bin",
144    "filter_catalog_reply_configured.bin",
145    "filter_catalog_reply_registered.bin",
146    "filter_ack.bin",
147    "filter_ack_unfiltered.bin",
148    "filter_reply_acknowledged.bin",
149    "filter_consumer_filter.bin",
150    "filter_consumer_filter.json",
151    "filter_eval_cases.json",
152    "dispatch_cases.json",
153    "filter_codec_cases.json",
154    "header_block_envelope.json",
155    "header_block_generic.json",
156    "filter_mutation_register.bin",
157    "filter_mutation_register.json",
158    "filter_mutation_unbind_exact.bin",
159    "filter_mutation_unbind_exact.json",
160    "filter_poll_request.bin",
161    "filter_poll_request_group_id.bin",
162    "filter_reply_revision_disabled.bin",
163    "filter_mutation_revision_state.bin",
164    "filter_mutation_revision_state.json",
165    "filter_catalog_reply_revision_state.bin",
166    "filter_catalog_reply_revisions.bin",
167    "filter_catalog_reply_unbound.bin",
168    "filter_mutation_configure_group.bin",
169    "filter_mutation_configure_group.json",
170    "filter_poll_request_group_auto.bin",
171    "filter_reply_error.bin",
172    "filter_reply_page.bin",
173    "filter_reply_page_unfiltered.bin",
174    "filter_validation.json",
175    "fork_create.bin",
176    "fork_info.json",
177    "fork_put.bin",
178    "fork_reply_created.bin",
179    "forwarded_command.bin",
180    "forwarded_command_positioned.bin",
181    "forwarded_command_scoped.bin",
182    "forwarded_query.bin",
183    "forwarded_query_scoped.bin",
184    "graph_edge.bin",
185    "graph_edge_conversation.bin",
186    "graph_edge_producer.bin",
187    "graph_edge_sourced.bin",
188    "graph_neighbors.bin",
189    "graph_neighbors_conversation.bin",
190    "graph_node.bin",
191    "graph_node_conversation.bin",
192    "graph_node_producer.bin",
193    "graph_node_sourced.bin",
194    "graph_query.bin",
195    "graph_query_conversation.bin",
196    "graph_reply.bin",
197    "graph_upsert.bin",
198    "graph_upsert_session.bin",
199    "hello_reply.bin",
200    "hello_reply_agent.bin",
201    "hello_reply_features.bin",
202    "kv_cas.bin",
203    "kv_cas_session.bin",
204    "kv_cas_fenced.bin",
205    "kv_delete_session.bin",
206    "kv_copy.bin",
207    "kv_get_barriered.bin",
208    "kv_lease.bin",
209    "kv_lease_renew.bin",
210    "kv_move.bin",
211    "kv_namespaces.bin",
212    "kv_entry_memory_scope.bin",
213    "kv_page_view.json",
214    "kv_patch_session.bin",
215    "kv_release.bin",
216    "kv_reply_committed.bin",
217    "kv_reply_leased.bin",
218    "kv_reply_namespaces.bin",
219    "kv_reply_page.bin",
220    "kv_reply_renewed.bin",
221    "kv_reply_stale.bin",
222    "kv_reply_version_conflict.bin",
223    "kv_scan.bin",
224    "kv_set.bin",
225    "kv_set_session.bin",
226    "key_record.bin",
227    "logical_schema.bin",
228    "logical_type_discriminants.bin",
229    "managed_read.bin",
230    "managed_reply.bin",
231    "managed_request.bin",
232    "materialization_destination.bin",
233    "memory_feedback_scoped.bin",
234    "memory_forget_scoped.bin",
235    "memory_item_origin.bin",
236    "mutation_command.bin",
237    "mutation_command_scoped.bin",
238    "query_envelope.bin",
239    "query_envelope_aggregate.bin",
240    "query_envelope_raw_sql.bin",
241    "query_envelope_read_your_writes.bin",
242    "query_envelope_text.bin",
243    "query_error_discriminants.bin",
244    "query_cancel.bin",
245    "query_page.bin",
246    "query_reply_err_stale.bin",
247    "query_reply_err_too_large.bin",
248    "query_reply_ok.bin",
249    "query_execution.json",
250    "query_result.json",
251    "query_route.bin",
252    "query_route_page.json",
253    "query_status.bin",
254    "query_status_reply.bin",
255    "register_schema_managed.bin",
256    "schema_def.json",
257    "session_ref.bin",
258    "start_policy_discriminants.bin",
259    "state_delta.bin",
260    "state_snapshot.bin",
261    "snapshot_page.json",
262    "source_ref_generation.bin",
263    "token_estimates.json",
264    "table_file_page.json",
265    "table_metrics.json",
266    "table_schema_view.json",
267    "table_view.json",
268    "query_target_discriminants.bin",
269    "typed_value_discriminants.bin",
270);
271
272/// Canonical bytes of one fixture by name, or `None` if the name is unknown.
273pub fn bytes(name: &str) -> Option<&'static [u8]> {
274    ALL.iter()
275        .find(|(fixture, _)| *fixture == name)
276        .map(|(_, bytes)| *bytes)
277}
278
279/// Assert that `encoded` matches the canonical fixture byte-for-byte.
280/// Panics with a diff-friendly message on drift.
281pub fn assert_matches(name: &str, encoded: &[u8]) {
282    let golden = bytes(name).unwrap_or_else(|| panic!("unknown fixture `{name}`"));
283    assert_eq!(
284        encoded, golden,
285        "fixture `{name}` drifted from the canonical frame"
286    );
287}
288
289/// Shared payload-codec semantics, consumed by native and TypeScript tests.
290pub const FILTER_CODEC_CASES: &str = include_str!("../fixtures/filter_codec_cases.json");
291
292#[cfg(test)]
293mod tests {
294    #[test]
295    fn given_the_corpus_when_looked_up_then_should_resolve_known_names() {
296        assert!(super::bytes("hello_reply.bin").is_some());
297        assert!(super::bytes("nope.bin").is_none());
298    }
299}