services_hardening_publication_execution_contract.rs (3162B)
1 #![forbid(unsafe_code)] 2 3 use serde_json::json; 4 5 const CONTRACT: &str = 6 include_str!("../contracts/services_hardening/publication_execution.v1.json"); 7 const SOURCE: &str = include_str!("../src/publication_execution.rs"); 8 const ROOT: &str = include_str!("../src/lib.rs"); 9 10 #[test] 11 fn execution_sequence_and_recovery_contract_are_exact() { 12 let contract: serde_json::Value = serde_json::from_str(CONTRACT).expect("contract JSON"); 13 assert_eq!(contract["schema"], "radroots.rhi.publication-execution"); 14 assert_eq!(contract["schema_version"], 1); 15 assert_eq!(contract["contract_version"], 1); 16 assert_eq!( 17 contract["claim"]["authority"], 18 "exact_current_required_authority_and_target_set" 19 ); 20 assert_eq!( 21 contract["attempt"]["prepare_sequence"], 22 json!([ 23 "revalidate_exact_unexpired_lease", 24 "validate_complete_immutable_target_inventory", 25 "select_first_due_target_by_ordinal", 26 "increment_attempt_and_persist_submitted", 27 "read_and_verify_exact_committed_event_bytes", 28 "return_sealed_exact_byte_capability" 29 ]) 30 ); 31 assert_eq!(contract["attempt"]["remote_io_outside_transaction"], true); 32 assert_eq!( 33 contract["retry"]["algorithm"], 34 "full_jitter_exponential_cap" 35 ); 36 assert_eq!( 37 contract["retry"]["retryable_outcomes"], 38 json!(["rate_limited", "failed", "unknown"]) 39 ); 40 assert_eq!( 41 contract["cancellation_and_recovery"]["lost_acknowledgement"], 42 "unknown_until_independent_evidence" 43 ); 44 assert_eq!(contract["exact_byte_sink"]["parse"], false); 45 assert_eq!(contract["exact_byte_sink"]["rebuild"], false); 46 assert_eq!(contract["exact_byte_sink"]["reserialize"], false); 47 assert_eq!(contract["exact_byte_sink"]["resign"], false); 48 } 49 50 #[test] 51 fn source_uses_only_the_sealed_sqlx_and_exact_byte_boundaries() { 52 for required in [ 53 "pub trait RhiExactPublicationSink: Send + Sync", 54 "pub const fn exact_signed_event_bytes(&self) -> &[u8]", 55 "PREPARE_TARGET_SQL", 56 "INSERT_ATTEMPT_SQL", 57 "UPDATE_TARGET_OUTCOME_SQL", 58 "UPDATE_OUTBOX_AFTER_ATTEMPT_SQL", 59 "UPDATE_OUTBOX_RECOVERY_SQL", 60 "read_committed(transaction, lease.outbox.id)", 61 "RhiPublicationAttemptOutcome::Unknown", 62 "sample_full_jitter(bound)", 63 "CommitOutcomeUnknown", 64 ] { 65 assert!( 66 SOURCE.contains(required), 67 "missing execution guard {required}" 68 ); 69 } 70 for forbidden in [ 71 "radroots_event_codec", 72 "Nip01EventWire", 73 "SignedEvent", 74 "DeliveryPayload", 75 "EventSink", 76 "serde_json", 77 "SystemTime", 78 "thread_rng", 79 "OsRng", 80 "tokio::spawn", 81 "SqliteConnection", 82 "SqlitePool", 83 "std::fs", 84 "std::net", 85 ] { 86 assert!( 87 !SOURCE.contains(forbidden), 88 "execution gained forbidden authority {forbidden}" 89 ); 90 } 91 assert!(ROOT.contains("mod publication_execution;")); 92 assert!(!ROOT.contains("pub mod publication_execution;")); 93 }