From b22e8c363269db92d991108244010bc4bc269d50 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Wed, 3 Feb 2021 10:23:04 +0100 Subject: [PATCH] tape: add media pool regression tests --- src/tape/test/current_set_usable.rs | 233 ++++++++++++++++++++++++++++ src/tape/test/mod.rs | 1 + 2 files changed, 234 insertions(+) create mode 100644 src/tape/test/current_set_usable.rs diff --git a/src/tape/test/current_set_usable.rs b/src/tape/test/current_set_usable.rs new file mode 100644 index 00000000..d11ce8ab --- /dev/null +++ b/src/tape/test/current_set_usable.rs @@ -0,0 +1,233 @@ +// Tape Media Pool tests - test current_set_usable() function +// +// # cargo test --release tape::test::current_set_usable + +use std::path::PathBuf; +use anyhow::Error; + +use proxmox::tools::{ + Uuid, +}; + +use crate::{ + api2::types::{ + MediaSetPolicy, + RetentionPolicy, + }, + tape::{ + Inventory, + MediaPool, + + file_formats::{ + MediaSetLabel, + }, + }, +}; + +fn create_testdir(name: &str) -> Result { + let mut testdir: PathBuf = std::env::var("CARGO_TARGET_DIR") + .unwrap_or(String::from("./target/debug")) + .into(); + testdir.push(format!("{}.testout", std::module_path!())); + testdir.push(name); + + let _ = std::fs::remove_dir_all(&testdir); + let _ = std::fs::create_dir_all(&testdir); + + Ok(testdir) +} + +#[test] +fn test_current_set_usable_1() -> Result<(), Error> { + + let testdir = create_testdir("test_current_set_usable_1")?; + + // pool without any media + + let pool = MediaPool::new( + "p1", + &testdir, + MediaSetPolicy::AlwaysCreate, + RetentionPolicy::KeepForever, + true, + None, + )?; + + assert_eq!(pool.current_set_usable()?, false); + + Ok(()) +} + +#[test] +fn test_current_set_usable_2() -> Result<(), Error> { + + let testdir = create_testdir("test_current_set_usable_2")?; + + let ctime = 0; + + let mut inventory = Inventory::load(&testdir)?; + + inventory.generate_assigned_tape("tape1", "p1", ctime); + + // pool with one free media + let pool = MediaPool::new( + "p1", + &testdir, + MediaSetPolicy::AlwaysCreate, + RetentionPolicy::KeepForever, + true, + None, + )?; + + assert_eq!(pool.current_set_usable()?, false); + + Ok(()) +} + +#[test] +fn test_current_set_usable_3() -> Result<(), Error> { + + let testdir = create_testdir("test_current_set_usable_3")?; + + let ctime = 0; + + let mut inventory = Inventory::load(&testdir)?; + + let sl1 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime, None); + + inventory.generate_used_tape("tape1", sl1, ctime); // Note: Tape is offline + + // pool with one media in current set, only use online media + let pool = MediaPool::new( + "p1", + &testdir, + MediaSetPolicy::AlwaysCreate, + RetentionPolicy::KeepForever, + false, + None, + )?; + + assert_eq!(pool.current_set_usable()?, false); + + Ok(()) +} + +#[test] +fn test_current_set_usable_4() -> Result<(), Error> { + + let testdir = create_testdir("test_current_set_usable_4")?; + + let ctime = 0; + + let mut inventory = Inventory::load(&testdir)?; + + let sl1 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime, None); + + inventory.generate_used_tape("tape1", sl1, ctime); // Note: Tape is offline + + // pool with one media in current set, use offline media + let pool = MediaPool::new( + "p1", + &testdir, + MediaSetPolicy::AlwaysCreate, + RetentionPolicy::KeepForever, + true, + None, + )?; + + assert_eq!(pool.current_set_usable()?, true); + + Ok(()) +} + +#[test] +fn test_current_set_usable_5() -> Result<(), Error> { + + let testdir = create_testdir("test_current_set_usable_5")?; + + let ctime = 0; + + let mut inventory = Inventory::load(&testdir)?; + + let sl1 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime, None); + let sl2 = MediaSetLabel::with_data("p1", sl1.uuid.clone(), 1, ctime + 1, None); + + inventory.generate_used_tape("tape1", sl1, ctime); + inventory.generate_used_tape("tape2", sl2, ctime); + + // pool with two media in current set + let pool = MediaPool::new( + "p1", + &testdir, + MediaSetPolicy::AlwaysCreate, + RetentionPolicy::KeepForever, + true, + None, + )?; + + assert_eq!(pool.current_set_usable()?, true); + + Ok(()) +} + +#[test] +fn test_current_set_usable_6() -> Result<(), Error> { + + let testdir = create_testdir("test_current_set_usable_6")?; + + let ctime = 0; + + let mut inventory = Inventory::load(&testdir)?; + + let sl2 = MediaSetLabel::with_data("p1", Uuid::generate(), 1, ctime + 1, None); + + inventory.generate_used_tape("tape2", sl2, ctime); + + // pool with incomplete current set + let pool = MediaPool::new( + "p1", + &testdir, + MediaSetPolicy::AlwaysCreate, + RetentionPolicy::KeepForever, + true, + None, + )?; + + assert!(pool.current_set_usable().is_err()); + + Ok(()) +} + +#[test] +fn test_current_set_usable_7() -> Result<(), Error> { + + let testdir = create_testdir("test_current_set_usable_7")?; + + let ctime = 0; + + let mut inventory = Inventory::load(&testdir)?; + + let sl1 = MediaSetLabel::with_data("p1", Uuid::generate(), 0, ctime, None); + let sl2 = MediaSetLabel::with_data("p1", sl1.uuid.clone(), 1, ctime + 1, None); + + // generate damaged tape + let tape1_uuid = inventory.generate_used_tape("tape1", sl1, ctime); + inventory.set_media_status_damaged(&tape1_uuid)?; + + inventory.generate_used_tape("tape2", sl2, ctime); + + + // pool with one two media in current set, one set to damaged + let pool = MediaPool::new( + "p1", + &testdir, + MediaSetPolicy::AlwaysCreate, + RetentionPolicy::KeepForever, + true, + None, + )?; + + assert!(pool.current_set_usable().is_err()); + + Ok(()) +} diff --git a/src/tape/test/mod.rs b/src/tape/test/mod.rs index 094ffc4f..d98a71a9 100644 --- a/src/tape/test/mod.rs +++ b/src/tape/test/mod.rs @@ -1,2 +1,3 @@ mod inventory; +mod current_set_usable;