Skip to content

Commit 04ab75f

Browse files
Move tests to async-std file
1 parent 3f38c78 commit 04ab75f

File tree

2 files changed

+190
-196
lines changed

2 files changed

+190
-196
lines changed

transports/tcp/src/async_std.rs

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,192 @@ impl TcpStream for async_std::net::TcpStream {
118118
async_std::net::TcpStream::local_addr(self)
119119
}
120120
}
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

Comments
 (0)