use std::io::{BufRead, BufReader}; use std::process::{Command, Stdio}; // Test if xattrs are correctly archived and restored #[test] fn pxar_create_and_extract() { let src_dir = "./tests/catar_data/test_xattrs_src/"; let dest_dir = "./tests/catar_data/test_xattrs_dest/"; let exec_path = if cfg!(debug_assertions) { "./target/debug/pxar" } else { "./target/release/pxar" }; println!("run '{} create archive.pxar {}'", exec_path, src_dir); Command::new(exec_path) .arg("create") .arg("./tests/archive.pxar") .arg(src_dir) .status() .unwrap_or_else(|err| { panic!("Failed to invoke '{}': {}", exec_path, err) }); Command::new(exec_path) .arg("extract") .arg("./tests/archive.pxar") .arg(dest_dir) .status() .unwrap_or_else(|err| { panic!("Failed to invoke '{}': {}", exec_path, err) }); /* Use rsync with --dry-run and --itemize-changes to compare src_dir and dest_dir */ let stdout = Command::new("rsync") .arg("--dry-run") .arg("--itemize-changes") .arg("--recursive") .arg("--acls") .arg("--xattrs") .arg("--owner") .arg("--group") .arg("--hard-links") .arg(src_dir) .arg(dest_dir) .stdout(Stdio::piped()) .spawn() .unwrap() .stdout .unwrap(); let reader = BufReader::new(stdout); let linecount = reader.lines().fold(0, |count, _| count + 1 ); println!("Rsync listed {} differences to address", linecount); // Cleanup archive Command::new("rm") .arg("./tests/archive.pxar") .status() .unwrap_or_else(|err| { panic!("Failed to invoke 'rm': {}", err) }); // Cleanup destination dir Command::new("rm") .arg("-r") .arg(dest_dir) .status() .unwrap_or_else(|err| { panic!("Failed to invoke 'rm': {}", err) }); // If source and destination folder contain the same content, // the output of the rsync invokation should yield no lines. if linecount != 0 { panic!("pxar create and extract did not yield the same contents"); } }