Skip to content

Commit 2e8d6e1

Browse files
committed
fix: started putting integration tests into on folder
1 parent 53c3b2a commit 2e8d6e1

File tree

13 files changed

+218
-242
lines changed

13 files changed

+218
-242
lines changed

src/api/metrics.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ lazy_static! {
2828
.unwrap();
2929
}
3030

31-
pub(super) enum MetricsConfig {
31+
pub(crate) enum MetricsConfig {
3232
Borrowed(&'static str),
3333
Owned(FullPath),
3434
}
@@ -69,6 +69,7 @@ where
6969
type Output = O;
7070
}
7171

72+
//todo: fix this
7273
fn hihi<I>(
7374
http_req_histogram: &'static HistogramVec,
7475
http_status_counter: &'static IntCounterVec,
@@ -116,7 +117,7 @@ where
116117
}
117118
}
118119

119-
pub(super) fn metrics_wrapper<F>(
120+
pub(crate) fn metrics_wrapper<F>(
120121
filter: F,
121122
) -> impl Filter<Extract = (WarpResponse,), Error = Rejection> + Clone + Send + 'static
122123
where
@@ -168,7 +169,7 @@ fn metrics_handler() -> WarpResponse {
168169

169170
const METRICS_PATH: &str = "metrics";
170171

171-
pub(super) fn metrics(
172+
pub(crate) fn metrics(
172173
) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone + Send + 'static {
173174
warp::path(METRICS_PATH)
174175
.and(warp::get())

src/api/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::facade::{CertFacade, DomainFacade};
2020
mod metrics;
2121
mod proxy;
2222
mod routes;
23-
mod tls;
23+
pub mod tls;
2424

2525
lazy_static! {
2626
static ref TCP_TOTAL_CONNECTION_COUNTER: IntCounterVec = register_int_counter_vec!(
@@ -81,7 +81,7 @@ where
8181
}
8282
}
8383

84-
pub async fn new<F>(
84+
pub(crate) async fn new<F>(
8585
(http, http_proxy): Listener,
8686
(https, https_proxy): Listener,
8787
(prom, prom_proxy): Listener,

src/api/proxy.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl<T: RemoteAddr> RemoteAddr for ProxyStream<T> {
3232
}
3333
}
3434

35-
pub(super) fn wrap(
35+
pub(crate) fn wrap(
3636
listener: TcpListener,
3737
proxy: ProxyProtocol,
3838
) -> impl Stream<
@@ -84,7 +84,7 @@ where
8484
}
8585
}
8686

87-
pub(super) struct ProxyStream<T> {
87+
struct ProxyStream<T> {
8888
stream: T,
8989
data: Option<Vec<u8>>,
9090
start_of_data: usize,

src/api/routes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ async fn update_handler<F>(
5050
const REGISTER_PATH: &str = "register";
5151
const UPDATE_PATH: &str = "update";
5252

53-
pub(super) fn routes<F>(
53+
pub(crate) fn routes<F>(
5454
facade: F,
5555
) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone + Send + 'static
5656
where

src/api/tls.rs

Lines changed: 1 addition & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use tracing::{error, info};
1313
use crate::facade::{Cert, CertFacade};
1414
use crate::util::to_u64;
1515

16-
pub(super) fn wrap<L, I, S, F>(
16+
pub fn wrap<L, I, S, F>(
1717
listener: L,
1818
facade: F,
1919
) -> impl Stream<
@@ -102,72 +102,3 @@ impl<F: CertFacade> Acceptor<F> {
102102
Ok(TlsAcceptor::from(server_config))
103103
}
104104
}
105-
106-
#[cfg(test)]
107-
mod tests {
108-
use futures_util::{future, stream, StreamExt};
109-
use rustls::{
110-
Certificate, ClientConfig, RootCertStore, ServerCertVerified, ServerCertVerifier, TLSError,
111-
};
112-
use std::sync::Arc;
113-
use tokio::io::{AsyncReadExt, AsyncWriteExt};
114-
use tokio::net::{TcpListener, TcpStream};
115-
use tokio_rustls::webpki::DNSNameRef;
116-
use tokio_rustls::TlsConnector;
117-
118-
use super::wrap;
119-
use crate::facade::tests::TestFacade;
120-
121-
struct TestVerifier;
122-
123-
impl ServerCertVerifier for TestVerifier {
124-
fn verify_server_cert(
125-
&self,
126-
_roots: &RootCertStore,
127-
presented_certs: &[Certificate],
128-
dns_name: DNSNameRef<'_>,
129-
_ocsp_response: &[u8],
130-
) -> Result<ServerCertVerified, TLSError> {
131-
let domain = DNSNameRef::try_from_ascii_str("acme-dns-rust.com")
132-
.unwrap()
133-
.to_owned();
134-
assert_eq!(domain, dns_name.to_owned());
135-
assert!(presented_certs.first().is_some());
136-
Ok(ServerCertVerified::assertion())
137-
}
138-
}
139-
140-
#[tokio::test]
141-
async fn test() {
142-
let server = TcpListener::bind("127.0.0.1:0").await.unwrap();
143-
let addr = server.local_addr().unwrap();
144-
145-
let server_future = tokio::spawn(async move {
146-
let server = server.accept().await.unwrap().0;
147-
let server = stream::iter(vec![Ok(future::ready(Ok(server)))]);
148-
let mut acceptor = wrap(server, TestFacade::default());
149-
150-
let mut conn = acceptor.next().await.unwrap().unwrap().await.unwrap();
151-
let mut actual = String::new();
152-
conn.read_to_string(&mut actual).await.unwrap();
153-
assert_eq!("Test", actual);
154-
});
155-
156-
let client_future = tokio::spawn(async move {
157-
let client = TcpStream::connect(addr).await.unwrap();
158-
let mut client_config = ClientConfig::new();
159-
client_config
160-
.dangerous()
161-
.set_certificate_verifier(Arc::new(TestVerifier {}));
162-
163-
let connector = TlsConnector::from(Arc::new(client_config));
164-
165-
let domain = DNSNameRef::try_from_ascii_str("acme-dns-rust.com").unwrap();
166-
let mut conn = connector.connect(domain, client).await.unwrap();
167-
conn.write_all("Test".as_ref()).await.unwrap();
168-
conn.write(&[]).await.unwrap();
169-
});
170-
171-
tokio::try_join!(server_future, client_future).unwrap();
172-
}
173-
}

src/facade/cert.rs

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use tracing::info;
66
use uuid::Uuid;
77

88
use super::domain::{Domain, DomainFacadeInternal};
9-
use super::DatabaseFacade;
9+
use super::{DatabaseFacade, InMemoryFacade};
1010
use crate::util::{now, to_i64, HOUR};
1111

1212
#[derive(sqlx::Type, Debug, PartialEq, Clone)]
@@ -18,9 +18,9 @@ pub enum State {
1818

1919
#[derive(FromRow, Debug, Clone)]
2020
pub struct Cert {
21-
pub(crate) id: String,
22-
pub(crate) update: i64,
23-
pub(crate) state: State,
21+
pub id: String,
22+
pub update: i64,
23+
pub state: State,
2424
pub cert: Option<String>,
2525
pub private: Option<String>,
2626
#[sqlx(rename = "domain_id")]
@@ -194,40 +194,31 @@ impl CertFacade for DatabaseFacade<Postgres> {
194194
}
195195
}
196196

197-
#[cfg(test)]
198-
mod tests {
199-
use anyhow::Result;
200-
use async_trait::async_trait;
201-
202-
use super::super::tests::TestFacade;
203-
use super::{Cert, CertFacade};
204-
205-
#[async_trait]
206-
impl CertFacade for TestFacade {
207-
async fn first_cert(&self) -> Result<Option<Cert>, sqlx::Error> {
208-
let certs = self.certs.lock();
209-
Ok(certs.values().next().map(Clone::clone))
210-
}
197+
#[async_trait]
198+
impl CertFacade for InMemoryFacade {
199+
async fn first_cert(&self) -> Result<Option<Cert>, sqlx::Error> {
200+
let certs = self.certs.lock();
201+
Ok(certs.values().next().map(Clone::clone))
202+
}
211203

212-
async fn update_cert(&self, cert: &Cert) -> Result<(), sqlx::Error> {
213-
let mut certs = self.certs.lock();
214-
*certs.get_mut(&cert.id).unwrap() = cert.clone();
204+
async fn update_cert(&self, cert: &Cert) -> Result<(), sqlx::Error> {
205+
let mut certs = self.certs.lock();
206+
*certs.get_mut(&cert.id).unwrap() = cert.clone();
215207

216-
Ok(())
217-
}
208+
Ok(())
209+
}
218210

219-
async fn create_cert(&self, cert: &Cert) -> Result<(), sqlx::Error> {
220-
self.certs.lock().insert(cert.id.clone(), cert.clone());
211+
async fn create_cert(&self, cert: &Cert) -> Result<(), sqlx::Error> {
212+
self.certs.lock().insert(cert.id.clone(), cert.clone());
221213

222-
Ok(())
223-
}
214+
Ok(())
215+
}
224216

225-
async fn start_cert(&self) -> Result<Option<Cert>> {
226-
unimplemented!()
227-
}
217+
async fn start_cert(&self) -> Result<Option<Cert>> {
218+
unimplemented!()
219+
}
228220

229-
async fn stop_cert(&self, _memory_cert: &mut Cert) -> Result<(), sqlx::Error> {
230-
unimplemented!()
231-
}
221+
async fn stop_cert(&self, _memory_cert: &mut Cert) -> Result<(), sqlx::Error> {
222+
unimplemented!()
232223
}
233224
}

src/facade/mod.rs

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ mod domain;
55

66
pub use cert::{Cert, CertFacade, State};
77
pub use domain::{Domain, DomainDTO, DomainFacade};
8+
use parking_lot::Mutex;
9+
use std::collections::HashMap;
10+
use std::sync::Arc;
811

912
#[derive(Debug)]
10-
pub(super) struct DatabaseFacade<DB: Database> {
13+
pub struct DatabaseFacade<DB: Database> {
1114
pool: Pool<DB>,
1215
}
1316

@@ -25,43 +28,8 @@ impl From<PgPool> for DatabaseFacade<Postgres> {
2528
}
2629
}
2730

28-
#[cfg(test)]
29-
pub(super) mod tests {
30-
use parking_lot::Mutex;
31-
use std::collections::HashMap;
32-
use std::fs::read_to_string;
33-
use std::path::Path;
34-
use std::sync::Arc;
35-
36-
use super::{Cert, State};
37-
use crate::util::{now, to_i64};
38-
39-
#[derive(Clone)]
40-
pub struct TestFacade {
41-
pub certs: Arc<Mutex<HashMap<String, Cert>>>,
42-
//domains: Mutex<HashMap<String, Domain>>,
43-
}
44-
45-
impl Default for TestFacade {
46-
fn default() -> Self {
47-
let cert = read_to_string(Path::new(file!()).with_file_name("cert.crt"));
48-
let private = read_to_string(Path::new(file!()).with_file_name("key.key"));
49-
50-
let cert = Cert {
51-
id: "1".to_owned(),
52-
update: to_i64(&now()),
53-
state: State::Ok,
54-
cert: Some(cert.unwrap()),
55-
private: Some(private.unwrap()),
56-
domain: "acme-dns-rust.com".to_owned(),
57-
};
58-
59-
let mut certs = HashMap::new();
60-
certs.insert("1".to_owned(), cert);
61-
62-
TestFacade {
63-
certs: Arc::new(Mutex::new(certs)),
64-
}
65-
}
66-
}
31+
#[derive(Clone, Default)]
32+
pub struct InMemoryFacade {
33+
certs: Arc<Mutex<HashMap<String, Cert>>>,
34+
//domains: Mutex<HashMap<String, Domain>>,
6735
}

src/lib.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
use anyhow::Result;
2+
use futures_util::TryFutureExt;
3+
use sqlx::migrate::Migrator;
4+
use sqlx::postgres::{PgConnectOptions, PgPoolOptions};
5+
use sqlx::PgPool;
6+
use std::env;
7+
use std::str::FromStr;
8+
use std::sync::Arc;
9+
use tokio::runtime::Runtime;
10+
use tokio::signal::ctrl_c;
11+
use tracing::{debug, info, Instrument};
12+
13+
use acme::DatabasePersist;
14+
use cert::CertManager;
15+
use dns::{DatabaseAuthority, DNS};
16+
use facade::DatabaseFacade;
17+
18+
mod acme;
19+
pub mod api;
20+
mod cert;
21+
mod config;
22+
mod dns;
23+
pub mod facade;
24+
pub mod util;
25+
26+
static MIGRATOR: Migrator = sqlx::migrate!("migrations/postgres");
27+
28+
#[tracing::instrument(err)]
29+
pub fn run() -> Result<()> {
30+
let config_path = env::args().nth(1);
31+
let config = config::load_config(config_path)?;
32+
33+
let runtime = Arc::new(Runtime::new()?);
34+
debug!("Created runtime");
35+
36+
// Async closure cannot be move, if runtime gets moved into it
37+
// it gets dropped inside an async call
38+
let fut = async {
39+
debug!("Running in runtime");
40+
41+
let pool = setup_database(&config.general.db).await?;
42+
let facade = DatabaseFacade::from(pool.clone());
43+
let authority =
44+
DatabaseAuthority::new(facade.clone(), &config.general.name, config.records);
45+
let dns = DNS::new(&config.general.dns, authority);
46+
47+
let api = &config.api;
48+
let api = api::new(
49+
api.http.clone(),
50+
api.https.clone(),
51+
api.prom.clone(),
52+
facade.clone(),
53+
);
54+
55+
let persist = DatabasePersist::new(pool, &runtime);
56+
let cert_manager = CertManager::new(facade, persist, config.general.acme, &runtime)
57+
.and_then(CertManager::spawn);
58+
59+
info!("Starting API Cert Manager and DNS");
60+
tokio::select! {
61+
res = api => res,
62+
res = cert_manager => res,
63+
res = dns.spawn() => res,
64+
res = ctrl_c() => {
65+
res?;
66+
info!("Ctrl C pressed");
67+
Ok(())
68+
}
69+
}
70+
};
71+
72+
runtime.block_on(fut.in_current_span())
73+
}
74+
75+
#[tracing::instrument(skip(db))]
76+
async fn setup_database(db: &str) -> Result<PgPool, sqlx::Error> {
77+
debug!("Starting DB Setup");
78+
let options = PgConnectOptions::from_str(db)?;
79+
let pool = PgPoolOptions::new()
80+
.max_connections(5)
81+
.connect_with(options)
82+
.await?;
83+
debug!(?pool, "Created DB pool");
84+
85+
MIGRATOR.run(&pool).await?;
86+
info!("Ran migration");
87+
Ok(pool)
88+
}

0 commit comments

Comments
 (0)