mod common;
use std::fs;
use std::io;
use std::net::SocketAddr;
use std::path::Path;
use futures::future::Either;
use rand::rngs::StdRng;
use rand::Rng;
use rand::SeedableRng;
use rudolfs::S3ServerBuilder;
use serde::{Deserialize, Serialize};
use tokio::sync::oneshot;
use common::{init_logger, GitRepo, SERVER_ADDR};
#[derive(Debug, Serialize, Deserialize)]
struct Credentials {
access_key_id: String,
secret_access_key: String,
default_region: String,
bucket: String,
}
fn load_s3_credentials() -> io::Result<Credentials> {
let config = fs::read("tests/.test_credentials.toml")?;
let creds: Credentials = toml::from_slice(&config)?;
std::env::set_var("AWS_ACCESS_KEY_ID", &creds.access_key_id);
std::env::set_var("AWS_SECRET_ACCESS_KEY", &creds.secret_access_key);
std::env::set_var("AWS_DEFAULT_REGION", &creds.default_region);
Ok(creds)
}
#[tokio::test(flavor = "multi_thread")]
async fn s3_smoke_test_encrypted() -> Result<(), Box<dyn std::error::Error>> {
let _guard = init_logger();
let creds = match load_s3_credentials() {
Ok(creds) => creds,
Err(err) => {
eprintln!("Skipping test. No S3 credentials available: {}", err);
return Ok(());
}
};
let mut rng = StdRng::seed_from_u64(42);
let key = rng.gen();
let mut server = S3ServerBuilder::new(creds.bucket);
server.key(key);
server.prefix("test_lfs".into());
let server = server.spawn(SERVER_ADDR).await?;
let addr = server.addr();
let (shutdown_tx, shutdown_rx) = oneshot::channel();
let server = tokio::spawn(futures::future::select(shutdown_rx, server));
exercise_server(addr, &mut rng)?;
shutdown_tx.send(()).expect("server died too soon");
if let Either::Right((result, _)) = server.await.unwrap() {
result.expect("server failed unexpectedly");
}
Ok(())
}
#[tokio::test(flavor = "multi_thread")]
async fn s3_smoke_test_unencrypted() -> Result<(), Box<dyn std::error::Error>> {
let _guard = init_logger();
let creds = match load_s3_credentials() {
Ok(creds) => creds,
Err(err) => {
eprintln!("Skipping test. No S3 credentials available: {}", err);
return Ok(());
}
};
let mut rng = StdRng::seed_from_u64(42);
let mut server = S3ServerBuilder::new(creds.bucket);
server.prefix("test_lfs".into());
let server = server.spawn(SERVER_ADDR).await?;
let addr = server.addr();
let (shutdown_tx, shutdown_rx) = oneshot::channel();
let server = tokio::spawn(futures::future::select(shutdown_rx, server));
exercise_server(addr, &mut rng)?;
shutdown_tx.send(()).expect("server died too soon");
if let Either::Right((result, _)) = server.await.unwrap() {
result.expect("server failed unexpectedly");
}
Ok(())
}
fn exercise_server(addr: SocketAddr, rng: &mut impl Rng) -> io::Result<()> {
let repo = GitRepo::init(addr)?;
repo.add_random(Path::new("4mb.bin"), 4 * 1024 * 1024, rng)?;
repo.add_random(Path::new("8mb.bin"), 8 * 1024 * 1024, rng)?;
repo.add_random(Path::new("16mb.bin"), 16 * 1024 * 1024, rng)?;
repo.commit("Add LFS objects")?;
repo.lfs_push().unwrap();
repo.clean_lfs().unwrap();
repo.lfs_pull().unwrap();
repo.lfs_push().unwrap();
Ok(())
}