msr-core 0.3.7

Industrial Automation Toolbox - Common core components
Documentation
use std::{
    path::{Path, MAIN_SEPARATOR},
    time::Duration,
};

use super::*;

fn verify_file_path(
    actual_file_path: &Path,
    rolling_fs: &RollingFileSystem,
    created_at: FileNameTimeStamp,
) {
    let RollingFileSystem {
        base_path,
        file_name_template,
    } = rolling_fs;
    let actual_file_name = actual_file_path.file_name().unwrap();
    assert_eq!(
        created_at,
        file_name_template
            .parse_time_stamp_from_file_name(actual_file_name)
            .unwrap()
    );
    let RollingFileNameTemplate {
        prefix: file_name_prefix,
        suffix: file_name_suffix,
    } = file_name_template;
    let actual_file_path_str = actual_file_path.to_str().unwrap();
    let base_path_str = base_path.to_str().unwrap();
    assert!(actual_file_path_str.starts_with(base_path_str));
    assert!(actual_file_path_str.contains(MAIN_SEPARATOR));
    assert!(actual_file_path_str.contains(file_name_prefix));
    let created_at = Timestamp::from(SystemTime::from(created_at));
    let expected_file_name =format!(
            "{prefix}{year:04}{month:02}{day:02}T{hour:02}{minute:02}{second:02}.{nanosecond:09}Z{suffix}",
            prefix = file_name_prefix,
            year = created_at.year(),
            month = created_at.month() as u8,
            day = created_at.day(),
            hour = created_at.hour(),
            minute = created_at.minute(),
            second = created_at.second(),
            nanosecond = created_at.nanosecond(),
            suffix = file_name_suffix,
        );
    assert!(actual_file_path_str.ends_with(&expected_file_name));
    assert_eq!(
        actual_file_path_str.find(MAIN_SEPARATOR).unwrap(),
        actual_file_path_str.find(base_path_str).unwrap() + base_path_str.len()
    );
    assert_eq!(
        actual_file_path_str.find(file_name_prefix).unwrap(),
        actual_file_path_str.find(MAIN_SEPARATOR).unwrap() + MAIN_SEPARATOR.to_string().len()
    );
    assert_eq!(
        actual_file_path_str.find(file_name_suffix).unwrap(),
        actual_file_path_str.find(file_name_prefix).unwrap()
            + file_name_prefix.len()
            + TIME_STAMP_STRING_LEN
    );
}

#[test]
fn format_file_name_from_config() {
    let cfg = RollingFileSystem {
        base_path: ".".into(),
        file_name_template: RollingFileNameTemplate {
            prefix: "prefix_".into(),
            suffix: "_suffix.ext".into(),
        },
    };

    let created_at =
        SystemTime::from(Timestamp::parse_rfc3339("1978-01-02T23:04:05.12345678Z").unwrap()).into();
    let file_path = cfg.new_file_path(created_at);
    verify_file_path(&file_path, &cfg, created_at);

    let created_at = SystemTime::now().into();
    let file_path = cfg.new_file_path(created_at);
    verify_file_path(&file_path, &cfg, created_at);
}

#[test]
fn file_info_cmp_created_at_later() {
    let now = SystemTime::now();
    let earlier = RollingFileInfoWithSize {
        path: Default::default(),
        created_at: now.into(),
        size_in_bytes: 0,
    };
    let later = RollingFileInfoWithSize {
        path: Default::default(),
        created_at: (now + Duration::from_secs(1)).into(),
        size_in_bytes: 0,
    };
    assert_eq!(Ordering::Less, earlier.cmp_created_at(&later));
    assert_eq!(Ordering::Equal, earlier.cmp_created_at(&earlier));
    assert_eq!(Ordering::Equal, later.cmp_created_at(&later));
    assert_eq!(Ordering::Greater, later.cmp_created_at(&earlier));
}