5
0
mirror of git://git.proxmox.com/git/proxmox-backup.git synced 2025-01-03 01:18:02 +03:00

pxar: bin: rework and dynamically generate list test data

Commit f16c5de757 ("pxar: bin: test `pxar list` with payload-input")
introduced a regression test for listing of split pxar archives. This
test relies on a large pxar blob file, the large size (> 100M) being
overlooked when writing the test.

In order to not depend on this file any further in the future, drop
it and rewrite the test to dynamically generate the files, needed and
further extend the test thereby also cover the archive creation and
extraction for split pxar archives.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
This commit is contained in:
Christian Ebner 2024-09-11 12:47:22 +02:00 committed by Thomas Lamprecht
parent d1a5855e74
commit 0415304ca4
2 changed files with 80 additions and 118 deletions

View File

@ -82,7 +82,10 @@ fn pxar_create_and_extract() {
}
#[test]
fn pxar_list_with_payload_input() {
fn pxar_split_archive_test() {
let src_dir = "../tests/catar_data/test_files_and_subdirs/";
let dest_dir = "../tests/catar_data/test_files_and_subdirs_dest/";
let target_subdir = std::env::var("DEB_HOST_RUST_TYPE").unwrap_or_default();
let exec_path = if cfg!(debug_assertions) {
@ -91,129 +94,88 @@ fn pxar_list_with_payload_input() {
format!("../target/{target_subdir}/release/pxar")
};
let output = Command::new(exec_path)
.args([
"list",
"../tests/pxar/backup-client-pxar-expected.mpxar",
"--payload-input",
"../tests/pxar/backup-client-pxar-expected.ppxar",
])
println!("run '{exec_path} create archive.mpxar {src_dir} --payload-output archive.ppxar'");
Command::new(&exec_path)
.arg("create")
.arg("./tests/archive.mpxar")
.arg(src_dir)
.arg("--payload-output=./tests/archive.ppxar")
.status()
.unwrap_or_else(|err| panic!("Failed to invoke '{exec_path}': {err}"));
let output = Command::new(&exec_path)
.arg("list")
.arg("./tests/archive.mpxar")
.arg("--payload-input=./tests/archive.ppxar")
.output()
.expect("failed to run pxar list");
assert!(output.status.success());
let expected = "\"/\"
\"/folder_0\"
\"/folder_0/file_0\"
\"/folder_0/file_1\"
\"/folder_0/file_2\"
\"/folder_0/file_3\"
\"/folder_0/file_4\"
\"/folder_0/file_5\"
\"/folder_0/file_6\"
\"/folder_0/file_7\"
\"/folder_0/file_8\"
\"/folder_0/file_9\"
\"/folder_1\"
\"/folder_1/file_0\"
\"/folder_1/file_1\"
\"/folder_1/file_2\"
\"/folder_1/file_3\"
\"/folder_1/file_4\"
\"/folder_1/file_5\"
\"/folder_1/file_6\"
\"/folder_1/file_7\"
\"/folder_1/file_8\"
\"/folder_1/file_9\"
\"/folder_2\"
\"/folder_2/file_0\"
\"/folder_2/file_1\"
\"/folder_2/file_2\"
\"/folder_2/file_3\"
\"/folder_2/file_4\"
\"/folder_2/file_5\"
\"/folder_2/file_6\"
\"/folder_2/file_7\"
\"/folder_2/file_8\"
\"/folder_2/file_9\"
\"/folder_3\"
\"/folder_3/file_0\"
\"/folder_3/file_1\"
\"/folder_3/file_2\"
\"/folder_3/file_3\"
\"/folder_3/file_4\"
\"/folder_3/file_5\"
\"/folder_3/file_6\"
\"/folder_3/file_7\"
\"/folder_3/file_8\"
\"/folder_3/file_9\"
\"/folder_4\"
\"/folder_4/file_0\"
\"/folder_4/file_1\"
\"/folder_4/file_2\"
\"/folder_4/file_3\"
\"/folder_4/file_4\"
\"/folder_4/file_5\"
\"/folder_4/file_6\"
\"/folder_4/file_7\"
\"/folder_4/file_8\"
\"/folder_4/file_9\"
\"/folder_5\"
\"/folder_5/file_0\"
\"/folder_5/file_1\"
\"/folder_5/file_2\"
\"/folder_5/file_3\"
\"/folder_5/file_4\"
\"/folder_5/file_5\"
\"/folder_5/file_6\"
\"/folder_5/file_7\"
\"/folder_5/file_8\"
\"/folder_5/file_9\"
\"/folder_6\"
\"/folder_6/file_0\"
\"/folder_6/file_1\"
\"/folder_6/file_2\"
\"/folder_6/file_3\"
\"/folder_6/file_4\"
\"/folder_6/file_5\"
\"/folder_6/file_6\"
\"/folder_6/file_7\"
\"/folder_6/file_8\"
\"/folder_6/file_9\"
\"/folder_7\"
\"/folder_7/file_0\"
\"/folder_7/file_1\"
\"/folder_7/file_2\"
\"/folder_7/file_3\"
\"/folder_7/file_4\"
\"/folder_7/file_5\"
\"/folder_7/file_6\"
\"/folder_7/file_7\"
\"/folder_7/file_8\"
\"/folder_7/file_9\"
\"/folder_8\"
\"/folder_8/file_0\"
\"/folder_8/file_1\"
\"/folder_8/file_2\"
\"/folder_8/file_3\"
\"/folder_8/file_4\"
\"/folder_8/file_5\"
\"/folder_8/file_6\"
\"/folder_8/file_7\"
\"/folder_8/file_8\"
\"/folder_8/file_9\"
\"/folder_9\"
\"/folder_9/file_0\"
\"/folder_9/file_1\"
\"/folder_9/file_2\"
\"/folder_9/file_3\"
\"/folder_9/file_4\"
\"/folder_9/file_5\"
\"/folder_9/file_6\"
\"/folder_9/file_7\"
\"/folder_9/file_8\"
\"/folder_9/file_9\"
\"/a-test-symlink\"
\"/file1\"
\"/file2\"
\"/subdir1\"
\"/subdir1/subfile1\"
\"/subdir1/subfile2\"
";
assert_eq!(expected.as_bytes(), output.stdout);
println!("run '{exec_path} extract archive.mpxar {dest_dir} --payload-input archive.ppxar'");
Command::new(&exec_path)
.arg("extract")
.arg("./tests/archive.mpxar")
.arg("--payload-input=./tests/archive.ppxar")
.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 {src_dir} {dest_dir}' to verify'");
/* 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 {linecount} differences to address");
// Cleanup archive
Command::new("rm")
.arg("./tests/archive.mpxar")
.arg("./tests/archive.ppxar")
.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 invocation should yield no lines.
if linecount != 0 {
panic!("pxar create and extract did not yield the same contents");
}
}