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
42pub type DirectoryRef<'a, T> = generic_tree::DirectoryRef<'a, RegularFile<T>>;
44
45#[cfg(test)]
46mod tests {
47 use std::{collections::BTreeMap, ffi::OsStr};
48
49 use super::*;
50 use crate::fsverity::Sha256HashValue;
51 use crate::generic_tree::LeafId;
52
53 fn stat_with_mtime(mtime: i64) -> Stat {
55 Stat {
56 st_mode: 0o755,
57 st_uid: 1000,
58 st_gid: 1000,
59 st_mtim_sec: mtime,
60 st_mtim_nsec: 0,
61 xattrs: BTreeMap::new(),
62 }
63 }
64
65 fn new_dir_inode(mtime: i64) -> Inode<Sha256HashValue> {
67 Inode::Directory(Box::new(Directory {
68 stat: stat_with_mtime(mtime),
69 entries: BTreeMap::new(),
70 }))
71 }
72
73 fn default_stat() -> Stat {
75 Stat {
76 st_mode: 0o755,
77 st_uid: 0,
78 st_gid: 0,
79 st_mtim_sec: 0,
80 st_mtim_nsec: 0,
81 xattrs: BTreeMap::new(),
82 }
83 }
84
85 #[test]
86 fn test_insert_and_get_leaf() {
87 let mut leaves: Vec<Leaf<Sha256HashValue>> = Vec::new();
88 let leaf_id = LeafId(leaves.len());
89 leaves.push(Leaf {
90 stat: stat_with_mtime(10),
91 content: LeafContent::Regular(super::RegularFile::Inline(Default::default())),
92 });
93
94 let mut dir = Directory::<Sha256HashValue>::new(default_stat());
95 dir.insert(OsStr::new("file.txt"), Inode::leaf(leaf_id));
96 assert_eq!(dir.entries.len(), 1);
97
98 let retrieved_id = dir.leaf_id(OsStr::new("file.txt")).unwrap();
99 assert_eq!(retrieved_id, leaf_id);
100
101 let regular_file_content = dir.get_file(OsStr::new("file.txt"), &leaves).unwrap();
102 assert!(matches!(
103 regular_file_content,
104 super::RegularFile::Inline(_)
105 ));
106 }
107
108 #[test]
109 fn test_insert_and_get_directory() {
110 let mut dir = Directory::<Sha256HashValue>::new(default_stat());
111 let sub_dir_inode = new_dir_inode(20);
112 dir.insert(OsStr::new("subdir"), sub_dir_inode);
113 assert_eq!(dir.entries.len(), 1);
114
115 let retrieved_subdir = dir.get_directory(OsStr::new("subdir")).unwrap();
116 assert_eq!(retrieved_subdir.stat.st_mtim_sec, 20);
117
118 let retrieved_subdir_opt = dir
119 .get_directory_opt(OsStr::new("subdir"))
120 .unwrap()
121 .unwrap();
122 assert_eq!(retrieved_subdir_opt.stat.st_mtim_sec, 20);
123 }
124}