You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
2.8 KiB
119 lines
2.8 KiB
use schematics::async_utils::run;
|
|
use schematics::symbols::file::File as FileSymbol;
|
|
use schematics::symbols::Symbol;
|
|
use std::fs::File;
|
|
use std::io::Write;
|
|
use std::path::{Path, PathBuf};
|
|
use tempfile::{tempdir, TempDir};
|
|
|
|
fn get_dir(content: Option<&str>) -> TempDir {
|
|
let tmp_dir = tempdir().expect("create temp dir");
|
|
if content.is_none() {
|
|
return tmp_dir;
|
|
}
|
|
let file_path = tmp_dir.path().join("filename");
|
|
let mut tmp_file = File::create(file_path).expect("create temp file");
|
|
tmp_file
|
|
.write_all(content.unwrap().as_bytes())
|
|
.expect("write temp file");
|
|
tmp_dir
|
|
}
|
|
|
|
fn get_symbol(path: &Path) -> FileSymbol<PathBuf, &str> {
|
|
FileSymbol::new(path.join("filename"), "target content")
|
|
}
|
|
|
|
// Normal cases
|
|
|
|
// Good
|
|
#[test]
|
|
fn already_reached() {
|
|
let dir = get_dir(Some("target content"));
|
|
let symbol = get_symbol(dir.path());
|
|
|
|
run(async {
|
|
assert_eq!(symbol.target_reached().await.unwrap(), true);
|
|
})
|
|
}
|
|
|
|
// Bad
|
|
#[test]
|
|
fn wrong_prefix() {
|
|
let dir = get_dir(Some("not target content"));
|
|
let symbol = get_symbol(dir.path());
|
|
|
|
run(async {
|
|
assert_eq!(symbol.target_reached().await.unwrap(), false);
|
|
symbol.execute().await.unwrap();
|
|
assert_eq!(symbol.target_reached().await.unwrap(), true);
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn wrong_postfix() {
|
|
let dir = get_dir(Some("target content not"));
|
|
let symbol = get_symbol(dir.path());
|
|
|
|
run(async {
|
|
assert_eq!(symbol.target_reached().await.unwrap(), false);
|
|
symbol.execute().await.unwrap();
|
|
assert_eq!(symbol.target_reached().await.unwrap(), true);
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn empty_file() {
|
|
let dir = get_dir(Some(""));
|
|
let symbol = get_symbol(dir.path());
|
|
|
|
run(async {
|
|
assert_eq!(symbol.target_reached().await.unwrap(), false);
|
|
symbol.execute().await.unwrap();
|
|
assert_eq!(symbol.target_reached().await.unwrap(), true);
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn no_file() {
|
|
let dir = get_dir(None);
|
|
let symbol = get_symbol(dir.path());
|
|
|
|
run(async {
|
|
assert_eq!(symbol.target_reached().await.unwrap(), false);
|
|
symbol.execute().await.unwrap();
|
|
assert_eq!(symbol.target_reached().await.unwrap(), true);
|
|
})
|
|
}
|
|
|
|
// Exceptional cases
|
|
|
|
#[test]
|
|
fn may_not_read_file() {
|
|
let symbol = FileSymbol::new(Path::new("/etc/shadow"), "");
|
|
|
|
run(async {
|
|
assert_eq!(symbol.target_reached().await.is_err(), true);
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn may_not_create_file() {
|
|
let symbol = get_symbol(Path::new("/proc/somefile"));
|
|
|
|
run(async {
|
|
// Could also return an error
|
|
assert_eq!(symbol.target_reached().await.unwrap(), false);
|
|
assert!(symbol.execute().await.is_err());
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn directory_missing() {
|
|
let symbol = get_symbol(Path::new("/nonexisting"));
|
|
|
|
run(async {
|
|
// Could also return an error
|
|
assert_eq!(symbol.target_reached().await.unwrap(), false);
|
|
assert!(symbol.execute().await.is_err());
|
|
})
|
|
}
|