1 #[cfg(test)] 2 use std::io::{self, Read}; 3 4 #[cfg(test)] 5 pub struct WouldBlockReader<R> { 6 inner: R, 7 do_block: bool, 8 } 9 #[cfg(test)] 10 impl<R: Read> WouldBlockReader<R> { new(inner: R) -> Self11 pub fn new(inner: R) -> Self { 12 WouldBlockReader { 13 inner, 14 do_block: false, 15 } 16 } 17 } 18 #[cfg(test)] 19 impl<R: Read> Read for WouldBlockReader<R> { read(&mut self, buf: &mut [u8]) -> io::Result<usize>20 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { 21 self.do_block = !self.do_block; 22 if self.do_block { 23 Err(io::Error::new(io::ErrorKind::WouldBlock, "Would block")) 24 } else if buf.is_empty() { 25 Ok(0) 26 } else { 27 let mut byte = [0; 1]; 28 if self.inner.read(&mut byte[..])? == 1 { 29 buf[0] = byte[0]; 30 Ok(1) 31 } else { 32 Ok(0) 33 } 34 } 35 } 36 } 37 38 #[cfg(test)] nb_read_to_end<R: Read>(mut reader: R) -> io::Result<Vec<u8>>39pub fn nb_read_to_end<R: Read>(mut reader: R) -> io::Result<Vec<u8>> { 40 let mut buf = vec![0; 1024]; 41 let mut offset = 0; 42 loop { 43 match reader.read(&mut buf[offset..]) { 44 Err(e) => { 45 if e.kind() != io::ErrorKind::WouldBlock { 46 return Err(e); 47 } 48 } 49 Ok(0) => { 50 buf.truncate(offset); 51 break; 52 } 53 Ok(size) => { 54 offset += size; 55 if offset == buf.len() { 56 buf.resize(offset * 2, 0); 57 } 58 } 59 } 60 } 61 Ok(buf) 62 } 63