5 use flate2
::read
::{GzDecoder, MultiGzDecoder}
;
6 use futures
::prelude
::*;
10 use std
::io
::{self, Read}
;
11 use tokio_io
::io
::read_to_end
;
12 use tokio_io
::AsyncRead
;
19 impl<T
> BadReader
<T
> {
20 fn new(reader
: T
) -> BadReader
<T
> {
21 BadReader { reader, x: true }
25 impl<T
: Read
> Read
for BadReader
<T
> {
26 fn read(&mut self, buf
: &mut [u8]) -> io
::Result
<usize> {
29 let len
= cmp
::min(buf
.len(), 1);
30 self.reader
.read(&mut buf
[..len
])
33 Err(io
::ErrorKind
::WouldBlock
.into())
38 struct AssertAsync
<T
>(T
);
40 impl<T
: Read
> Read
for AssertAsync
<T
> {
41 fn read(&mut self, buf
: &mut [u8]) -> io
::Result
<usize> {
46 impl<T
: Read
> AsyncRead
for AssertAsync
<T
> {}
48 struct AlwaysNotify
<T
>(T
);
50 impl<T
: Future
> Future
for AlwaysNotify
<T
> {
52 type Error
= T
::Error
;
54 fn poll(&mut self) -> Poll
<Self::Item
, Self::Error
> {
55 let ret
= self.0.poll();
56 if let Ok(Async
::NotReady
) = &ret
{
57 task
::current().notify();
64 fn test_gz_asyncread() {
65 let f
= File
::open("tests/good-file.gz").unwrap();
67 let fut
= read_to_end(AssertAsync(GzDecoder
::new(BadReader
::new(f
))), Vec
::new());
68 let (_
, content
) = AlwaysNotify(fut
).wait().unwrap();
70 let mut expected
= Vec
::new();
71 File
::open("tests/good-file.txt")
73 .read_to_end(&mut expected
)
76 assert_eq
!(content
, expected
);
80 fn test_multi_gz_asyncread() {
81 let f
= File
::open("tests/multi.gz").unwrap();
83 let fut
= read_to_end(
84 AssertAsync(MultiGzDecoder
::new(BadReader
::new(f
))),
87 let (_
, content
) = AlwaysNotify(fut
).wait().unwrap();
89 let mut expected
= Vec
::new();
90 File
::open("tests/multi.txt")
92 .read_to_end(&mut expected
)
95 assert_eq
!(content
, expected
);