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 fn default_stat() -> Stat {
78 Stat {
79 st_mode: 0o755,
80 st_uid: 0,
81 st_gid: 0,
82 st_mtim_sec: 0,
83 xattrs: RefCell::new(BTreeMap::new()),
84 }
85 }
86
87 #[test]
88 fn test_insert_and_get_leaf() {
89 let mut dir = Directory::<Sha256HashValue>::new(default_stat());
90 let leaf = new_leaf_file(10);
91 dir.insert(OsStr::new("file.txt"), Inode::Leaf(Rc::clone(&leaf)));
92 assert_eq!(dir.entries.len(), 1);
93
94 let retrieved_leaf_rc = dir.ref_leaf(OsStr::new("file.txt")).unwrap();
95 assert!(Rc::ptr_eq(&retrieved_leaf_rc, &leaf));
96
97 let regular_file_content = dir.get_file(OsStr::new("file.txt")).unwrap();
98 assert!(matches!(
99 regular_file_content,
100 super::RegularFile::Inline(_)
101 ));
102 }
103
104 #[test]
105 fn test_insert_and_get_directory() {
106 let mut dir = Directory::<Sha256HashValue>::new(default_stat());
107 let sub_dir_inode = new_dir_inode(20);
108 dir.insert(OsStr::new("subdir"), sub_dir_inode);
109 assert_eq!(dir.entries.len(), 1);
110
111 let retrieved_subdir = dir.get_directory(OsStr::new("subdir")).unwrap();
112 assert_eq!(retrieved_subdir.stat.st_mtim_sec, 20);
113
114 let retrieved_subdir_opt = dir
115 .get_directory_opt(OsStr::new("subdir"))
116 .unwrap()
117 .unwrap();
118 assert_eq!(retrieved_subdir_opt.stat.st_mtim_sec, 20);
119 }
120}