use anyhow::{Error};

use std::process::Command;
use proxmox_backup::pxar::*;

fn run_test(dir_name: &str) -> Result<(), Error> {

    println!("run pxar test {}", dir_name);

    Command::new("casync")
        .arg("make")
        .arg("test-casync.catar")
        .arg(dir_name)
        .status()
        .expect("failed to execute casync");

    let writer = std::fs::OpenOptions::new()
        .create(true)
        .write(true)
        .truncate(true)
        .open("test-proxmox.catar")?;
    let writer = pxar::encoder::sync::StandardWriter::new(writer);

    let dir = nix::dir::Dir::open(
        dir_name, nix::fcntl::OFlag::O_NOFOLLOW,
        nix::sys::stat::Mode::empty())?;

    let options = PxarCreateOptions {
        entries_max: ENCODER_MAX_ENTRIES,
        ..PxarCreateOptions::default()
    };

    let rt = tokio::runtime::Runtime::new().unwrap();
    rt.block_on(create_archive(
        dir,
        writer,
        Flags::DEFAULT,
        |_| Ok(()),
        None,
        options,
    ))?;

    Command::new("cmp")
        .arg("--verbose")
        .arg("test-casync.catar")
        .arg("test-proxmox.catar")
        .status()
        .expect("test failed - archives are different");

    Ok(())
}

fn run_all_tests() -> Result<(), Error> {

    run_test("tests/catar_data/test_file")?;

    run_test("tests/catar_data/test_symlink")?;

    run_test("tests/catar_data/test_subdir")?;

    run_test("tests/catar_data/test_goodbye_sort_order")?;

    run_test("tests/catar_data/test_files_and_subdirs")?;

    Ok(())
}

#[test] #[ignore]
fn catar_simple() {

    if let Err(err) = run_all_tests() {
        eprintln!("Error: {}", err);
        std::process::exit(1);
    }
}
