[functional tests] Port some of Hank's sh tests to Rust.
Run with 'cargo test'
This commit is contained in:
		@@ -4,9 +4,9 @@ use thinp::version::TOOLS_VERSION;
 | 
			
		||||
 | 
			
		||||
mod common;
 | 
			
		||||
 | 
			
		||||
use common::*;
 | 
			
		||||
use common::test_dir::*;
 | 
			
		||||
use common::thin_xml_generator::{write_xml, FragmentedS};
 | 
			
		||||
use common::*;
 | 
			
		||||
 | 
			
		||||
//------------------------------------------
 | 
			
		||||
 | 
			
		||||
@@ -134,10 +134,19 @@ fn auto_repair_incompatible_opts() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = mk_valid_md(&mut td)?;
 | 
			
		||||
    run_fail(thin_check!("--auto-repair", "-m", &md))?;
 | 
			
		||||
    run_fail(thin_check!("--auto-repair", "--override-mapping-root", "123", &md))?;
 | 
			
		||||
    run_fail(thin_check!(
 | 
			
		||||
        "--auto-repair",
 | 
			
		||||
        "--override-mapping-root",
 | 
			
		||||
        "123",
 | 
			
		||||
        &md
 | 
			
		||||
    ))?;
 | 
			
		||||
    run_fail(thin_check!("--auto-repair", "--super-block-only", &md))?;
 | 
			
		||||
    run_fail(thin_check!("--auto-repair", "--skip-mappings", &md))?;
 | 
			
		||||
    run_fail(thin_check!("--auto-repair", "--ignore-non-fatal-errors", &md))?;
 | 
			
		||||
    run_fail(thin_check!(
 | 
			
		||||
        "--auto-repair",
 | 
			
		||||
        "--ignore-non-fatal-errors",
 | 
			
		||||
        &md
 | 
			
		||||
    ))?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -146,11 +155,115 @@ fn clear_needs_check_incompatible_opts() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = mk_valid_md(&mut td)?;
 | 
			
		||||
    run_fail(thin_check!("--clear-needs-check-flag", "-m", &md))?;
 | 
			
		||||
    run_fail(thin_check!("--clear-needs-check-flag", "--override-mapping-root", "123", &md))?;
 | 
			
		||||
    run_fail(thin_check!("--clear-needs-check-flag", "--super-block-only", &md))?;
 | 
			
		||||
    run_fail(thin_check!("--clear-needs-check-flag", "--skip-mappings", &md))?;
 | 
			
		||||
    run_fail(thin_check!("--clear-needs-check-flag", "--ignore-non-fatal-errors", &md))?;
 | 
			
		||||
    run_fail(thin_check!(
 | 
			
		||||
        "--clear-needs-check-flag",
 | 
			
		||||
        "--override-mapping-root",
 | 
			
		||||
        "123",
 | 
			
		||||
        &md
 | 
			
		||||
    ))?;
 | 
			
		||||
    run_fail(thin_check!(
 | 
			
		||||
        "--clear-needs-check-flag",
 | 
			
		||||
        "--super-block-only",
 | 
			
		||||
        &md
 | 
			
		||||
    ))?;
 | 
			
		||||
    run_fail(thin_check!(
 | 
			
		||||
        "--clear-needs-check-flag",
 | 
			
		||||
        "--skip-mappings",
 | 
			
		||||
        &md
 | 
			
		||||
    ))?;
 | 
			
		||||
    run_fail(thin_check!(
 | 
			
		||||
        "--clear-needs-check-flag",
 | 
			
		||||
        "--ignore-non-fatal-errors",
 | 
			
		||||
        &md
 | 
			
		||||
    ))?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
//------------------------------------------
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn clear_needs_check() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = prep_metadata(&mut td)?;
 | 
			
		||||
    set_needs_check(&md)?;
 | 
			
		||||
 | 
			
		||||
    assert!(get_needs_check(&md)?);
 | 
			
		||||
    thin_check!("--clear-needs-check-flag", &md).run()?;
 | 
			
		||||
    assert!(!get_needs_check(&md)?);
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn no_clear_needs_check_if_error() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = prep_metadata(&mut td)?;
 | 
			
		||||
    set_needs_check(&md)?;
 | 
			
		||||
    generate_metadata_leaks(&md, 1, 0, 1)?;
 | 
			
		||||
    run_fail(thin_check!("--clear-needs-check-flag", &md))?;
 | 
			
		||||
    assert!(get_needs_check(&md)?);
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn metadata_leaks_are_non_fatal() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = prep_metadata(&mut td)?;
 | 
			
		||||
    generate_metadata_leaks(&md, 1, 0, 1)?;
 | 
			
		||||
    run_fail(thin_check!(&md))?;
 | 
			
		||||
    thin_check!("--ignore-non-fatal-errors", &md).run()?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn fatal_errors_cant_be_ignored() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = prep_metadata(&mut td)?;
 | 
			
		||||
    generate_metadata_leaks(&md, 1, 1, 0)?;
 | 
			
		||||
    ensure_untouched(&md, || {
 | 
			
		||||
        run_fail(thin_check!("--ignore-non-fatal-errors", &md))?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn auto_repair() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = prep_metadata(&mut td)?;
 | 
			
		||||
 | 
			
		||||
    // auto-repair should have no effect on good metadata.
 | 
			
		||||
    ensure_untouched(&md, || {
 | 
			
		||||
        thin_check!("--auto-repair", &md).run()?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    })?;
 | 
			
		||||
 | 
			
		||||
    generate_metadata_leaks(&md, 16, 0, 1)?;
 | 
			
		||||
    run_fail(thin_check!(&md))?;
 | 
			
		||||
    thin_check!("--auto-repair", &md).run()?;
 | 
			
		||||
    thin_check!(&md).run()?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn auto_repair_has_limits() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = prep_metadata(&mut td)?;
 | 
			
		||||
    generate_metadata_leaks(&md, 16, 1, 0)?;
 | 
			
		||||
 | 
			
		||||
    ensure_untouched(&md, || {
 | 
			
		||||
        run_fail(thin_check!("--auto-repair", &md))?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    })?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn auto_repair_clears_needs_check() -> Result<()> {
 | 
			
		||||
    let mut td = TestDir::new()?;
 | 
			
		||||
    let md = prep_metadata(&mut td)?;
 | 
			
		||||
    set_needs_check(&md)?;
 | 
			
		||||
    thin_check!("--auto-repair", &md).run()?;
 | 
			
		||||
    assert!(!get_needs_check(&md)?);
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user