use nix::sys::uio::*; use nix::unistd::*; use rand::distributions::Alphanumeric; use rand::{thread_rng, Rng}; use std::fs::OpenOptions; use std::io::IoSlice; use std::os::unix::io::AsRawFd; use std::{cmp, iter};
#[cfg(not(target_os = "redox"))] use std::io::IoSliceMut;
use tempfile::tempdir; #[cfg(not(target_os = "redox"))] use tempfile::tempfile;
#[test] fn test_writev() { letmut to_write = Vec::with_capacity(16 * 128); for _ in0..16 { let s: String = thread_rng()
.sample_iter(&Alphanumeric)
.map(char::from)
.take(128)
.collect(); let b = s.as_bytes();
to_write.extend(b.iter().cloned());
} // Allocate and fill iovecs letmut iovecs = Vec::new(); letmut consumed = 0; while consumed < to_write.len() { let left = to_write.len() - consumed; let slice_len = if left <= 64 {
left
} else {
thread_rng().gen_range(64..cmp::min(256, left))
}; let b = &to_write[consumed..consumed + slice_len];
iovecs.push(IoSlice::new(b));
consumed += slice_len;
} let (reader, writer) = pipe().expect("Couldn't create pipe"); // FileDesc will close its filedesc (reader). letmut read_buf: Vec<u8> = iter::repeat(0u8).take(128 * 16).collect();
// Blocking io, should write all data. let write_res = writev(&writer, &iovecs); let written = write_res.expect("couldn't write"); // Check whether we written all data
assert_eq!(to_write.len(), written); let read_res = read(reader.as_raw_fd(), &mut read_buf[..]); let read = read_res.expect("couldn't read"); // Check we have read as much as we written
assert_eq!(read, written); // Check equality of written and read data
assert_eq!(&to_write, &read_buf);
}
#[test] #[cfg(not(target_os = "redox"))] fn test_readv() { let s: String = thread_rng()
.sample_iter(&Alphanumeric)
.map(char::from)
.take(128)
.collect(); let to_write = s.as_bytes().to_vec(); letmut storage = Vec::new(); letmut allocated = 0; while allocated < to_write.len() { let left = to_write.len() - allocated; let vec_len = if left <= 64 {
left
} else {
thread_rng().gen_range(64..cmp::min(256, left))
}; let v: Vec<u8> = iter::repeat(0u8).take(vec_len).collect();
storage.push(v);
allocated += vec_len;
} letmut iovecs = Vec::with_capacity(storage.len()); for v in &mut storage {
iovecs.push(IoSliceMut::new(&mut v[..]));
} let (reader, writer) = pipe().expect("couldn't create pipe"); // Blocking io, should write all data.
write(writer, &to_write).expect("write failed");
let read = readv(&reader, &mut iovecs[..]).expect("read failed"); // Check whether we've read all data
assert_eq!(to_write.len(), read); // Cccumulate data from iovecs letmut read_buf = Vec::with_capacity(to_write.len()); for iovec in &iovecs {
read_buf.extend(iovec.iter().cloned());
} // Check whether iovecs contain all written data
assert_eq!(read_buf.len(), to_write.len()); // Check equality of written and read data
assert_eq!(&read_buf, &to_write);
}
#[test] #[cfg(not(target_os = "redox"))] fn test_pwrite() { use std::io::Read;
let to_write: Vec<u8> = (0..128).collect(); let expected: Vec<u8> = [vec![0; 100], to_write.clone()].concat();
let iovecs = [
IoSlice::new(&to_write[0..17]),
IoSlice::new(&to_write[17..64]),
IoSlice::new(&to_write[64..128]),
];
let tempdir = tempdir().unwrap();
// pwritev them into a temporary file let path = tempdir.path().join("pwritev_test_file"); letmut file = OpenOptions::new()
.write(true)
.read(true)
.create(true)
.truncate(true)
.open(path)
.unwrap();
let written = pwritev(&file, &iovecs, 100).ok().unwrap();
assert_eq!(written, to_write.len());
// Read the data back and make sure it matches letmut contents = Vec::new();
file.read_to_end(&mut contents).unwrap();
assert_eq!(contents, expected);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.