1 // Tape inventory tests
3 // # cargo test --release tape::test::inventory
5 use std
::path
::PathBuf
;
6 use anyhow
::{bail, Error}
;
12 use pbs_api_types
::{MediaLocation, MediaStatus}
;
23 fn create_testdir(name
: &str) -> Result
<PathBuf
, Error
> {
24 let mut testdir
: PathBuf
= String
::from("./target/testout").into();
25 testdir
.push(std
::module_path
!());
28 let _
= std
::fs
::remove_dir_all(&testdir
);
29 let _
= std
::fs
::create_dir_all(&testdir
);
35 fn test_media_state_db() -> Result
<(), Error
> {
37 let testdir
= create_testdir("test_media_state_db")?
;
39 let mut inventory
= Inventory
::load(&testdir
)?
;
41 let uuid1
: Uuid
= inventory
.generate_free_tape("tape1", 0);
43 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Unknown
, MediaLocation
::Offline
));
45 inventory
.set_media_status_full(&uuid1
)?
;
47 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Full
, MediaLocation
::Offline
));
49 inventory
.set_media_location_vault(&uuid1
, "Office2")?
;
50 assert_eq
!(inventory
.status_and_location(&uuid1
),
51 (MediaStatus
::Full
, MediaLocation
::Vault(String
::from("Office2"))));
53 inventory
.set_media_location_offline(&uuid1
)?
;
54 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Full
, MediaLocation
::Offline
));
56 inventory
.set_media_status_damaged(&uuid1
)?
;
57 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Damaged
, MediaLocation
::Offline
));
59 inventory
.clear_media_status(&uuid1
)?
;
60 assert_eq
!(inventory
.status_and_location(&uuid1
), (MediaStatus
::Unknown
, MediaLocation
::Offline
));
66 fn test_list_pool_media() -> Result
<(), Error
> {
68 let testdir
= create_testdir("test_list_pool_media")?
;
69 let mut inventory
= Inventory
::load(&testdir
)?
;
73 let _tape1_uuid
= inventory
.generate_free_tape("tape1", ctime
);
74 let tape2_uuid
= inventory
.generate_assigned_tape("tape2", "p1", ctime
);
76 let set1
= MediaSetLabel
::with_data("p1", Uuid
::generate(), 0, ctime
, None
);
78 let tape3_uuid
= inventory
.generate_used_tape("tape3", set1
.clone(), ctime
);
80 let list
= inventory
.list_pool_media("nonexistent_pool");
81 assert_eq
!(list
.len(), 0);
83 let list
= inventory
.list_pool_media("p1");
84 assert_eq
!(list
.len(), 2);
86 let tape2
= list
.iter().find(|media_id
| &media_id
.label
.uuid
== &tape2_uuid
).unwrap();
87 assert
!(tape2
.media_set_label
.is_none());
89 let tape3
= list
.iter().find(|media_id
| &media_id
.label
.uuid
== &tape3_uuid
).unwrap();
90 match tape3
.media_set_label
{
91 None
=> bail
!("missing media set label"),
93 assert_eq
!(set
.seq_nr
, 0);
94 assert_eq
!(set
.uuid
, set1
.uuid
);
101 fn test_media_set_simple() -> Result
<(), Error
> {
103 let testdir
= create_testdir("test_media_set_simple")?
;
104 let mut inventory
= Inventory
::load(&testdir
)?
;
108 let sl1
= MediaSetLabel
::with_data("p1", Uuid
::generate(), 0, ctime
+ 10, None
);
109 let sl2
= MediaSetLabel
::with_data("p1", sl1
.uuid
.clone(), 1, ctime
+ 20, None
);
110 let sl3
= MediaSetLabel
::with_data("p1", sl1
.uuid
.clone(), 2, ctime
+ 30, None
);
113 let tape1_uuid
= inventory
.generate_used_tape("tape1", sl1
.clone(), 0);
114 let tape2_uuid
= inventory
.generate_used_tape("tape2", sl2
.clone(), 0);
115 let tape3_uuid
= inventory
.generate_used_tape("tape3", sl3
.clone(), 0);
117 // generate incomplete media set in pool p2
118 let sl4
= MediaSetLabel
::with_data("p2", Uuid
::generate(), 1, ctime
+ 40, None
);
119 let tape4_uuid
= inventory
.generate_used_tape("tape4", sl4
.clone(), 0);
121 let media_list
= inventory
.list_pool_media("p1");
122 assert_eq
!(media_list
.len(), 3);
124 let media_list
= inventory
.list_pool_media("p2");
125 assert_eq
!(media_list
.len(), 1);
127 // reload, the do more tests
129 let inventory
= Inventory
::load(&testdir
)?
;
133 let media_set
= inventory
.compute_media_set_members(&sl1
.uuid
)?
;
134 assert_eq
!(media_set
.uuid(), &sl1
.uuid
);
136 let media_list
= media_set
.media_list();
137 assert_eq
!(media_list
.len(), 3);
139 assert_eq
!(media_list
[0], Some(tape1_uuid
.clone()));
140 assert_eq
!(media_list
[1], Some(tape2_uuid
.clone()));
141 assert_eq
!(media_list
[2], Some(tape3_uuid
.clone()));
143 // test media set start time
144 assert_eq
!(inventory
.media_set_start_time(&sl1
.uuid
), Some(ctime
+ 10));
148 let media_set
= inventory
.compute_media_set_members(&sl4
.uuid
)?
;
149 assert_eq
!(media_set
.uuid(), &sl4
.uuid
);
151 let media_list
= media_set
.media_list();
152 assert_eq
!(media_list
.len(), 2);
154 assert_eq
!(media_list
[0], None
);
155 assert_eq
!(media_list
[1], Some(tape4_uuid
.clone()));
157 // start time for incomplete set must be None
158 assert_eq
!(inventory
.media_set_start_time(&sl4
.uuid
), None
);
165 fn test_latest_media_set() -> Result
<(), Error
> {
167 let testdir
= create_testdir("test_latest_media_set")?
;
169 let insert_tape
= |inventory
: &mut Inventory
, pool
, label
, seq_nr
, ctime
| -> Uuid
{
170 let sl
= MediaSetLabel
::with_data(pool
, Uuid
::generate(), seq_nr
, ctime
, None
);
171 let uuid
= sl
.uuid
.clone();
172 inventory
.generate_used_tape(label
, sl
, 0);
176 let check_latest
= |inventory
: &Inventory
, pool
: &str, label
: &str| {
177 let latest_set
= inventory
.latest_media_set(pool
).unwrap();
178 let set
= inventory
.compute_media_set_members(&latest_set
).unwrap();
179 let media_list
= set
.media_list();
180 assert_eq
!(media_list
.iter().filter(|s
| s
.is_some()).count(), 1);
181 let media_uuid
= media_list
.iter().find(|s
| s
.is_some()).unwrap().clone().unwrap();
182 let media
= inventory
.lookup_media(&media_uuid
).unwrap();
183 assert_eq
!(media
.label
.label_text
, label
);
186 let mut inventory
= Inventory
::load(&testdir
)?
;
190 // test 3 sets with different start times
192 insert_tape(&mut inventory
, "p1", "p1tape1", 0, ctime
+ 10);
193 insert_tape(&mut inventory
, "p1", "p1tape2", 0, ctime
+ 20);
194 insert_tape(&mut inventory
, "p1", "p1tape3", 0, ctime
+ 30);
196 check_latest(&inventory
, "p1", "p1tape3");
198 // test 2 sets with same start times, should fail
200 insert_tape(&mut inventory
, "p2", "p2tape1", 0, ctime
+ 10);
201 insert_tape(&mut inventory
, "p2", "p2tape2", 0, ctime
+ 10);
203 assert_eq
!(inventory
.latest_media_set("p2"), None
);
205 // test with incomplete sets
207 insert_tape(&mut inventory
, "p3", "p3tape1", 5, ctime
+ 50);
208 insert_tape(&mut inventory
, "p3", "p3tape2", 1, ctime
+ 10);
209 insert_tape(&mut inventory
, "p3", "p3tape3", 0, ctime
+ 20);
211 check_latest(&inventory
, "p3", "p3tape1");