conformance.rs (3174B)
1 use core::fmt::Debug; 2 use radroots_transport::{EventSink, EventSource, EventSubscriber}; 3 use radroots_transport_nostr::{Config, Error, NostrTransport, RelayUrl, RelayUrlPolicy}; 4 5 const MANIFEST: &str = include_str!("../Cargo.toml"); 6 const ROOT: &str = include_str!("../src/lib.rs"); 7 const AUTH: &str = include_str!("../src/auth.rs"); 8 const RELAY: &str = include_str!("../src/relay.rs"); 9 const SINK: &str = include_str!("../src/sink.rs"); 10 const SOURCE: &str = include_str!("../src/source.rs"); 11 const STATUS: &str = include_str!("../src/status.rs"); 12 const SUBSCRIPTION: &str = include_str!("../src/subscription.rs"); 13 14 fn assert_adapter_contract<T>() 15 where 16 T: EventSource + EventSubscriber + EventSink + Clone + Debug + Send + Sync, 17 { 18 } 19 20 fn assert_public_value<T>() 21 where 22 T: Clone + Debug + Send + Sync, 23 { 24 } 25 26 #[test] 27 fn public_types_and_split_spis_satisfy_the_adapter_contract() { 28 assert_adapter_contract::<NostrTransport>(); 29 assert_public_value::<Config>(); 30 assert_public_value::<RelayUrl>(); 31 assert_public_value::<RelayUrlPolicy>(); 32 assert_public_value::<Error>(); 33 } 34 35 #[test] 36 fn root_and_manifest_expose_no_traits_features_or_ambient_runtime() { 37 assert!(!MANIFEST.contains("[features]")); 38 assert!(MANIFEST.contains("publish = [\"crates-io\"]")); 39 for forbidden in [ 40 "pub trait ", 41 "pub mod ", 42 "tokio::runtime", 43 "tracing_subscriber", 44 "radroots_event_store", 45 "radroots_outbox", 46 "radroots_storage", 47 "radroots_sync", 48 ] { 49 assert!( 50 !ROOT.contains(forbidden), 51 "forbidden root witness `{forbidden}`" 52 ); 53 assert!( 54 !MANIFEST.contains(forbidden), 55 "forbidden manifest witness `{forbidden}`" 56 ); 57 } 58 } 59 60 #[test] 61 fn complete_mocked_conformance_matrix_remains_reachable() { 62 let witnesses = [ 63 (AUTH, "challenge_response_is_exact_bounded_and_single_use"), 64 ( 65 AUTH, 66 "wrong_relay_timeout_rejection_and_no_signer_fail_closed", 67 ), 68 (RELAY, "address_policies_fail_closed_for_special_use_ranges"), 69 (SINK, "sink_returns_normalized_per_relay_partial_success"), 70 (SINK, "expired_delivery_deadline_performs_no_relay_work"), 71 (SINK, "dropping_an_unpolled_delivery_performs_no_relay_work"), 72 ( 73 SOURCE, 74 "source_deduplicates_relays_reports_malformed_and_paginates", 75 ), 76 (SOURCE, "dropping_an_unpolled_fetch_performs_no_relay_work"), 77 ( 78 SUBSCRIPTION, 79 "reconnect_checkpoint_is_equal_timestamp_safe_and_request_bound", 80 ), 81 ( 82 SUBSCRIPTION, 83 "dropping_pending_next_requests_cancellation_on_the_next_call", 84 ), 85 ( 86 SUBSCRIPTION, 87 "dropping_an_unpolled_subscription_start_performs_no_backend_work", 88 ), 89 ( 90 STATUS, 91 "every_upstream_class_maps_to_stable_secret_safe_output", 92 ), 93 ]; 94 for (source, witness) in witnesses { 95 assert!( 96 source.contains(witness), 97 "missing conformance witness `{witness}`" 98 ); 99 } 100 }