--- /dev/null
+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/";
+
+ println!("run pxar create archive.pxar '{}'", src_dir);
+
+ Command::new("./target/debug/pxar")
+ .arg("create")
+ .arg("./tests/archive.pxar")
+ .arg(src_dir)
+ .status()
+ .unwrap_or_else(|err| {
+ panic!("Failed to invoke './target/debug/pxar': {}", err)
+ });
+
+ Command::new("./target/debug/pxar")
+ .arg("extract")
+ .arg("./tests/archive.pxar")
+ .arg(dest_dir)
+ .status()
+ .unwrap_or_else(|err| {
+ panic!("Failed to invoke './target/debug/pxar': {}", 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");
+ }
+}