1pub mod store;
2pub mod types;
3
4#[cfg(test)]
5mod test {
6
7 use ic_stable_structures::{
8 memory_manager::{MemoryId, MemoryManager, VirtualMemory},
9 DefaultMemoryImpl, StableBTreeMap,
10 };
11 use std::cell::RefCell;
12
13 use crate::ic_oss_fs;
14 use crate::types::{Chunk, FileId, FileMetadata};
15
16 type Memory = VirtualMemory<DefaultMemoryImpl>;
17
18 const FS_DATA_MEMORY_ID: MemoryId = MemoryId::new(0);
19
20 thread_local! {
21
22 static MEMORY_MANAGER: RefCell<MemoryManager<DefaultMemoryImpl>> =
23 RefCell::new(MemoryManager::init(DefaultMemoryImpl::default()));
24
25
26 static FS_CHUNKS_STORE: RefCell<StableBTreeMap<FileId, Chunk, Memory>> = RefCell::new(
28 StableBTreeMap::init(
29 MEMORY_MANAGER.with_borrow(|m| m.get(FS_DATA_MEMORY_ID)),
30 )
31 );
32 }
33
34 ic_oss_fs!();
36
37 #[test]
38 fn test_ic_oss_fs() {
39 let files = fs::list_files(u32::MAX, 2);
40 assert!(files.is_empty());
41
42 fs::add_file(FileMetadata {
43 name: "f1".to_string(),
44 size: 100,
45 ..Default::default()
46 })
47 .unwrap();
48
49 assert!(fs::get_file(0).is_none());
50 assert_eq!(fs::get_file(1).unwrap().name, "f1");
51
52 fs::add_file(FileMetadata {
53 name: "f2".to_string(),
54 size: 100,
55 ..Default::default()
56 })
57 .unwrap();
58
59 fs::add_file(FileMetadata {
60 name: "f3".to_string(),
61 size: 100,
62 ..Default::default()
63 })
64 .unwrap();
65
66 fs::add_file(FileMetadata {
67 name: "f4".to_string(),
68 size: 100,
69 ..Default::default()
70 })
71 .unwrap();
72
73 let files = fs::list_files(u32::MAX, 2);
74 assert_eq!(
75 files.iter().map(|f| f.name.clone()).collect::<Vec<_>>(),
76 vec!["f4", "f3"]
77 );
78
79 let files = fs::list_files(files.last().unwrap().id, 10);
80 assert_eq!(
81 files.iter().map(|f| f.name.clone()).collect::<Vec<_>>(),
82 vec!["f2", "f1"]
83 );
84 }
85}