mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-02 19:45:46 +00:00
d5f5648b37
We use cargo vendor to generate a .cargo/config file and the vendor directory. Vendoring allows us to lock our dependencies and to modify them easily from the top level Cargo.toml. We vendor all dependencies, including the crates.io ones, which allows for network isolated builds. Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
63 lines
1.9 KiB
Rust
63 lines
1.9 KiB
Rust
extern crate tempfile;
|
|
use std::fs;
|
|
use std::io::{Read, Seek, SeekFrom, Write};
|
|
use std::sync::mpsc::{sync_channel, TryRecvError};
|
|
use std::thread;
|
|
|
|
#[test]
|
|
fn test_basic() {
|
|
let mut tmpfile = tempfile::tempfile().unwrap();
|
|
write!(tmpfile, "abcde").unwrap();
|
|
tmpfile.seek(SeekFrom::Start(0)).unwrap();
|
|
let mut buf = String::new();
|
|
tmpfile.read_to_string(&mut buf).unwrap();
|
|
assert_eq!("abcde", buf);
|
|
}
|
|
|
|
#[test]
|
|
fn test_cleanup() {
|
|
let tmpdir = tempfile::tempdir().unwrap();
|
|
{
|
|
let mut tmpfile = tempfile::tempfile_in(&tmpdir).unwrap();
|
|
write!(tmpfile, "abcde").unwrap();
|
|
}
|
|
let num_files = fs::read_dir(&tmpdir).unwrap().count();
|
|
assert!(num_files == 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_pathological_cleaner() {
|
|
let tmpdir = tempfile::tempdir().unwrap();
|
|
let (tx, rx) = sync_channel(0);
|
|
let cleaner_thread = thread::spawn(move || {
|
|
let tmp_path = rx.recv().unwrap();
|
|
while rx.try_recv() == Err(TryRecvError::Empty) {
|
|
let files = fs::read_dir(&tmp_path).unwrap();
|
|
for f in files {
|
|
// skip errors
|
|
if f.is_err() {
|
|
continue;
|
|
}
|
|
let f = f.unwrap();
|
|
let _ = fs::remove_file(f.path());
|
|
}
|
|
}
|
|
});
|
|
|
|
// block until cleaner_thread makes progress
|
|
tx.send(tmpdir.path().to_owned()).unwrap();
|
|
// need 40-400 iterations to encounter race with cleaner on original system
|
|
for _ in 0..10000 {
|
|
let mut tmpfile = tempfile::tempfile_in(&tmpdir).unwrap();
|
|
write!(tmpfile, "abcde").unwrap();
|
|
tmpfile.seek(SeekFrom::Start(0)).unwrap();
|
|
let mut buf = String::new();
|
|
tmpfile.read_to_string(&mut buf).unwrap();
|
|
assert_eq!("abcde", buf);
|
|
}
|
|
|
|
// close the channel to make cleaner_thread exit
|
|
drop(tx);
|
|
cleaner_thread.join().expect("The cleaner thread failed");
|
|
}
|