This repository has no description
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}