Add integration tests

This commit is contained in:
Silas Brack 2026-03-07 10:17:52 +01:00
parent d7c9192ebb
commit 68ae92e4bf
6 changed files with 392 additions and 83 deletions

69
src/lib.rs Normal file
View file

@ -0,0 +1,69 @@
pub mod config;
pub mod db;
pub mod error;
pub mod hasher;
pub mod health;
pub mod server;
pub mod volume;
use std::collections::HashSet;
use std::sync::Arc;
use tokio::sync::RwLock;
/// Build the axum Router with all state wired up. Returns the router and
/// a handle to the writer (caller must keep it alive).
pub async fn build_app(config: config::Config) -> axum::Router {
let db_path = &config.database.path;
if let Some(parent) = std::path::Path::new(db_path).parent() {
std::fs::create_dir_all(parent).unwrap_or_else(|e| {
eprintln!("Failed to create database directory: {e}");
std::process::exit(1);
});
}
let (writer, ready_rx) = db::spawn_writer(db_path.to_string());
ready_rx.await.expect("writer failed to initialize");
let num_readers = std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(4);
let reads = db::ReadPool::new(db_path, num_readers);
let volume_urls = config.volume_urls();
let ring = Arc::new(RwLock::new(hasher::Ring::new(
&volume_urls,
config.server.virtual_nodes,
)));
let volume_client = volume::VolumeClient::new();
let healthy_volumes: health::HealthyVolumes =
Arc::new(RwLock::new(HashSet::from_iter(volume_urls.clone())));
health::spawn_health_checker(
volume_client.clone(),
volume_urls,
healthy_volumes.clone(),
);
let state = server::AppState {
writer,
reads,
ring,
volume_client,
healthy_volumes,
config: Arc::new(config),
};
axum::Router::new()
.route("/", axum::routing::get(server::list_keys))
.route(
"/{*key}",
axum::routing::get(server::get_key)
.put(server::put_key)
.delete(server::delete_key)
.head(server::head_key),
)
.with_state(state)
}