2017-10-09 20:59:52 +08:00
|
|
|
extern crate fatfs;
|
|
|
|
|
|
|
|
use std::fs;
|
|
|
|
use std::io::prelude::*;
|
|
|
|
use std::io;
|
|
|
|
use std::str;
|
|
|
|
|
|
|
|
use fatfs::FileSystem;
|
2017-10-10 20:48:57 +08:00
|
|
|
use fatfs::BufStream;
|
2017-10-09 20:59:52 +08:00
|
|
|
|
|
|
|
const FAT12_IMG: &str = "fat12.img";
|
|
|
|
const FAT16_IMG: &str = "fat16.img";
|
|
|
|
const FAT32_IMG: &str = "fat32.img";
|
|
|
|
const IMG_DIR: &str = "resources";
|
|
|
|
const TMP_DIR: &str = "tmp";
|
|
|
|
const TEST_STR: &str = "Hi there Rust programmer!\n";
|
|
|
|
|
2017-10-10 03:14:28 +08:00
|
|
|
fn call_with_fs(f: &Fn(FileSystem) -> (), filename: &str, test_seq: u32) {
|
2017-10-09 20:59:52 +08:00
|
|
|
let img_path = format!("{}/{}", IMG_DIR, filename);
|
2017-10-10 03:14:28 +08:00
|
|
|
let tmp_path = format!("{}/{}-{}", TMP_DIR, test_seq, filename);
|
2017-10-09 20:59:52 +08:00
|
|
|
fs::create_dir(TMP_DIR).ok();
|
|
|
|
fs::copy(&img_path, &tmp_path).unwrap();
|
2017-10-10 03:14:28 +08:00
|
|
|
{
|
2017-10-10 20:48:57 +08:00
|
|
|
let file = fs::OpenOptions::new().read(true).write(true).open(&tmp_path).unwrap();
|
|
|
|
let mut buf_file = BufStream::new(file);
|
|
|
|
let fs = FileSystem::new(&mut buf_file).unwrap();
|
2017-10-10 03:14:28 +08:00
|
|
|
f(fs);
|
|
|
|
}
|
|
|
|
fs::remove_file(tmp_path).unwrap();
|
2017-10-09 20:59:52 +08:00
|
|
|
}
|
|
|
|
|
2017-10-10 03:14:28 +08:00
|
|
|
fn test_write_short_file(fs: FileSystem) {
|
2017-10-09 20:59:52 +08:00
|
|
|
let mut root_dir = fs.root_dir();
|
|
|
|
let mut file = root_dir.open_file("short.txt").expect("open file");
|
2017-10-10 03:14:28 +08:00
|
|
|
file.truncate().unwrap();
|
2017-10-10 22:05:19 +08:00
|
|
|
file.write_all(&TEST_STR.as_bytes()).unwrap();
|
2017-10-09 20:59:52 +08:00
|
|
|
file.seek(io::SeekFrom::Start(0)).unwrap();
|
|
|
|
let mut buf = Vec::new();
|
|
|
|
file.read_to_end(&mut buf).unwrap();
|
|
|
|
assert_eq!(TEST_STR, str::from_utf8(&buf).unwrap());
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_write_file_fat12() {
|
2017-10-10 03:14:28 +08:00
|
|
|
call_with_fs(&test_write_short_file, FAT12_IMG, 1)
|
2017-10-09 20:59:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_write_file_fat16() {
|
2017-10-10 03:14:28 +08:00
|
|
|
call_with_fs(&test_write_short_file, FAT16_IMG, 1)
|
2017-10-09 20:59:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_write_file_fat32() {
|
2017-10-10 03:14:28 +08:00
|
|
|
call_with_fs(&test_write_short_file, FAT32_IMG, 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_write_long_file(fs: FileSystem) {
|
|
|
|
let mut root_dir = fs.root_dir();
|
|
|
|
let mut file = root_dir.open_file("long.txt").expect("open file");
|
|
|
|
file.truncate().unwrap();
|
|
|
|
let test_str = TEST_STR.repeat(100);
|
2017-10-10 22:05:19 +08:00
|
|
|
file.write_all(&test_str.as_bytes()).unwrap();
|
2017-10-10 03:14:28 +08:00
|
|
|
file.seek(io::SeekFrom::Start(0)).unwrap();
|
|
|
|
let mut buf = Vec::new();
|
|
|
|
file.read_to_end(&mut buf).unwrap();
|
|
|
|
assert_eq!(test_str, str::from_utf8(&buf).unwrap());
|
|
|
|
file.seek(io::SeekFrom::Start(1234)).unwrap();
|
|
|
|
file.truncate().unwrap();
|
|
|
|
file.seek(io::SeekFrom::Start(0)).unwrap();
|
|
|
|
buf.clear();
|
|
|
|
file.read_to_end(&mut buf).unwrap();
|
|
|
|
assert_eq!(&test_str[..1234], str::from_utf8(&buf).unwrap());
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_write_long_file_fat12() {
|
|
|
|
call_with_fs(&test_write_long_file, FAT12_IMG, 2)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_write_long_file_fat16() {
|
|
|
|
call_with_fs(&test_write_long_file, FAT16_IMG, 2)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_write_long_file_fat32() {
|
|
|
|
call_with_fs(&test_write_long_file, FAT32_IMG, 2)
|
2017-10-09 20:59:52 +08:00
|
|
|
}
|