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