iroh_relay/server/
testing.rs

1//! Exposes functions to quickly configure a server suitable for testing.
2use std::{net::Ipv4Addr, sync::Arc};
3
4use super::{AllowAll, CertConfig, QuicConfig, RelayConfig, ServerConfig, TlsConfig};
5
6/// Creates a [`rustls::ServerConfig`] and certificates suitable for testing.
7///
8/// - Uses a self signed certificate valid for the `"localhost"` and `"127.0.0.1"` domains.
9pub fn self_signed_tls_certs_and_config() -> (
10    Vec<rustls::pki_types::CertificateDer<'static>>,
11    rustls::ServerConfig,
12) {
13    let cert = rcgen::generate_simple_self_signed(vec![
14        "localhost".to_string(),
15        "127.0.0.1".to_string(),
16        "::1".to_string(),
17    ])
18    .expect("valid");
19    let rustls_cert = cert.cert.der();
20    let private_key = rustls::pki_types::PrivatePkcs8KeyDer::from(cert.signing_key.serialize_der());
21    let private_key = rustls::pki_types::PrivateKeyDer::from(private_key);
22    let certs = vec![rustls_cert.clone()];
23    let server_config = rustls::ServerConfig::builder_with_provider(std::sync::Arc::new(
24        rustls::crypto::ring::default_provider(),
25    ))
26    .with_safe_default_protocol_versions()
27    .expect("protocols supported by ring")
28    .with_no_client_auth();
29
30    let server_config = server_config
31        .with_single_cert(certs.clone(), private_key)
32        .expect("valid");
33    (certs, server_config)
34}
35
36/// Creates a [`TlsConfig`] suitable for testing.
37///
38/// - Uses a self signed certificate valid for the `"localhost"` and `"127.0.0.1"` domains.
39/// - Configures https to be served on an OS assigned port on ipv4.
40pub fn tls_config() -> TlsConfig {
41    let (_certs, server_config) = self_signed_tls_certs_and_config();
42    TlsConfig {
43        cert: CertConfig::Manual { server_config },
44        https_bind_addr: (Ipv4Addr::LOCALHOST, 0).into(),
45    }
46}
47
48/// Creates a [`RelayConfig`] suitable for testing.
49///
50/// - Binds http to an OS assigned port on ipv4.
51/// - Uses [`tls_config`] to enable TLS.
52/// - Uses default limits.
53pub fn relay_config() -> RelayConfig {
54    RelayConfig {
55        http_bind_addr: (Ipv4Addr::LOCALHOST, 0).into(),
56        tls: Some(tls_config()),
57        limits: Default::default(),
58        key_cache_capacity: Some(1024),
59        access: Arc::new(AllowAll),
60    }
61}
62
63/// Creates a [`QuicConfig`] suitable for testing.
64///
65/// - Binds to an OS assigned port on ipv4
66/// - Uses [`self_signed_tls_certs_and_config`] to create tls certificates
67pub fn quic_config() -> QuicConfig {
68    let (_, server_config) = self_signed_tls_certs_and_config();
69    QuicConfig {
70        bind_addr: (Ipv4Addr::UNSPECIFIED, 0).into(),
71        server_config: Some(server_config),
72    }
73}
74
75/// Creates a [`ServerConfig`] suitable for testing.
76///
77/// - Relaying is enabled using [`relay_config`]
78/// - QUIC addr discovery is disabled.
79/// - Metrics are not enabled.
80pub fn server_config() -> ServerConfig {
81    ServerConfig {
82        relay: Some(relay_config()),
83        quic: Some(quic_config()),
84        #[cfg(feature = "metrics")]
85        metrics_addr: None,
86    }
87}