1use crate::fsverity::FsVerityHashValue;
6
7pub use crate::generic_tree::{self, ImageError, Stat};
8
9#[derive(Debug, Clone)]
14pub enum RegularFile<ObjectID: FsVerityHashValue> {
15 Inline(Box<[u8]>),
17 External(ObjectID, u64),
21}
22
23pub type LeafContent<T> = generic_tree::LeafContent<RegularFile<T>>;
29
30pub type Leaf<T> = generic_tree::Leaf<RegularFile<T>>;
32
33pub type Directory<T> = generic_tree::Directory<RegularFile<T>>;
35
36pub type Inode<T> = generic_tree::Inode<RegularFile<T>>;
38
39pub type FileSystem<T> = generic_tree::FileSystem<RegularFile<T>>;
41
42#[cfg(test)]
43mod tests {
44 use std::{cell::RefCell, collections::BTreeMap, ffi::OsStr, rc::Rc};
45
46 use super::*;
47 use crate::fsverity::Sha256HashValue;
48
49 fn stat_with_mtime(mtime: i64) -> Stat {
51 Stat {
52 st_mode: 0o755,
53 st_uid: 1000,
54 st_gid: 1000,
55 st_mtim_sec: mtime,
56 xattrs: RefCell::new(BTreeMap::new()),
57 }
58 }
59
60 fn new_dir_inode(mtime: i64) -> Inode<Sha256HashValue> {
62 Inode::Directory(Box::new(Directory {
63 stat: stat_with_mtime(mtime),
64 entries: BTreeMap::new(),
65 }))
66 }
67
68 fn new_leaf_file(mtime: i64) -> Rc<Leaf<Sha256HashValue>> {
70 Rc::new(Leaf {
71 stat: stat_with_mtime(mtime),
72 content: LeafContent::Regular(super::RegularFile::Inline(Default::default())),
73 })
74 }
75
76 #[test]
77 fn test_insert_and_get_leaf() {
78 let mut dir = Directory::<Sha256HashValue>::default();
79 let leaf = new_leaf_file(10);
80 dir.insert(OsStr::new("file.txt"), Inode::Leaf(Rc::clone(&leaf)));
81 assert_eq!(dir.entries.len(), 1);
82
83 let retrieved_leaf_rc = dir.ref_leaf(OsStr::new("file.txt")).unwrap();
84 assert!(Rc::ptr_eq(&retrieved_leaf_rc, &leaf));
85
86 let regular_file_content = dir.get_file(OsStr::new("file.txt")).unwrap();
87 assert!(matches!(
88 regular_file_content,
89 super::RegularFile::Inline(_)
90 ));
91 }
92
93 #[test]
94 fn test_insert_and_get_directory() {
95 let mut dir = Directory::<Sha256HashValue>::default();
96 let sub_dir_inode = new_dir_inode(20);
97 dir.insert(OsStr::new("subdir"), sub_dir_inode);
98 assert_eq!(dir.entries.len(), 1);
99
100 let retrieved_subdir = dir.get_directory(OsStr::new("subdir")).unwrap();
101 assert_eq!(retrieved_subdir.stat.st_mtim_sec, 20);
102
103 let retrieved_subdir_opt = dir
104 .get_directory_opt(OsStr::new("subdir"))
105 .unwrap()
106 .unwrap();
107 assert_eq!(retrieved_subdir_opt.stat.st_mtim_sec, 20);
108 }
109}