@@ -240,16 +240,17 @@ where
240240#[ cfg( test) ]
241241mod tests {
242242 use ppp:: model:: { Addresses , Command , Header , Protocol , Version } ;
243- use std:: io:: Cursor ;
243+ use std:: io:: { Error as IoError , ErrorKind , Result as IoResult } ;
244244 use std:: net:: SocketAddr ;
245245 use tokio:: io:: AsyncReadExt ;
246+ use tokio_test:: io:: Builder ;
246247
247- use super :: { format_header, ToProxyStream } ;
248+ use super :: { format_header, RemoteAddr , ToProxyStream } ;
248249 use crate :: config:: ProxyProtocol ;
249250
250251 #[ tokio:: test]
251252 async fn test_disabled ( ) {
252- let mut proxy_stream = Cursor :: new ( vec ! [ ] ) . source ( ProxyProtocol :: Disabled ) ;
253+ let mut proxy_stream = Builder :: new ( ) . build ( ) . source ( ProxyProtocol :: Disabled ) ;
253254 assert ! ( proxy_stream. real_addr( ) . await . unwrap( ) . is_none( ) ) ;
254255 }
255256
@@ -272,25 +273,26 @@ mod tests {
272273 async fn test_header_parsing ( ) {
273274 let mut header = ppp:: to_bytes ( generate_ipv4 ( ) ) . unwrap ( ) ;
274275 header. extend_from_slice ( "Test" . as_ref ( ) ) ;
275- let mut header = Cursor :: new ( header) . source ( ProxyProtocol :: Enabled ) ;
276276
277- let actual = header. real_addr ( ) . await . unwrap ( ) . unwrap ( ) ;
277+ let proxy_stream = & mut & mut header[ ..] . source ( ProxyProtocol :: Enabled ) ;
278+
279+ let actual = proxy_stream. real_addr ( ) . await . unwrap ( ) . unwrap ( ) ;
278280
279281 assert_eq ! ( SocketAddr :: from( ( [ 1 , 1 , 1 , 1 ] , 24034 ) ) , actual) ;
280282
281283 let mut actual = String :: new ( ) ;
282- let size = header . read_to_string ( & mut actual) . await . unwrap ( ) ;
284+ let size = proxy_stream . read_to_string ( & mut actual) . await . unwrap ( ) ;
283285 assert_eq ! ( 4 , size) ;
284286 assert_eq ! ( "Test" , actual) ;
285287 }
286288
287289 #[ tokio:: test]
288290 async fn test_incomplete ( ) {
289291 let header = ppp:: to_bytes ( generate_ipv4 ( ) ) . unwrap ( ) ;
290- let header = & mut & header[ ..10 ] ;
291- let mut header = header. source ( ProxyProtocol :: Enabled ) ;
292292
293+ let header = & mut & mut header[ ..10 ] . source ( ProxyProtocol :: Enabled ) ;
293294 let actual = header. real_addr ( ) . await . unwrap_err ( ) ;
295+
294296 assert_eq ! (
295297 format!( "{}" , actual) ,
296298 "Stream finished before end of proxy protocol header"
@@ -300,14 +302,28 @@ mod tests {
300302 #[ tokio:: test]
301303 async fn test_failure ( ) {
302304 let invalid = Vec :: from ( "invalid header" ) ;
303- let invalid = & mut & invalid[ ..] ;
304-
305- let mut invalid = invalid. source ( ProxyProtocol :: Enabled ) ;
305+ let invalid = & mut & mut invalid[ ..] . source ( ProxyProtocol :: Enabled ) ;
306306
307307 let actual = invalid. real_addr ( ) . await . unwrap_err ( ) ;
308308 assert_eq ! ( format!( "{}" , actual) , "Proxy Parser Error" ) ;
309309 }
310310
311+ #[ tokio:: test]
312+ async fn test_io_error ( ) {
313+ // builder needs to be dropped before stream can be used
314+ // otherwise the internal tokio arc error has 2 strong references
315+ let mut proxy_stream = {
316+ let header = ppp:: to_bytes ( generate_ipv4 ( ) ) . unwrap ( ) ;
317+ let mut builder = Builder :: new ( ) ;
318+ builder. read ( & header[ ..10 ] ) ;
319+ builder. read_error ( IoError :: new ( ErrorKind :: Other , "Error on IO" ) ) ;
320+ builder. build ( ) . source ( ProxyProtocol :: Enabled )
321+ } ;
322+
323+ let error = proxy_stream. real_addr ( ) . await . unwrap_err ( ) ;
324+ assert_eq ! ( "Error on IO" , format!( "{}" , error) ) ;
325+ }
326+
311327 #[ test]
312328 fn test_addresses ( ) {
313329 let address = [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ;
@@ -323,4 +339,17 @@ mod tests {
323339
324340 assert ! ( format_header( generate_header( addresses) ) . is_err( ) ) ;
325341 }
342+
343+ #[ test]
344+ fn test_remote_addr_delegation ( ) {
345+ impl RemoteAddr for & [ u8 ] {
346+ fn remote_addr ( & self ) -> IoResult < SocketAddr > {
347+ Ok ( SocketAddr :: from ( ( [ 1 , 1 , 1 , 1 ] , 443 ) ) )
348+ }
349+ }
350+
351+ let proxy_stream = & mut & [ ] . source ( ProxyProtocol :: Enabled ) ;
352+ let actual = proxy_stream. remote_addr ( ) . unwrap ( ) ;
353+ assert_eq ! ( SocketAddr :: from( ( [ 1 , 1 , 1 , 1 ] , 443 ) ) , actual)
354+ }
326355}
0 commit comments