flash_mockstream/
mockstream.rs1use std::io;
3use std::io::{Cursor, Read, Seek, SeekFrom, Write};
4
5use futures::Poll;
6use tokio_io::{AsyncRead, AsyncWrite};
7
8#[derive(Debug)]
11pub struct MockStream {
12 buf: Cursor<Vec<u8>>,
13 read_from: u64,
14}
15
16impl MockStream {
17 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}