run tests in parallel

This commit is contained in:
Felix Ableitner 2023-12-04 02:42:53 +01:00
parent 181b585644
commit 00319546a4
4 changed files with 27 additions and 60 deletions

39
Cargo.lock generated
View File

@ -449,19 +449,6 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "dashmap"
version = "5.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
dependencies = [
"cfg-if",
"hashbrown 0.14.2",
"lock_api",
"once_cell",
"parking_lot_core",
]
[[package]] [[package]]
name = "derive_builder" name = "derive_builder"
version = "0.12.0" version = "0.12.0"
@ -696,7 +683,6 @@ dependencies = [
"rand", "rand",
"reqwest", "reqwest",
"serde", "serde",
"serial_test",
"sha2", "sha2",
"tokio", "tokio",
"tracing", "tracing",
@ -1880,31 +1866,6 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "serial_test"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d"
dependencies = [
"dashmap",
"futures",
"lazy_static",
"log",
"parking_lot",
"serial_test_derive",
]
[[package]]
name = "serial_test_derive"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
]
[[package]] [[package]]
name = "sha1" name = "sha1"
version = "0.10.6" version = "0.10.6"

View File

@ -28,4 +28,3 @@ url = "2.4.1"
once_cell = "1.18.0" once_cell = "1.18.0"
pretty_assertions = "1.4.0" pretty_assertions = "1.4.0"
reqwest = "0.11.22" reqwest = "0.11.22"
serial_test = "2.0.0"

View File

@ -11,8 +11,10 @@ use serde::de::Deserialize;
use serde::ser::Serialize; use serde::ser::Serialize;
use std::env::current_dir; use std::env::current_dir;
use std::process::{Command, Stdio}; use std::process::{Command, Stdio};
use std::sync::atomic::{AtomicI32, Ordering};
use std::sync::Once; use std::sync::Once;
use std::thread::spawn; use std::thread::{sleep, spawn};
use std::time::Duration;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tracing::log::LevelFilter; use tracing::log::LevelFilter;
use url::Url; use url::Url;
@ -36,9 +38,21 @@ impl TestData {
.init(); .init();
}); });
let alpha_db_path = generate_db_path("alpha"); // Run things on different ports and db paths to allow parallel tests
let beta_db_path = generate_db_path("beta"); static COUNTER: AtomicI32 = AtomicI32::new(0);
let gamma_db_path = generate_db_path("gamma"); let current_run = COUNTER.fetch_add(1, Ordering::Relaxed);
// Give each test a moment to start its postgres databases
sleep(Duration::from_millis(current_run as u64 * 500));
let first_port = 8000 + (current_run * 3);
let port_alpha = first_port;
let port_beta = first_port + 1;
let port_gamma = first_port + 2;
let alpha_db_path = generate_db_path("alpha", port_alpha);
let beta_db_path = generate_db_path("beta", port_beta);
let gamma_db_path = generate_db_path("gamma", port_gamma);
// initialize postgres databases in parallel because its slow // initialize postgres databases in parallel because its slow
for j in [ for j in [
@ -50,9 +64,9 @@ impl TestData {
} }
Self { Self {
alpha: FediwikiInstance::start(alpha_db_path, 8131), alpha: FediwikiInstance::start(alpha_db_path, port_alpha),
beta: FediwikiInstance::start(beta_db_path, 8132), beta: FediwikiInstance::start(beta_db_path, port_beta),
gamma: FediwikiInstance::start(gamma_db_path, 8133), gamma: FediwikiInstance::start(gamma_db_path, port_gamma),
} }
} }
@ -64,8 +78,12 @@ impl TestData {
} }
} }
fn generate_db_path(name: &'static str) -> String { /// Generate a unique db path for each postgres so that tests can run in parallel.
format!("{}/target/test_db/{name}", current_dir().unwrap().display()) fn generate_db_path(name: &'static str, port: i32) -> String {
format!(
"{}/target/test_db/{name}-{port}",
current_dir().unwrap().display()
)
} }
pub struct FediwikiInstance { pub struct FediwikiInstance {

View File

@ -15,11 +15,9 @@ use fediwiki::error::MyResult;
use fediwiki::federation::objects::instance::DbInstance; use fediwiki::federation::objects::instance::DbInstance;
use pretty_assertions::{assert_eq, assert_ne}; use pretty_assertions::{assert_eq, assert_ne};
use serial_test::serial;
use url::Url; use url::Url;
#[tokio::test] #[tokio::test]
#[serial]
async fn test_create_read_and_edit_article() -> MyResult<()> { async fn test_create_read_and_edit_article() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -62,7 +60,6 @@ async fn test_create_read_and_edit_article() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_create_duplicate_article() -> MyResult<()> { async fn test_create_duplicate_article() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -79,7 +76,6 @@ async fn test_create_duplicate_article() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_follow_instance() -> MyResult<()> { async fn test_follow_instance() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -102,7 +98,6 @@ async fn test_follow_instance() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_synchronize_articles() -> MyResult<()> { async fn test_synchronize_articles() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -149,7 +144,6 @@ async fn test_synchronize_articles() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_edit_local_article() -> MyResult<()> { async fn test_edit_local_article() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -193,7 +187,6 @@ async fn test_edit_local_article() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_edit_remote_article() -> MyResult<()> { async fn test_edit_remote_article() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -246,7 +239,6 @@ async fn test_edit_remote_article() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_local_edit_conflict() -> MyResult<()> { async fn test_local_edit_conflict() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -301,7 +293,6 @@ async fn test_local_edit_conflict() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_federated_edit_conflict() -> MyResult<()> { async fn test_federated_edit_conflict() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -383,7 +374,6 @@ async fn test_federated_edit_conflict() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_overlapping_edits_no_conflict() -> MyResult<()> { async fn test_overlapping_edits_no_conflict() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();
@ -422,7 +412,6 @@ async fn test_overlapping_edits_no_conflict() -> MyResult<()> {
} }
#[tokio::test] #[tokio::test]
#[serial]
async fn test_fork_article() -> MyResult<()> { async fn test_fork_article() -> MyResult<()> {
let data = TestData::start(); let data = TestData::start();