dhcpd_parser 0.4.3

Parser for dhcpd configuration files. Currently supports only dhcpd.leases file of the OpenBSD base implementation
Documentation
extern crate dhcpd_parser;

use crate::dhcpd_parser::common::Date;
use crate::dhcpd_parser::parser;
use crate::dhcpd_parser::parser::LeasesMethods;

#[test]
fn basic_test() {
    let res = parser::parse(
        "
    lease 192.0.0.2 {

    }"
        .to_string(),
    );
    assert!(res.is_ok());
}

#[test]
fn dates_test() {
    let res = parser::parse(
        "lease 255.254.253.252 {
        starts 2 2019/01/01 22:00:00 UTC;
        ends 2 2019/01/01 22:00:00 UTC;
    }"
        .to_string(),
    );
    assert!(res.is_ok());
}

#[test]
fn all_options_test() {
    let res = parser::parse(
        "
    lease 192.168.0.2 {
        starts 2 2019/01/01 22:00:00 UTC;
        ends 2 2019/01/01 22:00:00 UTC;
        hardware type 11:11:11:11:11:11;
        uid Client1;
        client-hostname \"CLIENTHOSTNAME\";
        hostname \"TESTHOSTNAME\";
        abandoned;
    }",
    );

    assert!(res.is_ok());
}

#[test]
fn multiple_leases_test() {
    let res = parser::parse(
        "
    lease 192.168.0.2 {
        starts 2 2019/01/01 22:00:00 UTC;
        ends 2 2019/01/01 22:00:00 UTC;
        hardware type 11:11:11:11:11:11;
        uid Client1;
        client-hostname \"CLIENTHOSTNAME\";
        hostname \"TESTHOSTNAME\";
        abandoned;
    }

    lease 192.168.0.3 {
        starts 1 1985/01/01 00:00:00 UTC;
        hardware type 22:22:22:22:22:22;
        uid Client2;
        hostname \"TESTHOSTNAME\";
    }
    ",
    );

    assert!(res.is_ok());

    let leases = res.unwrap().leases;
    assert_eq!(leases[0].hostname.as_ref().unwrap(), "TESTHOSTNAME");
    assert_eq!(
        leases[1].dates.starts.unwrap().to_string(),
        "Monday 1985/01/01 00:00:00"
    );
    assert!(leases[1].dates.ends.is_none());

    assert!(leases[0].abandoned);
    assert!(!leases[1].abandoned);
}

#[test]
fn invalid_format_test() {
    let res = parser::parse(
        "
    lease 192.0.0.2 {

    ",
    );
    assert!(res.is_err());
}

#[test]
fn invalid_date_format_test() {
    let res = parser::parse(
        "
    lease 192.0.0.2 {
        starts 2 2019-01-02 00:00:00;
    }",
    );
    assert!(res.is_err());
}

#[test]
fn is_active_test() {
    let res = parser::parse(
        "
    lease 192.168.0.2 {
        starts 2 2019/01/01 22:00:00 UTC;
        ends 2 2019/01/01 23:00:00 UTC;
        hardware type 11:11:11:11:11:11;
        uid Client1;
        client-hostname \"CLIENTHOSTNAME\";
        hostname \"TESTHOSTNAME\";
        abandoned;
    }

    lease 192.168.0.3 {
        starts 1 1985/01/02 00:00:00 UTC;
        hardware type 22:22:22:22:22:22;
        uid Client2;
        hostname \"TESTHOSTNAME\";
    }
    ",
    );

    let leases = res.unwrap().leases;

    assert!(leases[0].is_active_at(Date::from("2", "2019/01/01", "22:30:00").unwrap()));

    assert_eq!(
        leases[1].is_active_at(Date::from("1", "1985/01/01", "22:30:00").unwrap()),
        false
    );

    assert_eq!(
        leases[0].is_active_at(Date::from("2", "2019/01/01", "21:59:00").unwrap()),
        false
    );

    assert_eq!(
        leases[0].is_active_at(
            Date::from(
                "2".to_string(),
                "2019/01/01".to_string(),
                "23:59:00".to_string()
            )
            .unwrap()
        ),
        false
    );
}

#[test]
fn hostnames_test() {
    let res = parser::parse(
        "
    lease 192.168.0.2 {
        starts 2 2019/01/01 22:00:00 UTC;
        ends 2 2019/01/01 23:00:00 UTC;
        hardware type 11:11:11:11:11:11;
        uid Client1;
        client-hostname \"CLIENTHOSTNAME\";
        hostname \"TESTHOSTNAME\";
    }

    lease 192.168.0.3 {
        starts 1 1985/01/02 00:00:00 UTC;
        ends 1 1985/01/02 02:00:00 UTC;
        hardware type 22:22:22:22:22:22;
        uid Client2;
        hostname \"TESTHOSTNAME\";
    }
    ",
    );

    let leases = res.unwrap().leases;

    assert_eq!(
        leases.hostnames(),
        ["TESTHOSTNAME".to_owned()].iter().cloned().collect()
    );
}

#[test]
fn client_hostnames_test() {
    let res = parser::parse(
        "
    lease 192.168.0.2 {
        starts 2 2019/01/01 22:00:00 UTC;
        ends 2 2019/01/01 23:00:00 UTC;
        hardware type 11:11:11:11:11:11;
        uid Client1;
        client-hostname \"CLIENTHOSTNAME\";
        hostname \"TESTHOSTNAME\";
        abandoned;
    }

    lease 192.168.0.3 {
        starts 1 1985/01/02 00:00:00 UTC;
        ends 1 1985/01/02 02:00:00 UTC;
        hardware type 22:22:22:22:22:22;
        uid Client2;
        hostname \"TESTHOSTNAME\";
        client-hostname \"HN\";
    }

    lease 192.168.0.3 {
        starts 1 1986/01/02 00:00:00 UTC;
        ends 1 1986/12/02 02:00:00 UTC;
        hardware type 22:22:22:22:22:22;
        uid Client2;
        client-hostname \"HN\";
    }
    ",
    );

    let leases = res.unwrap().leases;

    assert_eq!(
        leases.client_hostnames(),
        ["CLIENTHOSTNAME".to_owned(), "HN".to_owned()]
            .iter()
            .cloned()
            .collect()
    );
}