lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

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 }