fake_stream/
lib.rs

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}