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_list_page.bin",
40    "agent_must_understand.bin",
41    "agent_presence.bin",
42    "agent_record.bin",
43    "agent_reply_error.bin",
44    "agent_reply_list_page.bin",
45    "agent_reply_status.bin",
46    "agent_response.bin",
47    "agent_submit.bin",
48    "agent_signature.bin",
49    "agent_status_card.bin",
50    "agent_status_run_metadata.bin",
51    "agent_status_task.bin",
52    "authz_bind_roles.bin",
53    "authz_get_role_reply.bin",
54    "authz_history_reply.bin",
55    "authz_history_request.bin",
56    "authz_role.bin",
57    "authz_whoami_reply.bin",
58    "arrow_ipc_metadata.bin",
59    "arrow_ipc_policy.bin",
60    "backend_announce.bin",
61    "backend_announce_topology.bin",
62    "backend_announce_unavailable.bin",
63    "batch_reply.bin",
64    "batch_request.bin",
65    "browse_projections.json",
66    "browse_reply_decoded.bin",
67    "browse_reply_projections.bin",
68    "browse_reply_schema_registered.bin",
69    "browse_reply_schemas.bin",
70    "browse_schemas.json",
71    "capabilities.json",
72    "change_record.bin",
73    "checkpoint_mutation_replicated.bin",
74    "checkpoint_public_mutation_discriminants.bin",
75    "checkpoint_reply_destination.bin",
76    "checkpoint_reply_query_route.bin",
77    "checkpoint_request_public.bin",
78    "client_metadata_list.bin",
79    "client_metadata_query.bin",
80    "producer_presence.bin",
81    "control_apply_binding.bin",
82    "control_filter_catalog.bin",
83    "control_drop_schema.bin",
84    "control_register_projection.bin",
85    "control_register_schema_avro.bin",
86    "control_register_schema_json.bin",
87    "control_register_schema_protobuf.bin",
88    "control_register_run_source.bin",
89    "control_remove_binding.bin",
90    "control_remove_run_source.bin",
91    "decode_record.bin",
92    "data_stack_string_discriminants.bin",
93    "destination_checkpoint_status.bin",
94    "destination_issue.json",
95    "destination_page.json",
96    "error_body.json",
97    "fold_snapshot.bin",
98    "filter_ack.bin",
99    "filter_ack_unfiltered.bin",
100    "filter_catalog_reply_bound.bin",
101    "filter_catalog_reply_configured.bin",
102    "filter_catalog_reply_registered.bin",
103    "filter_consumer_filter.bin",
104    "filter_consumer_filter.json",
105    "filter_eval_cases.json",
106    "filter_codec_cases.json",
107    "filter_mutation_register.bin",
108    "filter_mutation_register.json",
109    "filter_mutation_unbind_exact.bin",
110    "filter_mutation_unbind_exact.json",
111    "filter_poll_request.bin",
112    "filter_poll_request_group_id.bin",
113    "filter_reply_revision_disabled.bin",
114    "filter_mutation_revision_state.bin",
115    "filter_mutation_revision_state.json",
116    "filter_catalog_reply_revision_state.bin",
117    "filter_catalog_reply_revisions.bin",
118    "filter_catalog_reply_unbound.bin",
119    "filter_mutation_configure_group.bin",
120    "filter_mutation_configure_group.json",
121    "filter_poll_request_group_auto.bin",
122    "filter_reply_acknowledged.bin",
123    "filter_reply_error.bin",
124    "filter_reply_page.bin",
125    "filter_reply_page_unfiltered.bin",
126    "filter_validation.json",
127    "fork_create.bin",
128    "fork_info.json",
129    "fork_put.bin",
130    "fork_reply_created.bin",
131    "forwarded_command.bin",
132    "forwarded_query.bin",
133    "graph_edge.bin",
134    "graph_edge_conversation.bin",
135    "graph_edge_sourced.bin",
136    "graph_neighbors.bin",
137    "graph_neighbors_conversation.bin",
138    "graph_node.bin",
139    "graph_node_conversation.bin",
140    "graph_node_sourced.bin",
141    "graph_query.bin",
142    "graph_query_conversation.bin",
143    "graph_reply.bin",
144    "graph_upsert.bin",
145    "hello_reply.bin",
146    "hello_reply_agent.bin",
147    "hello_reply_features.bin",
148    "kv_cas.bin",
149    "kv_cas_fenced.bin",
150    "kv_copy.bin",
151    "kv_get_barriered.bin",
152    "kv_lease.bin",
153    "kv_lease_renew.bin",
154    "kv_move.bin",
155    "kv_namespaces.bin",
156    "kv_page_view.json",
157    "kv_release.bin",
158    "kv_reply_committed.bin",
159    "kv_reply_leased.bin",
160    "kv_reply_namespaces.bin",
161    "kv_reply_page.bin",
162    "kv_reply_renewed.bin",
163    "kv_reply_stale.bin",
164    "kv_reply_version_conflict.bin",
165    "kv_scan.bin",
166    "kv_set.bin",
167    "key_record.bin",
168    "logical_schema.bin",
169    "logical_type_discriminants.bin",
170    "managed_request.bin",
171    "materialization_destination.bin",
172    "mutation_command.bin",
173    "query_envelope.bin",
174    "query_envelope_aggregate.bin",
175    "query_envelope_raw_sql.bin",
176    "query_envelope_read_your_writes.bin",
177    "query_envelope_text.bin",
178    "query_error_discriminants.bin",
179    "query_cancel.bin",
180    "query_page.bin",
181    "query_reply_err_stale.bin",
182    "query_reply_err_too_large.bin",
183    "query_reply_ok.bin",
184    "query_execution.json",
185    "query_result.json",
186    "query_route.bin",
187    "query_route_page.json",
188    "query_status.bin",
189    "query_status_reply.bin",
190    "register_schema_managed.bin",
191    "schema_def.json",
192    "start_policy_discriminants.bin",
193    "snapshot_page.json",
194    "table_file_page.json",
195    "table_metrics.json",
196    "table_schema_view.json",
197    "table_view.json",
198    "query_target_discriminants.bin",
199    "typed_value_discriminants.bin",
200);
201
202/// Canonical bytes of one fixture by name, or `None` if the name is unknown.
203pub fn bytes(name: &str) -> Option<&'static [u8]> {
204    ALL.iter()
205        .find(|(fixture, _)| *fixture == name)
206        .map(|(_, bytes)| *bytes)
207}
208
209/// Assert that `encoded` matches the canonical fixture byte-for-byte.
210/// Panics with a diff-friendly message on drift.
211pub fn assert_matches(name: &str, encoded: &[u8]) {
212    let golden = bytes(name).unwrap_or_else(|| panic!("unknown fixture `{name}`"));
213    assert_eq!(
214        encoded, golden,
215        "fixture `{name}` drifted from the canonical frame"
216    );
217}
218
219/// Shared payload-codec semantics, consumed by native and TypeScript tests.
220pub const FILTER_CODEC_CASES: &str = include_str!("../fixtures/filter_codec_cases.json");
221
222#[cfg(test)]
223mod tests {
224    #[test]
225    fn given_the_corpus_when_looked_up_then_should_resolve_known_names() {
226        assert!(super::bytes("hello_reply.bin").is_some());
227        assert!(super::bytes("nope.bin").is_none());
228    }
229}