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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#![crate_name="mockstream"]
#![crate_type="lib"]
use std::rc::{Rc};
use std::cell::{RefCell};
use std::io::{Cursor,Read,Write,Result};
use std::mem::swap;
#[cfg(test)]
mod tests;
pub struct MockStream {
reader: Cursor<Vec<u8>>,
writer: Cursor<Vec<u8>>,
}
fn new_cursor() -> Cursor<Vec<u8>> {
Cursor::new(Vec::new())
}
impl MockStream {
pub fn new() -> MockStream {
MockStream {
reader: new_cursor(),
writer: new_cursor(),
}
}
pub fn pop_bytes_written(&mut self) -> Vec<u8> {
let mut result = Vec::new();
swap(&mut result, self.writer.get_mut());
result
}
pub fn push_bytes_to_read(&mut self, bytes: &[u8]) {
let avail = self.reader.get_ref().len();
if self.reader.position() == avail as u64 {
self.reader = new_cursor();
}
self.reader.get_mut().extend(bytes.iter().map(|c| *c));
}
}
impl Read for MockStream {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
self.reader.read(buf)
}
}
impl Write for MockStream {
fn write<'a>(&mut self, buf: &'a [u8]) -> Result<usize> {
self.writer.write(buf)
}
fn flush(&mut self) -> Result<()> {
self.writer.flush()
}
}
#[derive(Clone)]
pub struct SharedMockStream {
pimpl: Rc<RefCell<MockStream>>
}
impl SharedMockStream {
pub fn new() -> SharedMockStream {
SharedMockStream { pimpl: Rc::new(RefCell::new(MockStream::new())) }
}
pub fn push_bytes_to_read(&mut self, bytes: &[u8]) {
self.pimpl.borrow_mut().push_bytes_to_read(bytes)
}
pub fn pop_bytes_written(&mut self) -> Vec<u8> {
self.pimpl.borrow_mut().pop_bytes_written()
}
}
impl Read for SharedMockStream {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
self.pimpl.borrow_mut().read(buf)
}
}
impl Write for SharedMockStream {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
self.pimpl.borrow_mut().write(buf)
}
fn flush(&mut self) -> Result<()> {
self.pimpl.borrow_mut().flush()
}
}