@@ -5,13 +5,15 @@ extern crate serde;
5
5
6
6
use std:: any:: Any ;
7
7
use std:: io:: { BufReader , BufWriter , ErrorKind as IoErrorKind } ;
8
+ use std:: io:: prelude:: * ;
8
9
use std:: net:: { TcpListener , TcpStream } ;
9
10
use std:: thread:: JoinHandle ;
10
11
11
12
use rand:: { FromEntropy , RngCore , rngs:: SmallRng } ;
12
- use tcp_channel:: { SenderBuilder , ReceiverBuilder , ChannelSend , ChannelRecv , BigEndian , DEFAULT_MAX_SIZE } ;
13
+ use serde:: de:: DeserializeOwned ;
14
+ use tcp_channel:: { SenderBuilder , ReceiverBuilder , ChannelSend , ChannelRecv , BigEndian , Receiver as TcpReceiver , RecvError , DEFAULT_MAX_SIZE } ;
13
15
14
- // This emulates a real TCP connection.
16
+ // This emulates a real delayed TCP connection.
15
17
mod slow_io;
16
18
use slow_io:: { SlowReader , SlowWriter } ;
17
19
@@ -50,6 +52,18 @@ quick_error! {
50
52
}
51
53
}
52
54
55
+ fn pretend_blocking_read < T : DeserializeOwned , R : Read > ( receiver : & mut TcpReceiver < T , BigEndian , R > ) -> Result < T , RecvError > {
56
+ loop {
57
+ match receiver. recv ( ) {
58
+ Ok ( value) => return Ok ( value) ,
59
+ Err ( RecvError :: IoError ( ioerror) ) => match ioerror. kind ( ) {
60
+ IoErrorKind :: WouldBlock => continue ,
61
+ _ => return Err ( RecvError :: IoError ( ioerror) . into ( ) ) ,
62
+ }
63
+ Err ( error) => return Err ( error. into ( ) ) ,
64
+ }
65
+ }
66
+ }
53
67
fn blob ( slow : bool , blocking : bool , max_size : usize ) -> Result < ( ) , Error > {
54
68
const SIZE : usize = 262_144 ;
55
69
// This test generates a random 256KiB BLOB, sends it, and then receives the BLOB, where every byte is
@@ -72,46 +86,46 @@ fn blob(slow: bool, blocking: bool, max_size: usize) -> Result<(), Error> {
72
86
break Err ( ioerror)
73
87
}
74
88
}
75
- } ? ;
89
+ } . unwrap ( ) ;
76
90
77
- sender. send ( port) ? ;
78
- let ( stream, _) = listener. accept ( ) ? ;
91
+ sender. send ( port) . unwrap ( ) ;
92
+ let ( stream, _) = listener. accept ( ) . unwrap ( ) ;
79
93
80
94
let mut receiver = ReceiverBuilder :: buffered ( )
81
95
. with_type :: < Request > ( )
82
96
. with_endianness :: < BigEndian > ( )
83
97
. with_reader :: < BufReader < SlowReader < TcpStream > > > ( )
84
98
. with_max_size ( max_size)
85
- . build ( BufReader :: new ( SlowReader :: new ( stream. try_clone ( ) ? , slow, blocking) ) ) ;
99
+ . build ( BufReader :: new ( SlowReader :: new ( stream. try_clone ( ) . unwrap ( ) , slow, blocking) ) ) ;
86
100
87
101
let mut sender = SenderBuilder :: buffered ( )
88
102
. with_type :: < Response > ( )
89
103
. with_endianness :: < BigEndian > ( )
90
104
. with_writer :: < BufWriter < SlowWriter < TcpStream > > > ( )
91
- . build ( BufWriter :: new ( SlowWriter :: new ( stream, slow, blocking ) ) ) ;
105
+ . build ( BufWriter :: new ( SlowWriter :: new ( stream, slow, true ) ) ) ;
92
106
93
- while let Ok ( command) = receiver . recv ( ) {
107
+ while let Ok ( command) = pretend_blocking_read ( & mut receiver ) {
94
108
match command {
95
109
Request :: SendBlob ( mut blob) => {
96
110
for byte in blob. iter_mut ( ) {
97
111
* byte = byte. wrapping_add ( 1 )
98
112
}
99
- sender. send ( & Response :: Respond ( blob) ) ? ;
100
- sender. flush ( ) ? ;
113
+ sender. send ( & Response :: Respond ( blob) ) . unwrap ( ) ;
114
+ sender. flush ( ) . unwrap ( ) ;
101
115
} ,
102
116
Request :: Stop => return Ok ( ( ) )
103
117
}
104
118
}
105
119
106
120
Ok ( ( ) )
107
121
} ) ;
108
- let port = receiver. recv ( ) ? ;
109
- let stream = TcpStream :: connect ( format ! ( "127.0.0.1:{}" , port) ) ? ;
122
+ let port = receiver. recv ( ) . unwrap ( ) ;
123
+ let stream = TcpStream :: connect ( format ! ( "127.0.0.1:{}" , port) ) . unwrap ( ) ;
110
124
let mut sender = SenderBuilder :: realtime ( )
111
125
. with_type :: < Request > ( )
112
126
. with_writer :: < SlowWriter < TcpStream > > ( )
113
127
. with_endianness :: < BigEndian > ( )
114
- . build ( SlowWriter :: new ( stream. try_clone ( ) ? , slow, blocking ) ) ;
128
+ . build ( SlowWriter :: new ( stream. try_clone ( ) . unwrap ( ) , slow, true ) ) ;
115
129
116
130
let mut receiver = ReceiverBuilder :: buffered ( )
117
131
. with_type :: < Response > ( )
@@ -128,23 +142,24 @@ fn blob(slow: bool, blocking: bool, max_size: usize) -> Result<(), Error> {
128
142
blob. into_boxed_slice ( )
129
143
} ;
130
144
131
- sender. send ( & Request :: SendBlob ( blob. clone ( ) ) ) ? ;
132
- sender. flush ( ) ? ;
145
+ sender. send ( & Request :: SendBlob ( blob. clone ( ) ) ) . unwrap ( ) ;
146
+ sender. flush ( ) . unwrap ( ) ;
133
147
134
- let new_blob = match receiver. recv ( ) ? {
135
- Response :: Respond ( new_blob ) => new_blob ,
148
+ let new_blob = match pretend_blocking_read ( & mut receiver) . unwrap ( ) {
149
+ Response :: Respond ( blob ) => blob ,
136
150
} ;
137
151
let precalculated_new_blob = blob. into_iter ( )
138
152
. map ( |byte| byte. wrapping_add ( 1 ) )
139
153
. collect :: < Box < [ u8 ] > > ( ) ;
140
154
141
155
assert_ne ! ( blob, new_blob) ;
142
156
assert_eq ! ( new_blob, precalculated_new_blob) ;
157
+ println ! ( "Asserted" ) ;
143
158
144
- sender. send ( & Request :: Stop ) ? ;
145
- sender. flush ( ) ? ;
159
+ sender. send ( & Request :: Stop ) . unwrap ( ) ;
160
+ sender. flush ( ) . unwrap ( ) ;
146
161
147
- thread. join ( ) ?? ;
162
+ thread. join ( ) . unwrap ( ) . unwrap ( ) ;
148
163
149
164
Ok ( ( ) )
150
165
}
@@ -153,10 +168,6 @@ fn fast_blob() -> Result<(), Error> {
153
168
blob ( false , true , DEFAULT_MAX_SIZE )
154
169
}
155
170
#[ test]
156
- fn fast_nonblocking_blob ( ) -> Result < ( ) , Error > {
157
- blob ( false , false , DEFAULT_MAX_SIZE )
158
- }
159
- #[ test]
160
171
fn slow_blob ( ) -> Result < ( ) , Error > {
161
172
blob ( true , true , DEFAULT_MAX_SIZE )
162
173
}
0 commit comments