summaryrefslogtreecommitdiff
path: root/src/tests/block_cache.rs
blob: f1c18cc65542d6d4f28bb580f88f5c61dd02df67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use crate::disk::block::{DataBlock, DoubleIndirectBlock, IndirectBlock};
use crate::disk::inode::InodeMode;
use crate::tests::common;

#[test]
fn test_basic_lru() {
    let mut fs = common::setup();

    let v: Vec<usize> = (1..=256)
        .map(|_| {
            let index = fs.data_bitmap.allocate().unwrap();
            fs.get_block::<DataBlock>(index).unwrap();
            index
        })
        .collect();
    assert!(fs.peek_block::<DataBlock>(v[0]).is_some());

    for i in 0..256 {
        let index = fs.data_bitmap.allocate().unwrap();
        fs.get_block::<DataBlock>(index).unwrap();
        assert!(fs.peek_block::<DataBlock>(v[i]).is_none());
    }
}

#[test]
fn test_inode() {
    let mut fs = common::setup();

    let inode_index = fs.create_inode(0o755, InodeMode::IFDIR, 0, 0, 0).unwrap();
    let mut inode = fs.get_inode(inode_index).unwrap().clone();

    const DIRECT_NUMBER: u32 = 15;
    const INDIRECT_NUMBER: u32 = 1024;
    const DOUBLE_INDIRECT_NUMBER: u32 = 1024 * 1024;

    for i in 0..DIRECT_NUMBER {
        fs.allocate_block_for(&mut inode).unwrap();
        assert!(fs.data_bitmap.query(inode.direct[i as usize] as usize))
    }

    for i in 0..INDIRECT_NUMBER {
        fs.allocate_block_for(&mut inode).unwrap();
    }

    for i in 0..DOUBLE_INDIRECT_NUMBER {
        fs.allocate_block_for(&mut inode).unwrap();
    }

    let single_indirect = inode.single_indirect;
    let double_indirect = inode.double_indirect;
    let triple_indirect = inode.triple_indirect;

    fs.update_inode(inode_index, inode);

    let indirect_block = fs
        .peek_block::<IndirectBlock>(single_indirect as usize)
        .unwrap();
    for entry in indirect_block.block.entries {
        assert_ne!(entry, 0);
        assert!(fs.data_bitmap.query(entry as usize));
    }

    // let double_indirect_block = fs
    //     .peek_block::<DoubleIndirectBlock>(double_indirect as usize)
    //     .unwrap();
    // for indirect_entry in double_indirect_block.block.indirect {
    //     let indirect_block = fs
    //         .peek_block::<IndirectBlock>(indirect_entry as usize)
    //         .unwrap();
    //     for entry in indirect_block.block.entries {
    //         assert_ne!(entry, 0);
    //         assert!(fs.data_bitmap.query(entry as usize));
    //     }
    // }

    assert_eq!(fs.data_bitmap.query(double_indirect as usize), false);

    assert_eq!(fs.data_bitmap.query(triple_indirect as usize), false);
}