extern crate inotify;
extern crate tempdir;
use inotify::{
watch_mask,
Inotify,
};
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
use tempdir::TempDir;
#[test]
fn it_should_watch_a_file() {
let mut testdir = TestDir::new();
let (path, mut file) = testdir.new_file();
let mut inotify = Inotify::init().unwrap();
let watch = inotify.add_watch(&path, watch_mask::MODIFY).unwrap();
write_to(&mut file);
let mut buffer = [0; 1024];
let events = inotify.read_events_blocking(&mut buffer).unwrap();
let mut num_events = 0;
for event in events {
assert_eq!(watch, event.wd);
num_events += 1;
}
assert!(num_events > 0);
}
#[test]
fn it_should_return_immediately_if_no_events_are_available() {
let mut inotify = Inotify::init().unwrap();
let mut buffer = [0; 1024];
assert_eq!(0, inotify.read_events(&mut buffer).unwrap().count());
}
#[test]
fn it_should_handle_file_names_correctly() {
let mut testdir = TestDir::new();
let (mut path, mut file) = testdir.new_file();
let file_name = path
.file_name().unwrap()
.to_str().unwrap()
.to_string();
path.pop();
let mut inotify = Inotify::init().unwrap();
inotify.add_watch(&path, watch_mask::MODIFY).unwrap();
write_to(&mut file);
let mut buffer = [0; 1024];
let events = inotify.read_events_blocking(&mut buffer).unwrap();
let mut num_events = 0;
for event in events {
assert_eq!(file_name, event.name.to_str().unwrap());
num_events += 1;
}
assert!(num_events > 0);
}
struct TestDir {
dir: TempDir,
counter: u32,
}
impl TestDir {
fn new() -> TestDir {
TestDir {
dir: TempDir::new("inotify-rs-test").unwrap(),
counter: 0,
}
}
fn new_file(&mut self) -> (PathBuf, File) {
let id = self.counter;
self.counter += 1;
let path = self.dir.path().join("file-".to_string() + &id.to_string());
let file = File::create(&path)
.unwrap_or_else(|error| panic!("Failed to create temporary file: {}", error));
(path, file)
}
}
fn write_to(file: &mut File) {
file
.write(b"This should trigger an inotify event.")
.unwrap_or_else(|error|
panic!("Failed to write to file: {}", error)
);
}