flash_mockstream/
mockstream.rs

1//! mockstream module
2use std::io;
3use std::io::{Cursor, Read, Seek, SeekFrom, Write};
4
5use futures::Poll;
6use tokio_io::{AsyncRead, AsyncWrite};
7
8/// a mockstream that reads and writes from the same buffer
9/// see tests for example usage
10#[derive(Debug)]
11pub struct MockStream {
12    buf: Cursor<Vec<u8>>,
13    read_from: u64,
14}
15
16impl MockStream {
17    /// creates an empty MockStream
18    pub fn new() -> MockStream {
19        MockStream {
20            buf: Cursor::new(Vec::new()),
21            read_from: 0,
22        }
23    }
24}
25
26impl From<Vec<u8>> for MockStream {
27    fn from(buf: Vec<u8>) -> MockStream {
28        MockStream {
29            buf: Cursor::new(buf),
30            read_from: 0,
31        }
32    }
33}
34
35impl Read for MockStream {
36    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
37        self.buf.seek(SeekFrom::Start(self.read_from)).unwrap();
38        let read = self.buf.read(buf).unwrap();
39        self.read_from += read as u64;
40        Ok(read)
41    }
42}
43
44impl Write for MockStream {
45    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
46        self.buf.seek(SeekFrom::End(0)).unwrap();
47        self.buf.write(buf)
48    }
49
50    fn flush(&mut self) -> io::Result<()> {
51        self.buf.flush()
52    }
53}
54
55impl AsyncRead for MockStream {}
56
57impl AsyncWrite for MockStream {
58    fn shutdown(&mut self) -> Poll<(), io::Error> {
59        self.buf.shutdown()
60    }
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn test_write() {
69        let mut mockstream = MockStream::new();
70        let buf = [1, 2, 3, 4, 5];
71        let write = mockstream.write(&buf).unwrap();
72        mockstream.flush().unwrap();
73        assert_eq!(write, 5);
74    }
75
76    #[test]
77    fn test_read() {
78        let mut mockstream = MockStream::from(vec![1, 2, 3, 4, 5]);
79        let mut buf = [0; 5];
80        let read = mockstream.read(&mut buf).unwrap();
81        assert_eq!(buf.len(), 5);
82        assert_eq!(read, 5);
83    }
84}