mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
47 lines
1.6 KiB
Rust
47 lines
1.6 KiB
Rust
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
/// True if a test is in progress somewhere in the process, false otherwise.
|
|
static TEST_ACTIVE_IN_PROCESS: AtomicBool = AtomicBool::new(false);
|
|
|
|
const OTHER_TEST_IN_PROGRESS_ERROR: &str = "TEST ISOLATION ERROR:
|
|
|
|
wgpu's test harness requires that no more than one test is running per process.
|
|
|
|
The best way to facilitate this is by using cargo-nextest which runs each test in its own process
|
|
and has a very good testing UI:
|
|
|
|
cargo install cargo-nextest
|
|
cargo nextest run
|
|
|
|
Alternatively, you can run tests in single threaded mode (much slower).
|
|
|
|
cargo test -- --test-threads=1
|
|
|
|
Calling std::process::abort()...
|
|
";
|
|
|
|
/// When this guard is active, enforces that there is only a single test running in the process
|
|
/// at any one time. If there are multiple processes, creating the guard hard terminates the process.
|
|
pub struct OneTestPerProcessGuard(());
|
|
|
|
impl OneTestPerProcessGuard {
|
|
pub fn new() -> Self {
|
|
let other_tests_in_flight = TEST_ACTIVE_IN_PROCESS.swap(true, Ordering::SeqCst);
|
|
|
|
// We never abort if we're on wasm. Wasm tests are inherently single threaded, and panics cannot
|
|
// unwind the stack and trigger all the guards, so we don't actually need to check.
|
|
if other_tests_in_flight && !cfg!(target_arch = "wasm32") {
|
|
log::error!("{}", OTHER_TEST_IN_PROGRESS_ERROR);
|
|
// Hard exit to call attention to the error
|
|
std::process::abort();
|
|
}
|
|
OneTestPerProcessGuard(())
|
|
}
|
|
}
|
|
|
|
impl Drop for OneTestPerProcessGuard {
|
|
fn drop(&mut self) {
|
|
TEST_ACTIVE_IN_PROCESS.store(false, Ordering::SeqCst);
|
|
}
|
|
}
|