Skip to content

Commit b62a857

Browse files
committed
Fixes to be compatible with rust 1.0.0-beta.
Internal implementation changed to std::io::Cursor<Vec<u8>>.
1 parent 78289d5 commit b62a857

File tree

4 files changed

+64
-61
lines changed

4 files changed

+64
-61
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
[package]
22

33
name = "mockstream"
4-
version = "0.0.1"
4+
version = "0.0.2"
55
authors = ["Alex Bogma <bitfield.alex@gmail.com>"]
66
license = "MIT"
77
description = "Stream (Read+Write traits) implementations to be used to mock real streams in tests."
88
repository = "https://github.com/lazy-bitfield/rust-mockstream"
99
readme = "README.md"
1010
keywords = ["test", "stream", "io", "mock"]
1111

12+
[lib]
13+
name = "mockstream"
14+
path = "src/lib.rs"
15+
test = true
16+

src/lib.rs

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,64 @@
11
#![crate_name="mockstream"]
22
#![crate_type="lib"]
3-
#![feature(io, collections, core)]
4-
53
//! A reader/writer streams to mock real streams in tests.
64
75
use std::rc::{Rc};
86
use std::cell::{RefCell};
9-
use std::io;
7+
use std::io::{Cursor,Read,Write,Result};
108
use std::mem::swap;
11-
use std::slice::bytes::copy_memory;
12-
use std::collections::vec_deque::{RingBuf};
139

1410
#[cfg(test)]
1511
mod tests;
1612

1713
/// MockStream is Read+Write stream that stores the data written and provides the data to be read.
1814
pub struct MockStream {
19-
bytes_to_read: RingBuf<Vec<u8>>,
20-
bytes_written: Vec<u8>,
15+
reader: Cursor<Vec<u8>>,
16+
writer: Cursor<Vec<u8>>,
17+
}
18+
19+
fn new_cursor() -> Cursor<Vec<u8>> {
20+
Cursor::new(Vec::new())
2121
}
2222

2323
impl MockStream {
2424
/// Create new empty stream
2525
pub fn new() -> MockStream {
2626
MockStream {
27-
bytes_to_read: RingBuf::new(),
28-
bytes_written: Vec::new(),
27+
reader: new_cursor(),
28+
writer: new_cursor(),
2929
}
3030
}
3131

3232
/// Extract all bytes written by Write trait calls.
3333
pub fn pop_bytes_written(&mut self) -> Vec<u8> {
34-
let mut temp = Vec::new();
35-
swap(&mut self.bytes_written, &mut temp);
36-
temp
34+
let mut result = Vec::new();
35+
swap(&mut result, self.writer.get_mut());
36+
result
3737
}
3838

3939
/// Provide data to be read by Read trait calls.
4040
pub fn push_bytes_to_read(&mut self, bytes: &[u8]) {
41-
self.bytes_to_read.push_back(bytes.to_vec())
41+
let avail = self.reader.get_ref().len();
42+
if self.reader.position() == avail as u64 {
43+
self.reader = new_cursor();
44+
}
45+
self.reader.get_mut().extend(bytes.iter().map(|c| *c));
4246
}
4347
}
4448

45-
impl io::Read for MockStream {
46-
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
47-
if buf.len() == 0 {
48-
return Ok(0)
49-
}
50-
51-
self.bytes_to_read.pop_front().map_or(Ok(0), |mut v| {
52-
if v.len() > buf.len() {
53-
self.bytes_to_read.push_front(v.split_off(buf.len()));
54-
}
55-
copy_memory(buf, v.as_slice());
56-
Ok(v.len())
57-
})
49+
impl Read for MockStream {
50+
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
51+
self.reader.read(buf)
5852
}
5953
}
6054

61-
impl io::Write for MockStream {
62-
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
63-
self.bytes_written.push_all(buf);
64-
Ok(buf.len())
55+
impl Write for MockStream {
56+
fn write<'a>(&mut self, buf: &'a [u8]) -> Result<usize> {
57+
self.writer.write(buf)
6558
}
6659

67-
fn flush(&mut self) -> io::Result<()> {
68-
Ok(())
60+
fn flush(&mut self) -> Result<()> {
61+
self.writer.flush()
6962
}
7063
}
7164

@@ -93,18 +86,18 @@ impl SharedMockStream {
9386
}
9487
}
9588

96-
impl io::Read for SharedMockStream {
97-
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
89+
impl Read for SharedMockStream {
90+
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
9891
self.pimpl.borrow_mut().read(buf)
9992
}
10093
}
10194

102-
impl io::Write for SharedMockStream {
103-
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
95+
impl Write for SharedMockStream {
96+
fn write(&mut self, buf: &[u8]) -> Result<usize> {
10497
self.pimpl.borrow_mut().write(buf)
10598
}
10699

107-
fn flush(&mut self) -> io::Result<()> {
100+
fn flush(&mut self) -> Result<()> {
108101
self.pimpl.borrow_mut().flush()
109102
}
110103
}

src/tests.rs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
11
use super::{MockStream, SharedMockStream};
2-
use std::io;
2+
use std::io::{Read,Write,Result};
33

44
#[test]
55
fn test_mock_stream_read() {
6-
use std::io::Read;
76
let mut s = MockStream::new();
87
s.push_bytes_to_read("abcd".as_bytes());
98
let mut v = [11; 6];
10-
assert_eq!(s.read(v.as_mut_slice()), Ok(4));
9+
assert_eq!(s.read(v.as_mut()).unwrap(), 4);
1110
assert_eq!(v, [97, 98, 99, 100, 11, 11]);
1211
}
1312

13+
#[test]
14+
fn test_mock_stream_read_lines() {
15+
let mut s = MockStream::new();
16+
s.push_bytes_to_read("abcd\r\ndcba\r\n".as_bytes());
17+
let first_line = s.bytes().map(|c| c.unwrap()).take_while(|&c| c != b'\n').collect::<Vec<u8>>();
18+
assert_eq!(first_line, (vec![97, 98, 99, 100, 13]));
19+
20+
}
21+
22+
1423
#[test]
1524
fn test_mock_stream_write() {
16-
use std::io::Write;
1725
let mut s = MockStream::new();
18-
assert_eq!(s.write("abcd".as_bytes()), Ok(4));
19-
assert_eq!(s.pop_bytes_written().as_slice(), [97, 98, 99, 100]);
26+
assert_eq!(s.write("abcd".as_bytes()).unwrap(), 4);
27+
assert_eq!(s.pop_bytes_written().as_ref(), [97, 98, 99, 100]);
2028
assert!(s.pop_bytes_written().is_empty());
2129
}
2230

31+
2332
// *** Real-world example ***
2433

2534
/// ADT that represents some network stream
@@ -28,24 +37,24 @@ enum NetStream {
2837
//Tcp(TcpStream)
2938
}
3039

31-
impl io::Read for NetStream {
32-
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
40+
impl Read for NetStream {
41+
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
3342
match *self {
3443
NetStream::Mocked(ref mut s) => s.read(buf),
3544
//NetStream::Tcp(ref mut s) => s.read(buf),
3645
}
3746
}
3847
}
3948

40-
impl io::Write for NetStream {
41-
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
49+
impl Write for NetStream {
50+
fn write(&mut self, buf: &[u8]) -> Result<usize> {
4251
match *self {
4352
NetStream::Mocked(ref mut s) => s.write(buf),
4453
//NetStream::Tcp(ref mut s) => s.write(buf),
4554
}
4655
}
4756

48-
fn flush(&mut self) -> io::Result<()> {
57+
fn flush(&mut self) -> Result<()> {
4958
match *self {
5059
NetStream::Mocked(ref mut s) => s.flush(),
5160
//NetStream::Tcp(ref mut s) => s.flush(),
@@ -54,30 +63,26 @@ impl io::Write for NetStream {
5463
}
5564

5665
/// read 4 bytes from network, reverse them and write back
57-
fn reverse4(s: &mut NetStream) -> io::Result<usize> {
58-
use std::io::{Read, Write};
59-
66+
fn reverse4(s: &mut NetStream) -> Result<usize> {
6067
let mut v = [0; 4];
61-
let count = try![s.read(v.as_mut_slice())];
68+
let count = try![s.read(v.as_mut())];
6269
assert_eq!(count, 4);
6370
v.reverse();
64-
s.write(v.as_slice())
71+
s.write(v.as_ref())
6572
}
6673

6774
#[test]
6875
fn test_shared_mock_stream() {
69-
use std::io::Read;
70-
7176
let mut s = SharedMockStream::new();
7277
let mut e = NetStream::Mocked(s.clone());
7378

7479
// provide data to mock
75-
s.push_bytes_to_read([1, 2, 3, 4].as_slice());
80+
s.push_bytes_to_read([1, 2, 3, 4].as_ref());
7681
// check if io succeeded
77-
assert_eq!(reverse4(&mut e), Ok(4));
82+
assert_eq!(reverse4(&mut e).unwrap(), 4);
7883
// verify the data returned
79-
assert_eq!(s.pop_bytes_written().as_slice(), [4, 3, 2, 1]);
84+
assert_eq!(s.pop_bytes_written().as_ref(), [4, 3, 2, 1]);
8085

8186
// ensure no more bytes in stream
82-
assert_eq!(e.read(&mut [0; 4]), Ok(0));
87+
assert_eq!(e.read(&mut [0; 4]).unwrap(), 0);
8388
}

0 commit comments

Comments
 (0)