uci_rs 0.1.2

an openwrt's UCI (Unified Configuration Interface) parser and serializer.
Documentation
use std::fs::{create_dir, File, OpenOptions};
use std::io::{BufWriter, Read, Write};
use std::os::unix::prelude::OpenOptionsExt;
use std::env;

use uci_rs::*;

#[test]
fn test_uci_add_section() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("a", "b")?;
    let sec = uci.get_section("b")?;
    assert_eq!(sec, ("a".to_string(), "b".to_string()));
    Ok(())
}

#[test]
fn test_uci_del_section() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    let sec = uci.get_section("bb")?;
    assert_eq!(sec, ("ab".to_string(), "bb".to_string()));
    uci.del_section("bb")?;
    let sec = uci.get_section("bb");
    assert!(sec.is_err());
    Ok(())
}

#[test]
fn test_uci_set_option() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.set_option("bb", "cc", vec!["dd"])?;
    let opt = uci.get_option("bb", "cc")?;
    assert_eq!(opt, ("cc".to_string(), &vec!["dd".to_string()]));
    Ok(())
}

#[test]
fn test_uci_get_all_options() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.set_option("bb", "cc", vec!["dd"])?;
    uci.set_option("bb", "dd", vec!["ee"])?;
    uci.set_option("bb", "ee", vec!["ff"])?;
    let opts = uci.get_all_options("bb")?;
    assert_eq!(
        opts,
        vec![
            ("cc".to_string(), &vec!["dd".to_string()]),
            ("dd".to_string(), &vec!["ee".to_string()]),
            ("ee".to_string(), &vec!["ff".to_string()])
        ]
    );
    Ok(())
}

#[test]
fn test_uci_get_option_last() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.set_option("bb", "cc", vec!["dd", "ee", "ff", "gg"])?;
    let opt = uci.get_option_last("bb", "cc")?;
    assert_eq!(opt, ("cc".to_string(), Some("gg".to_string())));
    Ok(())
}

#[test]
fn test_uci_get_option_first() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.set_option("bb", "cc", vec!["dd", "ee", "ff", "gg"])?;
    let opt = uci.get_option_first("bb", "cc")?;
    assert_eq!(opt, ("cc".to_string(), Some("dd".to_string())));
    Ok(())
}

#[test]
fn test_uci_is_bool_value() -> Result<()> {
    assert!(is_bool_value("true"));
    assert!(is_bool_value("1"));
    assert!(is_bool_value("on"));
    assert!(is_bool_value("yes"));
    assert!(is_bool_value("enabled"));
    assert!(!is_bool_value("0"));
    assert!(!is_bool_value("false"));
    assert!(!is_bool_value("disabled"));
    Ok(())
}

#[test]
fn test_uci_get_section() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    let sec = uci.get_section("bb")?;
    assert_eq!(sec, ("ab".to_string(), "bb".to_string()));
    Ok(())
}

#[test]
fn test_uci_get_all_sections() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.add_section("ss", "cc")?;
    uci.add_section("ww", "dd")?;
    uci.add_section("qq", "ee")?;
    let secs = uci.get_all_sections();
    assert_eq!(
        secs,
        vec![
            ("ab".to_string(), "bb".to_string()),
            ("ss".to_string(), "cc".to_string()),
            ("ww".to_string(), "dd".to_string()),
            ("qq".to_string(), "ee".to_string())
        ]
    );
    Ok(())
}

#[test]
fn test_uci_del_all() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.add_section("ab", "cc")?;
    uci.add_section("ab", "dd")?;
    uci.add_section("ab", "ee")?;
    uci.del_all("ab")?;
    let secs = uci.get_all("ab");
    assert_eq!(secs, vec![]);
    Ok(())
}

#[test]
fn test_uci_get_section_first() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.add_section("ab", "cc")?;
    uci.add_section("ab", "dd")?;
    uci.add_section("ab", "ee")?;
    if let Some(sec) = uci.get_section_first("ab") {
        assert_eq!(sec, ("ab".to_string(), "bb".to_string()));
    };
    Ok(())
}

#[test]
fn test_uci_get_section_last() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.add_section("ab", "cc")?;
    uci.add_section("ab", "dd")?;
    uci.add_section("ab", "ee")?;
    if let Some(sec) = uci.get_section_last("ab") {
        assert_eq!(sec, ("ab".to_string(), "ee".to_string()));
    };
    Ok(())
}

#[test]
fn test_uci_set_package() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.set_package("ab")?;
    assert_eq!("ab", uci.get_package());
    Ok(())
}

#[test]
fn test_uci_for_each() -> Result<()> {
    let mut uci = Uci::new("test");
    uci.add_section("ab", "bb")?;
    uci.add_section("ab", "cc")?;
    uci.add_section("ab", "dd")?;
    uci.add_section("ab", "ee")?;

    let mut res = vec![];
    uci.for_each("ab", |sec| {
        res.push(sec.name.to_string());
    });
    assert_eq!(res, vec!["bb", "cc", "dd", "ee"]);
    Ok(())
}

#[test]
fn test_uci_write_in() -> Result<()> {
    let uci_str = include_str!(".test_data/uci_config");
    let uci = parse_raw_to_uci("uci_config", uci_str.to_string())?;

    let mut open_options = OpenOptions::new();

    open_options.read(true).write(true).create_new(true);
    open_options.mode(0o644);

    let dir = env::current_dir()?.join(".tmp");

    match create_dir(&dir) {
        _ => {
            let file = open_options.open(dir.join("write_in_uci_config"))?;
            let mut buf = BufWriter::new(file);
            uci.write_in(&mut buf)?;
            buf.flush()?;
            let mut file = File::open(dir.join("write_in_uci_config"))?;

            let mut contents = String::new();
            file.read_to_string(&mut contents)?;
            assert_eq!(contents.trim_end(), uci_str.trim_end());
            Ok(())
        }
    }
}