mirror of
https://github.com/Prominence/rshred.git
synced 2026-01-09 02:06:46 +03:00
97 lines
2.7 KiB
Rust
97 lines
2.7 KiB
Rust
use std::fs::File;
|
|
use std::io::Write;
|
|
|
|
use ntest::assert_false;
|
|
use rand::distributions::Alphanumeric;
|
|
use rand::Rng;
|
|
|
|
pub const PLAIN_FILE_CONTENT: &str = "some sensitive data";
|
|
|
|
pub const TEST_DIR: &str = "target/test";
|
|
|
|
pub fn setup(data_type: TestDataType) -> EnvironmentDetails {
|
|
std::fs::create_dir_all(TEST_DIR).unwrap();
|
|
|
|
return match data_type {
|
|
TestDataType::RandomSingleFile => {
|
|
let filename: String = rand::thread_rng()
|
|
.sample_iter(&Alphanumeric)
|
|
.take(7)
|
|
.map(char::from)
|
|
.collect();
|
|
let tmp_file_path = format!("{}/{}", TEST_DIR, filename);
|
|
|
|
prepare_file(&tmp_file_path);
|
|
|
|
EnvironmentDetails::single(tmp_file_path)
|
|
}
|
|
TestDataType::MultipleFiles(files) => {
|
|
let files = files
|
|
.iter()
|
|
.map(|file| format!("{}/{}", TEST_DIR, file))
|
|
.collect::<Vec<String>>();
|
|
for file in files.iter() {
|
|
let path = std::path::Path::new(&file);
|
|
let directory = path.parent().unwrap();
|
|
std::fs::create_dir_all(directory).unwrap();
|
|
|
|
prepare_file(&file);
|
|
}
|
|
|
|
EnvironmentDetails::multiple(files)
|
|
}
|
|
};
|
|
}
|
|
|
|
fn prepare_file(filepath: &str) {
|
|
let mut tmp_file = File::create(&filepath).unwrap();
|
|
|
|
tmp_file.write(PLAIN_FILE_CONTENT.as_bytes()).unwrap();
|
|
tmp_file.sync_all().unwrap();
|
|
}
|
|
|
|
pub fn check_file_content(file: &String) {
|
|
// file's content will become an invalid UTF-8 string
|
|
assert_false!(std::fs::read_to_string(file).is_ok());
|
|
}
|
|
|
|
pub fn check_file_length(file: &String) {
|
|
let shredded_file_length = std::fs::metadata(file).unwrap().len();
|
|
// file's size hasn't changed
|
|
assert_eq!(PLAIN_FILE_CONTENT.len() as u64, shredded_file_length);
|
|
}
|
|
|
|
pub fn cleanup(env_details: EnvironmentDetails) {
|
|
match env_details {
|
|
EnvironmentDetails::Single(filename) => {
|
|
if std::path::Path::new(&filename).exists() {
|
|
std::fs::remove_file(&filename).unwrap();
|
|
}
|
|
}
|
|
EnvironmentDetails::Multiple(files) => files.iter().for_each(|file| {
|
|
if std::path::Path::new(file).exists() {
|
|
std::fs::remove_file(file).unwrap();
|
|
}
|
|
}),
|
|
}
|
|
}
|
|
|
|
pub enum EnvironmentDetails {
|
|
Single(String),
|
|
Multiple(Vec<String>),
|
|
}
|
|
|
|
impl EnvironmentDetails {
|
|
pub fn single(file: String) -> EnvironmentDetails {
|
|
EnvironmentDetails::Single(file)
|
|
}
|
|
pub fn multiple(files: Vec<String>) -> EnvironmentDetails {
|
|
EnvironmentDetails::Multiple(files)
|
|
}
|
|
}
|
|
|
|
pub enum TestDataType {
|
|
RandomSingleFile,
|
|
MultipleFiles(Vec<String>),
|
|
}
|