tangle


git clone https://radroots.dev/git/tangle.git
Log | Files | Refs | README | LICENSE

commit f575f841de2472e066e81edc38ade9efb00fef71
parent 0d9f24ce00ed2367ab8fcf1674cd3ce4740ebc21
Author: triesap <tyson@radroots.org>
Date:   Sun, 14 Jun 2026 09:04:07 -0700

tests: add protocol stress coverage

Diffstat:
Mcrates/tangle_protocol/src/lib.rs | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcrates/tangle_runtime/src/relay/core.rs | 2+-
2 files changed, 87 insertions(+), 1 deletion(-)

diff --git a/crates/tangle_protocol/src/lib.rs b/crates/tangle_protocol/src/lib.rs @@ -1675,6 +1675,92 @@ mod tests { } #[test] + fn protocol_conformance_fixtures_cover_dense_envelopes_and_parser_stress() { + let event_payload = event_json( + "a", + "b", + 30_023, + r#"[["e","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","wss://relay.example","root"],["e","bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"],["p","2222222222222222222222222222222222222222222222222222222222222222"],["h","Farm"],["emoji","🌱"]]"#, + ); + let parsed_event = + parse_client_message(&format!("[\"EVENT\",{event_payload}]")).expect("event envelope"); + let ClientMessage::Event(event) = parsed_event else { + panic!("expected event") + }; + assert_eq!(event.unsigned().kind().as_u32(), 30_023); + assert_eq!(event.unsigned().tags().len(), 5); + + let req = serde_json::json!([ + "REQ", + "sub-dense", + { + "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], + "authors": ["1111111111111111111111111111111111111111111111111111111111111111"], + "kinds": [1, 30023], + "#e": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"], + "#p": ["2222222222222222222222222222222222222222222222222222222222222222"], + "#h": ["Farm"], + "since": 0, + "until": 4102444800_u64, + "limit": 500, + "search": "radroots" + }, + { + "#t": ["radroots", "market", "farm"], + "limit": 1 + } + ]) + .to_string(); + let ClientMessage::Req { + subscription_id, + filters, + } = parse_client_message(&req).expect("req") + else { + panic!("expected req") + }; + assert_eq!(subscription_id.as_str(), "sub-dense"); + assert_eq!(filters.len(), 2); + assert_eq!(filters[0].kinds().len(), 2); + assert_eq!(filters[0].tag_filters().len(), 3); + assert_eq!(filters[1].limit(), Some(1)); + + let count = serde_json::json!([ + "COUNT", + "sub-count", + {"#h": ["Farm"], "kinds": [1], "limit": 1} + ]) + .to_string(); + let ClientMessage::Count { + subscription_id, + filters, + } = parse_client_message(&count).expect("count") + else { + panic!("expected count") + }; + assert_eq!(subscription_id.as_str(), "sub-count"); + assert_eq!(filters.len(), 1); + assert_eq!(filters[0].limit(), Some(1)); + + for raw in [ + "", + "[", + "[\"REQ\",\"sub\",{}", + "[\"REQ\",\"sub\",{\"#h\":[{}]}]", + "[\"REQ\",\"sub\",{\"ids\":[\"short\"]}]", + "[\"COUNT\",\"sub\",{\"kinds\":[4294967296]}]", + "[\"COUNT\",1,{}]", + "[\"EVENT\",{\"tags\":[[1]]}]", + "[\"AUTH\",{\"kind\":\"bad\"}]", + "[\"CLOSE\",\"\"]", + ] { + std::panic::catch_unwind(|| { + assert!(parse_client_message(raw).is_err()); + }) + .expect("parser must not panic"); + } + } + + #[test] fn parse_client_message_rejects_malformed_envelopes() { assert!( parse_client_message("{") diff --git a/crates/tangle_runtime/src/relay/core.rs b/crates/tangle_runtime/src/relay/core.rs @@ -2132,7 +2132,7 @@ mod tests { #[test] fn base_relay_enforces_event_and_filter_runtime_limits() { - let config = test_store_config("base-relay-runtime-limits"); + let config = test_store_config("base-relay-event-filter-runtime-limits"); let mut relay = BaseRelay::open(&config, strict_relay_limits()).expect("relay"); let first = signed_public_event(7, 1, Vec::new(), "a"); let second = signed_event_at(8, 1, Vec::new(), "b", 1_714_124_434);