[tests] Port the remaining cache tests
This commit is contained in:
parent
66c1d629a4
commit
5abb92838c
@ -53,46 +53,12 @@
|
||||
;;; cache_dump scenarios
|
||||
;;;-----------------------------------------------------------
|
||||
|
||||
(define-scenario (cache-dump v)
|
||||
"print version (-V flag)"
|
||||
(run-ok-rcv (stdout _) (cache-dump "-V")
|
||||
(assert-equal tools-version stdout)))
|
||||
|
||||
(define-scenario (cache-dump version)
|
||||
"print version (--version flags)"
|
||||
(run-ok-rcv (stdout _) (cache-dump "--version")
|
||||
(assert-equal tools-version stdout)))
|
||||
|
||||
(define-scenario (cache-dump h)
|
||||
"cache_dump -h"
|
||||
(run-ok-rcv (stdout _) (cache-dump "-h")
|
||||
(assert-equal cache-dump-help stdout)))
|
||||
|
||||
(define-scenario (cache-dump help)
|
||||
"cache_dump --help"
|
||||
(run-ok-rcv (stdout _) (cache-dump "--help")
|
||||
(assert-equal cache-dump-help stdout)))
|
||||
|
||||
(define-scenario (cache-dump missing-input-file)
|
||||
"Fails with missing input file."
|
||||
(run-fail-rcv (stdout stderr) (cache-dump)
|
||||
(assert-starts-with "No input file provided." stderr)))
|
||||
|
||||
(define-scenario (cache-dump small-input-file)
|
||||
"Fails with small input file"
|
||||
(with-temp-file-sized ((md "cache.bin" 512))
|
||||
(run-fail
|
||||
(cache-dump md))))
|
||||
|
||||
(define-scenario (cache-dump restore-is-noop)
|
||||
"cache_dump followed by cache_restore is a noop."
|
||||
(with-valid-metadata (md)
|
||||
(run-ok-rcv (d1-stdout _) (cache-dump md)
|
||||
(with-temp-file-containing ((xml "cache.xml" d1-stdout))
|
||||
(run-ok (cache-restore "-i" xml "-o" md))
|
||||
(run-ok-rcv (d2-stdout _) (cache-dump md)
|
||||
(assert-equal d1-stdout d2-stdout))))))
|
||||
|
||||
;;;-----------------------------------------------------------
|
||||
;;; cache_metadata_size scenarios
|
||||
;;;-----------------------------------------------------------
|
||||
@ -164,31 +130,4 @@
|
||||
(run-ok-rcv (stdout stderr) (cache-metadata-size "--nr-blocks 67108864")
|
||||
(assert-equal "3678208 sectors" stdout)
|
||||
(assert-eof stderr)))
|
||||
|
||||
;;;-----------------------------------------------------------
|
||||
;;; cache_repair scenarios
|
||||
;;;-----------------------------------------------------------
|
||||
(define-scenario (cache-repair missing-input-file)
|
||||
"the input file can't be found"
|
||||
(with-empty-metadata (md)
|
||||
(let ((bad-path "no-such-file"))
|
||||
(run-fail-rcv (_ stderr) (cache-repair "-i no-such-file -o" md)
|
||||
(assert-superblock-all-zeroes md)
|
||||
(assert-starts-with
|
||||
(string-append bad-path ": No such file or directory")
|
||||
stderr)))))
|
||||
|
||||
(define-scenario (cache-repair garbage-input-file)
|
||||
"the input file is just zeroes"
|
||||
(with-empty-metadata (md1)
|
||||
(with-corrupt-metadata (md2)
|
||||
(run-fail-rcv (_ stderr) (cache-repair "-i" md1 "-o" md2)
|
||||
(assert-superblock-all-zeroes md2)))))
|
||||
|
||||
(define-scenario (cache-repair missing-output-file)
|
||||
"the output file can't be found"
|
||||
(with-cache-xml (xml)
|
||||
(run-fail-rcv (_ stderr) (cache-repair "-i" xml)
|
||||
(assert-starts-with "No output file provided." stderr))))
|
||||
|
||||
)
|
||||
|
@ -107,28 +107,30 @@ fn failing_quiet() -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// (define-scenario (cache-check valid-metadata-passes)
|
||||
// "A valid metadata area passes"
|
||||
// (with-valid-metadata (md)
|
||||
// (run-ok (cache-check md))))
|
||||
//
|
||||
// (define-scenario (cache-check bad-metadata-version)
|
||||
// "Invalid metadata version fails"
|
||||
// (with-cache-xml (xml)
|
||||
// (with-empty-metadata (md)
|
||||
// (cache-restore "-i" xml "-o" md "--debug-override-metadata-version" "12345")
|
||||
// (run-fail (cache-check md)))))
|
||||
//
|
||||
// (define-scenario (cache-check tiny-metadata)
|
||||
// "Prints helpful message in case tiny metadata given"
|
||||
// (with-temp-file-sized ((md "cache.bin" 1024))
|
||||
// (run-fail-rcv (_ stderr) (cache-check md)
|
||||
// (assert-starts-with "Metadata device/file too small. Is this binary metadata?" stderr))))
|
||||
//
|
||||
// (define-scenario (cache-check spot-accidental-xml-data)
|
||||
// "Prints helpful message if XML metadata given"
|
||||
// (with-cache-xml (xml)
|
||||
// (system (fmt #f "man bash >> " xml))
|
||||
// (run-fail-rcv (_ stderr) (cache-check xml)
|
||||
// (assert-matches ".*This looks like XML. cache_check only checks the binary metadata format." stderr))))
|
||||
//
|
||||
#[test]
|
||||
fn valid_metadata_passes() -> Result<()> {
|
||||
let mut td = TestDir::new()?;
|
||||
let md = mk_valid_md(&mut td)?;
|
||||
run_ok(CACHE_CHECK, args![&md])?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bad_metadata_version() -> Result<()> {
|
||||
let mut td = TestDir::new()?;
|
||||
let xml = mk_valid_xml(&mut td)?;
|
||||
let md = mk_zeroed_md(&mut td)?;
|
||||
run_ok(
|
||||
CACHE_RESTORE,
|
||||
args![
|
||||
"-i",
|
||||
&xml,
|
||||
"-o",
|
||||
&md,
|
||||
"--debug-override-metadata-version",
|
||||
"12345"
|
||||
],
|
||||
)?;
|
||||
run_fail(CACHE_CHECK, args![&md])?;
|
||||
Ok(())
|
||||
}
|
||||
|
@ -1,10 +1,14 @@
|
||||
use anyhow::Result;
|
||||
use std::fs::OpenOptions;
|
||||
use std::io::Write;
|
||||
|
||||
mod common;
|
||||
|
||||
use common::cache::*;
|
||||
use common::common_args::*;
|
||||
use common::fixture::*;
|
||||
use common::input_arg::*;
|
||||
use common::process::*;
|
||||
use common::program::*;
|
||||
use common::target::*;
|
||||
use common::test_dir::*;
|
||||
@ -75,13 +79,27 @@ test_unreadable_input_file!(CacheDump);
|
||||
|
||||
//------------------------------------------
|
||||
|
||||
/*
|
||||
(define-scenario (cache-dump restore-is-noop)
|
||||
"cache_dump followed by cache_restore is a noop."
|
||||
(with-valid-metadata (md)
|
||||
(run-ok-rcv (d1-stdout _) (cache-dump md)
|
||||
(with-temp-file-containing ((xml "cache.xml" d1-stdout))
|
||||
(run-ok (cache-restore "-i" xml "-o" md))
|
||||
(run-ok-rcv (d2-stdout _) (cache-dump md)
|
||||
(assert-equal d1-stdout d2-stdout))))))
|
||||
*/
|
||||
// TODO: share with thin_dump
|
||||
#[test]
|
||||
fn dump_restore_cycle() -> Result<()> {
|
||||
let mut td = TestDir::new()?;
|
||||
let md = mk_valid_md(&mut td)?;
|
||||
let output = run_ok_raw(CACHE_DUMP, args![&md])?;
|
||||
|
||||
let xml = td.mk_path("meta.xml");
|
||||
let mut file = OpenOptions::new()
|
||||
.read(false)
|
||||
.write(true)
|
||||
.create(true)
|
||||
.open(&xml)?;
|
||||
file.write_all(&output.stdout[0..])?;
|
||||
drop(file);
|
||||
|
||||
let md2 = mk_zeroed_md(&mut td)?;
|
||||
run_ok(CACHE_RESTORE, args!["-i", &xml, "-o", &md2])?;
|
||||
|
||||
let output2 = run_ok_raw(CACHE_DUMP, args![&md2])?;
|
||||
assert_eq!(output.stdout, output2.stdout);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
90
tests/cache_repair.rs
Normal file
90
tests/cache_repair.rs
Normal file
@ -0,0 +1,90 @@
|
||||
use anyhow::Result;
|
||||
|
||||
mod common;
|
||||
|
||||
use common::cache::*;
|
||||
use common::common_args::*;
|
||||
use common::input_arg::*;
|
||||
use common::output_option::*;
|
||||
use common::program::*;
|
||||
use common::target::*;
|
||||
use common::test_dir::*;
|
||||
|
||||
//------------------------------------------
|
||||
|
||||
const USAGE: &str = "Usage: cache_repair [options] {device|file}\n\
|
||||
Options:\n \
|
||||
{-h|--help}\n \
|
||||
{-i|--input} <input metadata (binary format)>\n \
|
||||
{-o|--output} <output metadata (binary format)>\n \
|
||||
{-V|--version}";
|
||||
|
||||
//-----------------------------------------
|
||||
|
||||
struct CacheRepair;
|
||||
|
||||
impl<'a> Program<'a> for CacheRepair {
|
||||
fn name() -> &'a str {
|
||||
"cache_repair"
|
||||
}
|
||||
|
||||
fn path() -> &'a std::ffi::OsStr {
|
||||
CACHE_REPAIR.as_ref()
|
||||
}
|
||||
|
||||
fn usage() -> &'a str {
|
||||
USAGE
|
||||
}
|
||||
|
||||
fn arg_type() -> ArgType {
|
||||
ArgType::IoOptions
|
||||
}
|
||||
|
||||
fn bad_option_hint(option: &str) -> String {
|
||||
msg::bad_option_hint(option)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> InputProgram<'a> for CacheRepair {
|
||||
fn mk_valid_input(td: &mut TestDir) -> Result<std::path::PathBuf> {
|
||||
mk_valid_md(td)
|
||||
}
|
||||
|
||||
fn file_not_found() -> &'a str {
|
||||
msg::FILE_NOT_FOUND
|
||||
}
|
||||
|
||||
fn missing_input_arg() -> &'a str {
|
||||
msg::MISSING_INPUT_ARG
|
||||
}
|
||||
|
||||
fn corrupted_input() -> &'a str {
|
||||
"bad checksum in superblock"
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> OutputProgram<'a> for CacheRepair {
|
||||
fn missing_output_arg() -> &'a str {
|
||||
msg::MISSING_OUTPUT_ARG
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> MetadataWriter<'a> for CacheRepair {
|
||||
fn file_not_found() -> &'a str {
|
||||
msg::FILE_NOT_FOUND
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------
|
||||
|
||||
test_accepts_help!(CacheRepair);
|
||||
test_accepts_version!(CacheRepair);
|
||||
test_rejects_bad_option!(CacheRepair);
|
||||
|
||||
test_input_file_not_found!(CacheRepair);
|
||||
test_input_cannot_be_a_directory!(CacheRepair);
|
||||
test_corrupted_input_data!(CacheRepair);
|
||||
|
||||
test_missing_output_option!(CacheRepair);
|
||||
|
||||
//-----------------------------------------
|
@ -34,6 +34,7 @@ macro_rules! path_to {
|
||||
|
||||
pub const CACHE_CHECK: &str = path_to!("cache_check");
|
||||
pub const CACHE_DUMP: &str = path_to!("cache_dump");
|
||||
pub const CACHE_REPAIR: &str = path_to!("cache_repair");
|
||||
pub const CACHE_RESTORE: &str = path_to!("cache_restore");
|
||||
|
||||
pub const THIN_CHECK: &str = path_to!("thin_check");
|
||||
|
Loading…
Reference in New Issue
Block a user