use std::env::temp_dir;
use std::io::Write;
use std::sync::{Arc, Mutex};
use ractor::concurrency::{test as rtest, Duration};
use super::*;
use crate::common_test::periodic_check;
#[rtest]
#[tracing_test::traced_test]
async fn filewatcher_starts_default_config() {
let fw = FileWatcher;
let config = FileWatcherConfig {
..Default::default()
};
let (fwactor, fwhandle) = Actor::spawn(None, fw, config)
.await
.expect("Filewatcher failed to spawn");
fwactor.stop(None);
fwhandle.await.unwrap();
}
#[rtest]
#[tracing_test::traced_test]
async fn filewatch_watches_file() {
let mut dir = temp_dir();
let file_name = "filewatch_watches_file.txt".to_string();
dir.push(file_name);
let mut file = std::fs::OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(dir.clone())
.expect("Failed to create temp file");
write!(file, "Some data").expect("Failed to write to file");
drop(file);
let fw = FileWatcher;
let config = FileWatcherConfig {
files: vec![dir.clone()],
..Default::default()
};
let (fwactor, fwhandle) = Actor::spawn(None, fw, config)
.await
.expect("Filewatcher failed to spawn");
let events = Arc::new(Mutex::new(Vec::<String>::new()));
struct Subsciption {
ev: Arc<Mutex<Vec<String>>>,
}
impl FileWatcherSubscriber for Subsciption {
fn event_received(&self, ev: notify::Event) {
self.ev.lock().unwrap().push(format!("{:?}", ev.kind));
}
}
let subscription = Box::new(Subsciption { ev: events.clone() });
let sub_result = ractor::call_t!(
fwactor,
FileWatcherMessage::Subscribe,
200,
fwactor.get_id(),
subscription
)
.expect("RPC failed");
assert!(sub_result == SubscriptionResult::Ok);
let mut file = std::fs::OpenOptions::new()
.write(true)
.truncate(true)
.open(dir)
.expect("Failed to create temp file");
write!(file, "Some data").expect("Failed to write to file");
drop(file);
periodic_check(
|| !events.lock().unwrap().is_empty(),
Duration::from_secs(3),
)
.await;
fwactor.stop(None);
fwhandle.await.unwrap();
}