extern crate futures; extern crate rand; extern crate tempfile; extern crate tokio_fs; extern crate tokio_io; use tokio_fs::*; use tokio_io::io; use futures::future::poll_fn; use futures::Future; use rand::{distributions, thread_rng, Rng}; use tempfile::Builder as TmpBuilder; use std::fs; use std::io::SeekFrom; mod pool; #[test] fn read_write() { const NUM_CHARS: usize = 16 * 1_024; let dir = TmpBuilder::new() .prefix("tokio-fs-tests") .tempdir() .unwrap(); let file_path = dir.path().join("read_write.txt"); let contents: Vec = thread_rng() .sample_iter(&distributions::Alphanumeric) .take(NUM_CHARS) .collect::() .into(); pool::run({ let file_path = file_path.clone(); let contents = contents.clone(); File::create(file_path) .and_then(|file| file.metadata()) .inspect(|&(_, ref metadata)| assert!(metadata.is_file())) .and_then(move |(file, _)| io::write_all(file, contents)) .and_then(|(mut file, _)| poll_fn(move || file.poll_sync_all())) .then(|res| { let _ = res.unwrap(); Ok(()) }) }); let dst = fs::read(&file_path).unwrap(); assert_eq!(dst, contents); pool::run({ File::open(file_path) .and_then(|file| io::read_to_end(file, vec![])) .then(move |res| { let (_, buf) = res.unwrap(); assert_eq!(buf, contents); Ok(()) }) }); } #[test] fn read_write_helpers() { const NUM_CHARS: usize = 16 * 1_024; let dir = TmpBuilder::new() .prefix("tokio-fs-tests") .tempdir() .unwrap(); let file_path = dir.path().join("read_write_all.txt"); let contents: Vec = thread_rng() .sample_iter(&distributions::Alphanumeric) .take(NUM_CHARS) .collect::() .into(); pool::run(write(file_path.clone(), contents.clone()).then(|res| { let _ = res.unwrap(); Ok(()) })); let dst = fs::read(&file_path).unwrap(); assert_eq!(dst, contents); pool::run({ read(file_path).then(move |res| { let buf = res.unwrap(); assert_eq!(buf, contents); Ok(()) }) }); } #[test] fn metadata() { let dir = TmpBuilder::new() .prefix("tokio-fs-tests") .tempdir() .unwrap(); let file_path = dir.path().join("metadata.txt"); pool::run({ let file_path = file_path.clone(); let file_path2 = file_path.clone(); let file_path3 = file_path.clone(); tokio_fs::metadata(file_path) .then(|r| { let _ = r.err().unwrap(); Ok(()) }) .and_then(|_| File::create(file_path2)) .and_then(|_| tokio_fs::metadata(file_path3)) .then(|r| { assert!(r.unwrap().is_file()); Ok(()) }) }); } #[test] fn seek() { let dir = TmpBuilder::new() .prefix("tokio-fs-tests") .tempdir() .unwrap(); let file_path = dir.path().join("seek.txt"); pool::run({ OpenOptions::new() .create(true) .read(true) .write(true) .open(file_path) .and_then(|file| io::write_all(file, "Hello, world!")) .and_then(|(file, _)| file.seek(SeekFrom::End(-6))) .and_then(|(file, _)| io::read_exact(file, vec![0; 5])) .and_then(|(file, buf)| { assert_eq!(buf, b"world"); file.seek(SeekFrom::Start(0)) }) .and_then(|(file, _)| io::read_exact(file, vec![0; 5])) .and_then(|(_, buf)| { assert_eq!(buf, b"Hello"); Ok(()) }) .then(|r| { let _ = r.unwrap(); Ok(()) }) }); } #[test] fn clone() { use std::io::prelude::*; let dir = TmpBuilder::new() .prefix("tokio-fs-tests") .tempdir() .unwrap(); let file_path = dir.path().join("clone.txt"); pool::run( File::create(file_path.clone()) .and_then(|file| { file.try_clone() .map_err(|(_file, err)| err) .and_then(|(file, clone)| { io::write_all(file, "clone ") .and_then(|_| io::write_all(clone, "successful")) }) }) .then(|res| { let _ = res.unwrap(); Ok(()) }), ); let mut file = std::fs::File::open(&file_path).unwrap(); let mut dst = vec![]; file.read_to_end(&mut dst).unwrap(); assert_eq!(dst, b"clone successful") }