A library for writing host-specific, single-binary configuration management and deployment tools
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

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 tempdir::TempDir;
fn get_dir(content: Option<&str>) -> TempDir {
let tmp_dir = TempDir::new("unittest").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());
})
}