Если все тесты должны выполняться в одинаковом часовом поясе, вы можете использовать std::sync::Once
для инициализации переменной TZ
-обстановки, как указано в комментариях. Технически, поскольку условия гонки отсутствуют, все тесты могут инициализировать env для этого часового пояса.
Если тестам необходимо установить собственный часовой пояс - действителен только для этого одного теста - возможно, безопаснее всего изменить часовой пояс для всего процесса (включая chrono
, но где-то в libc
драконы могут получить доступ к тз тоже). Как вы сами отметили, несколько тестов должны синхронизироваться в их общей среде. Вы можете сделать это с помощью lazy_static
:
#[macro_use]
extern crate lazy_static;
lazy_static! {
static ref TZ_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
}
fn with_tz<R, F: FnOnce() -> Result<(), R>>(tz: &str, f: F) -> Result<(), R> {
let tz_lock = TZ_LOCK.lock();
std::env::set_var("TZ", tz);
f()
}
#[test]
fn foobar() -> Result<(), ()> {
with_tz("CET", || {
Ok(())
})
}
Вы можете получить больше фантазии с этим, используя более сложный TZ_LOCK
, где все потоки, которые в настоящий момент хотят работать в одном и том же часовом поясе, могут работать одновременно.