1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
extern crate bytes; extern crate futures; extern crate tokio_io; use std::io::{self, Read, Write}; use bytes::BytesMut; use futures::{Async, Poll}; use tokio_io::{AsyncRead, AsyncWrite}; #[derive(Debug)] pub struct FakeStream { buf: BytesMut, } impl FakeStream { pub fn new() -> FakeStream { FakeStream { buf: BytesMut::new(), } } } impl Read for FakeStream { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { let len = if buf.len() > self.buf.len() { self.buf.len() } else { buf.len() }; let slice = self.buf.split_to(len).freeze(); &buf[0..slice.len()].copy_from_slice(&slice); Ok(len) } } impl Write for FakeStream { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.buf.extend_from_slice(buf); Ok(buf.len()) } fn flush(&mut self) -> io::Result<()> { Ok(()) } } impl AsyncRead for FakeStream {} impl AsyncWrite for FakeStream { fn shutdown(&mut self) -> Poll<(), io::Error> { Ok(Async::Ready(())) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_fake_stream() { let mut fake = FakeStream::new(); let wl = fake.write(b"something").unwrap(); assert_eq!(9, wl); let mut buf = [0; 5]; let rl = fake.read(&mut buf).unwrap(); assert_eq!(5, rl); assert_eq!(buf, *b"somet"); let mut buf = *b" "; let rl = fake.read(&mut buf).unwrap(); assert_eq!(4, rl); assert_eq!(buf, *b"hing "); } }