@@ -87,31 +87,28 @@ impl<'a> AsyncWrite for AsyncUdpSocket<'a> {
87
87
}
88
88
89
89
/// Dialer for connecting to a endpoint to get a async reader and a async writer.
90
- ///
91
- /// # Examples
92
- ///
93
- /// ```
94
- /// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
95
- ///
96
- /// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
97
- /// let dialer = Dialer::new(|addr| Box::pin(dial_tcp(addr)), socket);
98
- /// let (r, w) = dialer.dial().await.unwrap();
99
- /// ```
100
90
#[ derive( Debug ) ]
101
91
pub ( crate ) struct Dialer {
102
92
dial : DialFn ,
103
93
addr : SocketAddr ,
104
94
}
105
95
106
96
impl Dialer {
97
+ /// Create a new dialer.
107
98
pub ( crate ) fn new ( dial : DialFn , addr : SocketAddr ) -> Self {
108
99
Self { dial, addr }
109
100
}
110
101
102
+ /// Dial the endpoint.
103
+ ///
104
+ /// # Returns
105
+ ///
106
+ /// A future that resolves to a async reader and a async writer.
111
107
pub ( crate ) fn dial ( & self ) -> Pin < Box < dyn std:: future:: Future < Output = DialResult > + Send > > {
112
108
( self . dial ) ( self . addr )
113
109
}
114
110
111
+ /// Expose the address of the dialer.
115
112
pub ( crate ) fn addr ( & self ) -> SocketAddr {
116
113
self . addr
117
114
}
@@ -153,3 +150,40 @@ pub(crate) async fn dial_udp(local_endpoint: SocketAddr) -> DialResult {
153
150
Box :: new ( AsyncUdpSocket :: new ( socket) ) ,
154
151
) )
155
152
}
153
+
154
+ #[ cfg( test) ]
155
+ mod test {
156
+ use super :: * ;
157
+ use std:: net:: TcpListener as StdTcpListener ;
158
+
159
+ #[ tokio:: test]
160
+ async fn test_tcp_listener_and_dialer ( ) {
161
+ let port = free_port ( ) . unwrap ( ) ;
162
+ let listener = create_tcp_listener ( port) . await . unwrap ( ) ;
163
+
164
+ let dialer = Dialer :: new (
165
+ |addr| Box :: pin ( dial_tcp ( addr) ) ,
166
+ listener. local_addr ( ) . unwrap ( ) ,
167
+ ) ;
168
+ dialer. dial ( ) . await . unwrap ( ) ;
169
+ }
170
+
171
+ #[ tokio:: test]
172
+ async fn test_udp_socket_and_dialer ( ) {
173
+ let port = free_port ( ) . unwrap ( ) ;
174
+ let socket = create_udp_socket ( port) . await . unwrap ( ) ;
175
+
176
+ let dialer = Dialer :: new (
177
+ |addr| Box :: pin ( dial_udp ( addr) ) ,
178
+ socket. local_addr ( ) . unwrap ( ) ,
179
+ ) ;
180
+ dialer. dial ( ) . await . unwrap ( ) ;
181
+ }
182
+
183
+ /// free_port returns a free port number for testing.
184
+ fn free_port ( ) -> std:: io:: Result < u16 > {
185
+ let listener = StdTcpListener :: bind ( "127.0.0.1:0" ) ?;
186
+ let port = listener. local_addr ( ) ?. port ( ) ;
187
+ Ok ( port)
188
+ }
189
+ }
0 commit comments