Как запустить тесты Rust с явным часовым поясом (используя хронограф) - PullRequest
0 голосов
/ 22 июня 2019

Я строю некоторые тесты, которые выполняют преобразование меток времени в Rust с использованием хронокрейта, и должны убедиться, что они учитывают местный часовой пояс. Тем не менее, тесты будут выполняться в нескольких часовых поясах и поэтому не пройдут тестирование для большинства тестеров. Как заставить Rust или chrono в коде использовать определенный часовой пояс при запуске тестов?

Я знаю о настройке env TZ=CST или аналогичной. Поскольку я не могу контролировать эту часть среды выполнения для всех, кто выполняет cargo test, я не думаю, что это работает для нас.

1 Ответ

1 голос
/ 22 июня 2019

Если все тесты должны выполняться в одинаковом часовом поясе, вы можете использовать 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, где все потоки, которые в настоящий момент хотят работать в одном и том же часовом поясе, могут работать одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...