ic_oss_can/
lib.rs

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        // `FS_CHUNKS_STORE`` is needed by `ic_oss_can::ic_oss_fs` macro
27        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    // need to define `FS_CHUNKS_STORE` before `ic_oss_can::ic_oss_fs!()`
35    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}