servlin 0.8.0

Modular HTTP server library, threaded handlers and async performance
Documentation
#![allow(clippy::unreadable_literal)]
use servlin::internal::{DateTime, FormatTime};
use std::time::{Duration, SystemTime};

const MIN: u64 = 60;
const HOUR: u64 = 60 * MIN;
const DAY: u64 = 24 * HOUR;

#[test]
fn date_time_new() {
    for (expected, epoch_seconds) in [
        ((1970, 1, 1, 0, 0, 0), 0),
        ((1970, 1, 1, 0, 0, 1), 1),
        ((1970, 1, 1, 0, 0, 59), 59),
        ((1970, 1, 1, 0, 1, 0), 60),
        ((1970, 1, 1, 0, 1, 1), 61),
        ((1970, 1, 1, 0, 59, 0), 59 * 60),
        ((1970, 1, 1, 1, 0, 0), 60 * 60),
        ((1970, 1, 1, 23, 0, 0), 23 * 60 * 60),
        ((1970, 1, 1, 23, 59, 59), 86400 - 1),
        ((1970, 1, 2, 0, 0, 0), 86400),
        ((1970, 1, 2, 0, 0, 1), 86400 + 1),
        ((1970, 1, 31, 23, 59, 59), 31 * 86400 - 1),
        ((1970, 2, 1, 0, 0, 0), 31 * 86400),
        ((1970, 3, 1, 0, 0, 0), 59 * 86400),
        ((1970, 12, 31, 23, 59, 59), 31535999),
        ((1971, 1, 1, 0, 0, 0), 31536000),
        ((1972, 6, 30, 23, 59, 59), 78796799),
        ((1972, 7, 1, 0, 0, 0), 78796800),
        ((2022, 3, 30, 7, 29, 33), 1648625373),
        ((2022, 3, 30, 7, 29, 33), 1648625373),
        ((2100, 2, 28, 23, 59, 59), 4107542399),
        ((2100, 3, 1, 0, 0, 0), 4107542400),
    ] {
        let dt = DateTime::new(epoch_seconds);
        assert_eq!(
            expected,
            (dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec)
        );
    }
}

#[test]
fn date_time_add() {
    for (initial, seconds_to_add, expected) in [
        ((1970, 1, 1, 0, 0, 0), 0, (1970, 1, 1, 0, 0, 0)),
        ((1970, 1, 1, 0, 0, 0), 1, (1970, 1, 1, 0, 0, 1)),
        ((2004, 2, 28, 23, 59, 59), 1, (2004, 2, 29, 0, 0, 0)),
        ((2100, 2, 28, 23, 59, 59), 1, (2100, 3, 1, 0, 0, 0)),
        ((2000, 2, 28, 23, 59, 59), 1, (2000, 2, 29, 0, 0, 0)),
        ((2004, 2, 28, 0, 0, 0), 365 * DAY, (2005, 2, 27, 0, 0, 0)),
        ((2100, 2, 28, 0, 0, 0), 365 * DAY, (2101, 2, 28, 0, 0, 0)),
        ((2000, 2, 28, 0, 0, 0), 365 * DAY, (2001, 2, 27, 0, 0, 0)),
        ((2004, 2, 28, 0, 0, 0), 366 * DAY, (2005, 2, 28, 0, 0, 0)),
        ((2100, 2, 28, 0, 0, 0), 366 * DAY, (2101, 3, 1, 0, 0, 0)),
        ((2000, 2, 28, 0, 0, 0), 366 * DAY, (2001, 2, 28, 0, 0, 0)),
        ((2004, 2, 28, 0, 0, 0), 367 * DAY, (2005, 3, 1, 0, 0, 0)),
        ((2100, 2, 28, 0, 0, 0), 367 * DAY, (2101, 3, 2, 0, 0, 0)),
        ((2000, 2, 28, 0, 0, 0), 367 * DAY, (2001, 3, 1, 0, 0, 0)),
        ((2004, 2, 28, 0, 0, 0), 1462 * DAY, (2008, 2, 29, 0, 0, 0)),
        ((2100, 2, 28, 0, 0, 0), 1462 * DAY, (2104, 3, 1, 0, 0, 0)),
        ((2000, 2, 28, 0, 0, 0), 1462 * DAY, (2004, 2, 29, 0, 0, 0)),
    ] {
        let dt = DateTime {
            year: initial.0,
            month: initial.1,
            day: initial.2,
            hour: initial.3,
            min: initial.4,
            sec: initial.5,
        } + Duration::from_secs(seconds_to_add);
        assert_eq!(
            expected,
            (dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec),
            "{initial:?} + {seconds_to_add}",
        );
    }
}

#[test]
fn test_iso8601_utc() {
    for (expected, epoch_seconds) in [
        ("1970-01-01T00:00:00Z", 0),
        ("2022-03-30T07:29:33Z", 1648625373),
        ("2100-02-28T23:59:59Z", 4107542399),
    ] {
        assert_eq!(
            expected,
            (SystemTime::UNIX_EPOCH + Duration::from_secs(epoch_seconds)).iso8601_utc()
        );
    }
}