This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / knot2 / crates / knot-runtime / src / lib.rs
2.6 kB 85 lines
1mod clock; 2mod dns; 3mod entropy; 4mod http; 5mod signer; 6 7pub use clock::{Clock, ManualClock, SystemClock, UnixMicros}; 8pub use dns::{DnsFuture, DnsTxtResolver, FakeDns, SystemDns}; 9pub use entropy::{Entropy, OsEntropy, SeededEntropy}; 10pub use http::{ 11 ByteStream, FakeHttp, HttpFuture, HttpLimits, HttpRequest, HttpResponse, HttpTransport, 12 NetworkError, ReqwestHttp, StreamFuture, StreamedResponse, is_blocked_ip, 13}; 14pub use signer::{ 15 K256Signer, MAX_SCALAR_ATTEMPTS, PublicKeyBytes, Signature, SignatureScheme, Signer, 16 SignerError, verify, 17}; 18 19#[cfg(test)] 20mod contract { 21 use super::*; 22 23 fn clock_contract(clock: &dyn Clock) { 24 let first = clock.now_unix_micros(); 25 let second = clock.now_unix_micros(); 26 assert!(second >= first); 27 } 28 29 #[test] 30 fn every_clock_is_non_decreasing() { 31 clock_contract(&SystemClock); 32 clock_contract(&ManualClock::new(UnixMicros::new(1_000))); 33 } 34 35 fn entropy_contract(entropy: &dyn Entropy) { 36 let mut buffer = [0u8; 16]; 37 entropy.fill(&mut buffer); 38 assert!(buffer.iter().any(|byte| *byte != 0)); 39 entropy.fill(&mut []); 40 let _ = entropy.next_u64(); 41 } 42 43 #[test] 44 fn every_entropy_produces_output() { 45 entropy_contract(&OsEntropy); 46 entropy_contract(&SeededEntropy::new(1)); 47 } 48 49 fn signer_contract(signer: &dyn Signer) { 50 let signature = signer.sign(b"the message"); 51 assert!(verify(&signer.public_key(), b"the message", &signature)); 52 assert!(!verify( 53 &signer.public_key(), 54 b"another message", 55 &signature 56 )); 57 } 58 59 #[test] 60 fn the_seeded_signer_is_the_test_double() { 61 signer_contract(&K256Signer::generate(&SeededEntropy::new(3))); 62 } 63 64 fn ok_response() -> HttpResponse { 65 HttpResponse { 66 status: ::http::StatusCode::OK, 67 headers: ::http::HeaderMap::new(), 68 body: bytes::Bytes::from_static(b"ok"), 69 } 70 } 71 72 #[test] 73 fn http_transport_surfaces_ok_and_typed_error() { 74 let url = url::Url::parse("https://oyster.cafe/").unwrap(); 75 let okay = FakeHttp::new(|_| Ok(ok_response())); 76 let response = 77 futures::executor::block_on(okay.execute(HttpRequest::get(url.clone()))).unwrap(); 78 assert_eq!(response.body.as_ref(), b"ok"); 79 80 let failing = FakeHttp::new(|_| Err(NetworkError::Timeout("slow".to_string()))); 81 let error = 82 futures::executor::block_on(failing.execute(HttpRequest::get(url))).unwrap_err(); 83 assert!(matches!(error, NetworkError::Timeout(_))); 84 } 85}