@@ -118,3 +118,192 @@ impl TcpStream for async_std::net::TcpStream {
118
118
async_std:: net:: TcpStream :: local_addr ( self )
119
119
}
120
120
}
121
+
122
+ #[ cfg( test) ]
123
+ mod tests {
124
+ use super :: TcpConfig ;
125
+ use crate :: internal:: multiaddr_to_socketaddr;
126
+ use futures:: prelude:: * ;
127
+ use libp2p_core:: {
128
+ multiaddr:: { Multiaddr , Protocol } ,
129
+ transport:: ListenerEvent ,
130
+ Transport ,
131
+ } ;
132
+ use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
133
+
134
+ #[ test]
135
+ fn wildcard_expansion ( ) {
136
+ let mut listener = TcpConfig :: new ( )
137
+ . listen_on ( "/ip4/0.0.0.0/tcp/0" . parse ( ) . unwrap ( ) )
138
+ . expect ( "listener" ) ;
139
+
140
+ // Get the first address.
141
+ let addr = futures:: executor:: block_on_stream ( listener. by_ref ( ) )
142
+ . next ( )
143
+ . expect ( "some event" )
144
+ . expect ( "no error" )
145
+ . into_new_address ( )
146
+ . expect ( "listen address" ) ;
147
+
148
+ // Process all initial `NewAddress` events and make sure they
149
+ // do not contain wildcard address or port.
150
+ let server = listener
151
+ . take_while ( |event| match event. as_ref ( ) . unwrap ( ) {
152
+ ListenerEvent :: NewAddress ( a) => {
153
+ let mut iter = a. iter ( ) ;
154
+ match iter. next ( ) . expect ( "ip address" ) {
155
+ Protocol :: Ip4 ( ip) => assert ! ( !ip. is_unspecified( ) ) ,
156
+ Protocol :: Ip6 ( ip) => assert ! ( !ip. is_unspecified( ) ) ,
157
+ other => panic ! ( "Unexpected protocol: {}" , other) ,
158
+ }
159
+ if let Protocol :: Tcp ( port) = iter. next ( ) . expect ( "port" ) {
160
+ assert_ne ! ( 0 , port)
161
+ } else {
162
+ panic ! ( "No TCP port in address: {}" , a)
163
+ }
164
+ futures:: future:: ready ( true )
165
+ }
166
+ _ => futures:: future:: ready ( false ) ,
167
+ } )
168
+ . for_each ( |_| futures:: future:: ready ( ( ) ) ) ;
169
+
170
+ let client = TcpConfig :: new ( ) . dial ( addr) . expect ( "dialer" ) ;
171
+ async_std:: task:: block_on ( futures:: future:: join ( server, client) )
172
+ . 1
173
+ . unwrap ( ) ;
174
+ }
175
+
176
+ #[ test]
177
+ fn multiaddr_to_tcp_conversion ( ) {
178
+ use std:: net:: Ipv6Addr ;
179
+
180
+ assert ! (
181
+ multiaddr_to_socketaddr( & "/ip4/127.0.0.1/udp/1234" . parse:: <Multiaddr >( ) . unwrap( ) )
182
+ . is_err( )
183
+ ) ;
184
+
185
+ assert_eq ! (
186
+ multiaddr_to_socketaddr( & "/ip4/127.0.0.1/tcp/12345" . parse:: <Multiaddr >( ) . unwrap( ) ) ,
187
+ Ok ( SocketAddr :: new(
188
+ IpAddr :: V4 ( Ipv4Addr :: new( 127 , 0 , 0 , 1 ) ) ,
189
+ 12345 ,
190
+ ) )
191
+ ) ;
192
+ assert_eq ! (
193
+ multiaddr_to_socketaddr(
194
+ & "/ip4/255.255.255.255/tcp/8080"
195
+ . parse:: <Multiaddr >( )
196
+ . unwrap( )
197
+ ) ,
198
+ Ok ( SocketAddr :: new(
199
+ IpAddr :: V4 ( Ipv4Addr :: new( 255 , 255 , 255 , 255 ) ) ,
200
+ 8080 ,
201
+ ) )
202
+ ) ;
203
+ assert_eq ! (
204
+ multiaddr_to_socketaddr( & "/ip6/::1/tcp/12345" . parse:: <Multiaddr >( ) . unwrap( ) ) ,
205
+ Ok ( SocketAddr :: new(
206
+ IpAddr :: V6 ( Ipv6Addr :: new( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) ) ,
207
+ 12345 ,
208
+ ) )
209
+ ) ;
210
+ assert_eq ! (
211
+ multiaddr_to_socketaddr(
212
+ & "/ip6/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/tcp/8080"
213
+ . parse:: <Multiaddr >( )
214
+ . unwrap( )
215
+ ) ,
216
+ Ok ( SocketAddr :: new(
217
+ IpAddr :: V6 ( Ipv6Addr :: new(
218
+ 65535 , 65535 , 65535 , 65535 , 65535 , 65535 , 65535 , 65535 ,
219
+ ) ) ,
220
+ 8080 ,
221
+ ) )
222
+ ) ;
223
+ }
224
+
225
+ #[ test]
226
+ fn communicating_between_dialer_and_listener ( ) {
227
+ let ( ready_tx, ready_rx) = futures:: channel:: oneshot:: channel ( ) ;
228
+ let mut ready_tx = Some ( ready_tx) ;
229
+
230
+ async_std:: task:: spawn ( async move {
231
+ let addr = "/ip4/127.0.0.1/tcp/0" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
232
+ let tcp = TcpConfig :: new ( ) ;
233
+ let mut listener = tcp. listen_on ( addr) . unwrap ( ) ;
234
+
235
+ loop {
236
+ match listener. next ( ) . await . unwrap ( ) . unwrap ( ) {
237
+ ListenerEvent :: NewAddress ( listen_addr) => {
238
+ ready_tx. take ( ) . unwrap ( ) . send ( listen_addr) . unwrap ( ) ;
239
+ }
240
+ ListenerEvent :: Upgrade { upgrade, .. } => {
241
+ let mut upgrade = upgrade. await . unwrap ( ) ;
242
+ let mut buf = [ 0u8 ; 3 ] ;
243
+ upgrade. read_exact ( & mut buf) . await . unwrap ( ) ;
244
+ assert_eq ! ( buf, [ 1 , 2 , 3 ] ) ;
245
+ upgrade. write_all ( & [ 4 , 5 , 6 ] ) . await . unwrap ( ) ;
246
+ }
247
+ _ => unreachable ! ( ) ,
248
+ }
249
+ }
250
+ } ) ;
251
+
252
+ async_std:: task:: block_on ( async move {
253
+ let addr = ready_rx. await . unwrap ( ) ;
254
+ let tcp = TcpConfig :: new ( ) ;
255
+
256
+ // Obtain a future socket through dialing
257
+ let mut socket = tcp. dial ( addr. clone ( ) ) . unwrap ( ) . await . unwrap ( ) ;
258
+ socket. write_all ( & [ 0x1 , 0x2 , 0x3 ] ) . await . unwrap ( ) ;
259
+
260
+ let mut buf = [ 0u8 ; 3 ] ;
261
+ socket. read_exact ( & mut buf) . await . unwrap ( ) ;
262
+ assert_eq ! ( buf, [ 4 , 5 , 6 ] ) ;
263
+ } ) ;
264
+ }
265
+
266
+ #[ test]
267
+ fn replace_port_0_in_returned_multiaddr_ipv4 ( ) {
268
+ let tcp = TcpConfig :: new ( ) ;
269
+
270
+ let addr = "/ip4/127.0.0.1/tcp/0" . parse :: < Multiaddr > ( ) . unwrap ( ) ;
271
+ assert ! ( addr. to_string( ) . contains( "tcp/0" ) ) ;
272
+
273
+ let new_addr = futures:: executor:: block_on_stream ( tcp. listen_on ( addr) . unwrap ( ) )
274
+ . next ( )
275
+ . expect ( "some event" )
276
+ . expect ( "no error" )
277
+ . into_new_address ( )
278
+ . expect ( "listen address" ) ;
279
+
280
+ assert ! ( !new_addr. to_string( ) . contains( "tcp/0" ) ) ;
281
+ }
282
+
283
+ #[ test]
284
+ fn replace_port_0_in_returned_multiaddr_ipv6 ( ) {
285
+ let tcp = TcpConfig :: new ( ) ;
286
+
287
+ let addr: Multiaddr = "/ip6/::1/tcp/0" . parse ( ) . unwrap ( ) ;
288
+ assert ! ( addr. to_string( ) . contains( "tcp/0" ) ) ;
289
+
290
+ let new_addr = futures:: executor:: block_on_stream ( tcp. listen_on ( addr) . unwrap ( ) )
291
+ . next ( )
292
+ . expect ( "some event" )
293
+ . expect ( "no error" )
294
+ . into_new_address ( )
295
+ . expect ( "listen address" ) ;
296
+
297
+ assert ! ( !new_addr. to_string( ) . contains( "tcp/0" ) ) ;
298
+ }
299
+
300
+ #[ test]
301
+ fn larger_addr_denied ( ) {
302
+ let tcp = TcpConfig :: new ( ) ;
303
+
304
+ let addr = "/ip4/127.0.0.1/tcp/12345/tcp/12345"
305
+ . parse :: < Multiaddr > ( )
306
+ . unwrap ( ) ;
307
+ assert ! ( tcp. listen_on( addr) . is_err( ) ) ;
308
+ }
309
+ }
0 commit comments