mirror of
				https://git.proxmox.com/git/proxmox-backup
				synced 2025-11-02 15:18:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
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)
 | 
						|
        });
 | 
						|
 | 
						|
    println!("run '{} extract archive.pxar {}'", exec_path, dest_dir);
 | 
						|
 | 
						|
    Command::new(exec_path)
 | 
						|
        .arg("extract")
 | 
						|
        .arg("./tests/archive.pxar")
 | 
						|
        .arg("--target")
 | 
						|
        .arg(dest_dir)
 | 
						|
        .status()
 | 
						|
        .unwrap_or_else(|err| {
 | 
						|
            panic!("Failed to invoke '{}': {}", exec_path, err)
 | 
						|
        });
 | 
						|
 | 
						|
    println!("run 'rsync --dry-run --itemize-changes --archive {} {}' to verify'", src_dir, dest_dir);
 | 
						|
    /* 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("--archive")
 | 
						|
        .arg(src_dir)
 | 
						|
        .arg(dest_dir)
 | 
						|
        .stdout(Stdio::piped())
 | 
						|
        .spawn()
 | 
						|
        .unwrap()
 | 
						|
        .stdout
 | 
						|
        .unwrap();
 | 
						|
 | 
						|
    let reader = BufReader::new(stdout);
 | 
						|
    let line_iter = reader.lines().map(|l| l.unwrap());
 | 
						|
    let mut linecount = 0;
 | 
						|
    for curr in line_iter {
 | 
						|
        println!("{}", curr);
 | 
						|
        linecount += 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");
 | 
						|
    }
 | 
						|
}
 |