use cfg_if::cfg_if;
cfg_if! {if #[cfg(target_os = "linux")] {
use std::process::Command;
use test_case::test_case;
mod util;
use crate::util::*;
#[test_case("parfile"; "Test with parallel file driver")]
#[test_case("parblock"; "Test with parallel block driver")]
#[ignore] fn copy_generated_tree_sparse(drv: &str) {
let dir = tempdir().unwrap();
let src = dir.path().join("generated");
let dest = dir.path().join("target");
println!("Generating file tree...");
gen_filetree(&src, 0, true).unwrap();
println!("Running copy...");
let out = run(&[
"--driver",
drv,
"-r",
src.to_str().unwrap(),
dest.to_str().unwrap(),
]).unwrap();
assert!(out.status.success());
println!("Compare trees...");
compare_trees(&src, &dest).unwrap();
}
#[test_case("parfile"; "Test with parallel file driver")]
#[test_case("parblock"; "Test with parallel block driver")]
fn test_sparse(drv: &str) {
use std::fs::read;
let dir = tempdir_rel().unwrap();
let from = dir.join("sparse.bin");
let to = dir.join("target.bin");
let slen = create_sparse(&from, 0, 0).unwrap();
assert_eq!(slen, from.metadata().unwrap().len());
assert!(probably_sparse(&from).unwrap());
let out = run(&[
"--driver",
drv,
from.to_str().unwrap(),
to.to_str().unwrap(),
]).unwrap();
assert!(out.status.success());
assert!(probably_sparse(&to).unwrap());
assert_eq!(quickstat(&from).unwrap(), quickstat(&to).unwrap());
let from_data = read(&from).unwrap();
let to_data = read(&to).unwrap();
assert_eq!(from_data, to_data);
}
#[test_case("parfile"; "Test with parallel file driver")]
#[test_case("parblock"; "Test with parallel block driver")]
fn test_sparse_leading_gap(drv: &str) {
use std::fs::read;
let dir = tempdir().unwrap();
let from = dir.path().join("sparse.bin");
let to = dir.path().join("target.bin");
let slen = create_sparse(&from, 1024, 0).unwrap();
assert_eq!(slen, from.metadata().unwrap().len());
assert!(probably_sparse(&from).unwrap());
let out = run(&[
"--driver",
drv,
from.to_str().unwrap(),
to.to_str().unwrap(),
]).unwrap();
assert!(out.status.success());
assert!(probably_sparse(&to).unwrap());
assert_eq!(quickstat(&from).unwrap(), quickstat(&to).unwrap());
let from_data = read(&from).unwrap();
let to_data = read(&to).unwrap();
assert_eq!(from_data, to_data);
}
#[test_case("parfile"; "Test with parallel file driver")]
#[test_case("parblock"; "Test with parallel block driver")]
fn test_sparse_trailng_gap(drv: &str) {
use std::fs::read;
let dir = tempdir().unwrap();
let from = dir.path().join("sparse.bin");
let to = dir.path().join("target.bin");
let slen = create_sparse(&from, 1024, 1024).unwrap();
assert_eq!(slen, from.metadata().unwrap().len());
assert!(probably_sparse(&from).unwrap());
let out = run(&[
"--driver",
drv,
from.to_str().unwrap(),
to.to_str().unwrap(),
]).unwrap();
assert!(out.status.success());
assert!(probably_sparse(&to).unwrap());
assert_eq!(quickstat(&from).unwrap(), quickstat(&to).unwrap());
let from_data = read(&from).unwrap();
let to_data = read(&to).unwrap();
assert_eq!(from_data, to_data);
}
#[test_case("parfile"; "Test with parallel file driver")]
#[test_case("parblock"; "Test with parallel block driver")]
fn test_sparse_single_overwrite(drv: &str) {
use std::fs::read;
let dir = tempdir().unwrap();
let from = dir.path().join("sparse.bin");
let to = dir.path().join("target.bin");
let slen = create_sparse(&from, 1024, 1024).unwrap();
create_file(&to, "").unwrap();
assert_eq!(slen, from.metadata().unwrap().len());
assert!(probably_sparse(&from).unwrap());
let out = run(&[
"--driver",
drv,
from.to_str().unwrap(),
to.to_str().unwrap(),
]).unwrap();
assert!(out.status.success());
assert!(probably_sparse(&to).unwrap());
assert_eq!(quickstat(&from).unwrap(), quickstat(&to).unwrap());
let from_data = read(&from).unwrap();
let to_data = read(&to).unwrap();
assert_eq!(from_data, to_data);
}
#[test_case("parfile"; "Test with parallel file driver")]
#[test_case("parblock"; "Test with parallel block driver")]
fn test_empty_sparse(drv: &str) {
use std::fs::read;
let dir = tempdir().unwrap();
let from = dir.path().join("sparse.bin");
let to = dir.path().join("target.bin");
let out = Command::new("/usr/bin/truncate")
.args(&["-s", "1M", from.to_str().unwrap()])
.output().unwrap();
assert!(out.status.success());
assert_eq!(from.metadata().unwrap().len(), 1024 * 1024);
let out = run(&[
"--driver",
drv,
from.to_str().unwrap(),
to.to_str().unwrap(),
]).unwrap();
assert!(out.status.success());
assert_eq!(to.metadata().unwrap().len(), 1024 * 1024);
assert!(probably_sparse(&to).unwrap());
assert_eq!(quickstat(&from).unwrap(), quickstat(&to).unwrap());
let from_data = read(&from).unwrap();
let to_data = read(&to).unwrap();
assert_eq!(from_data, to_data);
}
}}