|
|
|
@ -9,6 +9,7 @@ use std::fs::{File, OpenOptions};
|
|
|
|
|
use std::io::{Read, Write, Seek, SeekFrom};
|
|
|
|
|
use std::sync::Mutex;
|
|
|
|
|
use alloc::sync::Arc;
|
|
|
|
|
use rand;
|
|
|
|
|
|
|
|
|
|
const BLOCK_SZ: usize = 512;
|
|
|
|
|
|
|
|
|
@ -37,6 +38,11 @@ fn main() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn easy_fs_pack() -> std::io::Result<()> {
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn efs_test() -> std::io::Result<()> {
|
|
|
|
|
let block_file = Arc::new(BlockFile(Mutex::new(
|
|
|
|
|
OpenOptions::new()
|
|
|
|
|
.read(true)
|
|
|
|
@ -55,16 +61,49 @@ fn easy_fs_pack() -> std::io::Result<()> {
|
|
|
|
|
for name in root_inode.ls() {
|
|
|
|
|
println!("{}", name);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
let filea = root_inode.find("filea").unwrap();
|
|
|
|
|
println!("writing filea!");
|
|
|
|
|
filea.write_at(0, "Hello, world!".as_bytes());
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
let filea = root_inode.find("filea").unwrap();
|
|
|
|
|
let mut buffer = [0u8; 512];
|
|
|
|
|
let len = filea.read_at(0, &mut buffer);
|
|
|
|
|
println!("{}", core::str::from_utf8(&buffer[..len]).unwrap());
|
|
|
|
|
}
|
|
|
|
|
let filea = root_inode.find("filea").unwrap();
|
|
|
|
|
let greet_str = "Hello, world!";
|
|
|
|
|
filea.write_at(0, greet_str.as_bytes());
|
|
|
|
|
let mut buffer = [0u8; 512];
|
|
|
|
|
let len = filea.read_at(0, &mut buffer);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
greet_str,
|
|
|
|
|
core::str::from_utf8(&buffer[..len]).unwrap(),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let mut random_str_test = |len: usize| {
|
|
|
|
|
filea.clear();
|
|
|
|
|
assert_eq!(
|
|
|
|
|
filea.read_at(0, &mut buffer),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let mut str = String::new();
|
|
|
|
|
// random digit
|
|
|
|
|
for _ in 0..len {
|
|
|
|
|
str.push(char::from('0' as u8 + rand::random::<u8>() % 10));
|
|
|
|
|
}
|
|
|
|
|
filea.write_at(0, str.as_bytes());
|
|
|
|
|
let mut read_buffer = [0u8; 127];
|
|
|
|
|
let mut offset = 0usize;
|
|
|
|
|
let mut read_str = String::new();
|
|
|
|
|
loop {
|
|
|
|
|
let len = filea.read_at(offset, &mut read_buffer);
|
|
|
|
|
if len == 0 {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
offset += len;
|
|
|
|
|
read_str.push_str(
|
|
|
|
|
core::str::from_utf8(&read_buffer[..len]).unwrap()
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
assert_eq!(str, read_str);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
random_str_test(4 * BLOCK_SZ);
|
|
|
|
|
random_str_test(8 * BLOCK_SZ + BLOCK_SZ / 2);
|
|
|
|
|
random_str_test(100 * BLOCK_SZ);
|
|
|
|
|
random_str_test(70 * BLOCK_SZ + BLOCK_SZ / 7);
|
|
|
|
|
random_str_test((12 + 128) * BLOCK_SZ);
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|