iroh_relay/server/
testing.rs

1//! Exposes functions to quickly configure a server suitable for testing.
2use std::net::Ipv4Addr;
3
4use super::{AccessConfig, 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        server_config,
44        cert: CertConfig::<(), ()>::Manual { certs },
45        https_bind_addr: (Ipv4Addr::LOCALHOST, 0).into(),
46        quic_bind_addr: (Ipv4Addr::UNSPECIFIED, 0).into(),
47    }
48}
49
50/// Creates a [`RelayConfig`] suitable for testing.
51///
52/// - Binds http to an OS assigned port on ipv4.
53/// - Uses [`tls_config`] to enable TLS.
54/// - Uses default limits.
55pub fn relay_config() -> RelayConfig<()> {
56    RelayConfig {
57        http_bind_addr: (Ipv4Addr::LOCALHOST, 0).into(),
58        tls: Some(tls_config()),
59        limits: Default::default(),
60        key_cache_capacity: Some(1024),
61        access: AccessConfig::Everyone,
62    }
63}
64
65/// Creates a [`QuicConfig`] suitable for testing.
66///
67/// - Binds to an OS assigned port on ipv4
68/// - Uses [`self_signed_tls_certs_and_config`] to create tls certificates
69pub fn quic_config() -> QuicConfig {
70    let (_, server_config) = self_signed_tls_certs_and_config();
71    QuicConfig {
72        bind_addr: (Ipv4Addr::UNSPECIFIED, 0).into(),
73        server_config,
74    }
75}
76
77/// Creates a [`ServerConfig`] suitable for testing.
78///
79/// - Relaying is enabled using [`relay_config`]
80/// - QUIC addr discovery is disabled.
81/// - Metrics are not enabled.
82pub fn server_config() -> ServerConfig<()> {
83    ServerConfig {
84        relay: Some(relay_config()),
85        quic: Some(quic_config()),
86        #[cfg(feature = "metrics")]
87        metrics_addr: None,
88    }
89}