|
1 | 1 | use std::{ |
2 | | - net::{IpAddr, SocketAddr}, |
| 2 | + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, |
3 | 3 | panic::resume_unwind, |
4 | 4 | }; |
5 | 5 |
|
@@ -42,6 +42,44 @@ test_connect_ip! { |
42 | 42 | (connect_v6, "[::1]:0", SocketAddr::is_ipv6), |
43 | 43 | } |
44 | 44 |
|
| 45 | +async fn test_bind_and_connect_ip_impl( |
| 46 | + bind_addr: SocketAddr, |
| 47 | + target: impl ToSocketAddrsAsync, |
| 48 | + assert_fn: impl FnOnce(&SocketAddr) -> bool, |
| 49 | +) { |
| 50 | + let listener = TcpListener::bind(target).await.unwrap(); |
| 51 | + let addr = listener.local_addr().unwrap(); |
| 52 | + assert!(assert_fn(&addr)); |
| 53 | + |
| 54 | + let task = compio_runtime::spawn(async move { |
| 55 | + let (socket, addr) = listener.accept().await.unwrap(); |
| 56 | + assert_eq!(addr, socket.peer_addr().unwrap()); |
| 57 | + socket |
| 58 | + }); |
| 59 | + |
| 60 | + let mine = TcpStream::bind_and_connect(bind_addr, &addr).await.unwrap(); |
| 61 | + let theirs = task.await.unwrap_or_else(|e| resume_unwind(e)); |
| 62 | + |
| 63 | + assert_eq!(mine.local_addr().unwrap(), theirs.peer_addr().unwrap()); |
| 64 | + assert_eq!(theirs.local_addr().unwrap(), mine.peer_addr().unwrap()); |
| 65 | +} |
| 66 | + |
| 67 | +macro_rules! test_bind_and_connect_ip { |
| 68 | + ($(($ident:ident, $bind_addr:expr, $target:expr, $addr_f:path),)*) => { |
| 69 | + $( |
| 70 | + #[compio_macros::test] |
| 71 | + async fn $ident() { |
| 72 | + test_bind_and_connect_ip_impl($bind_addr, $target, $addr_f).await; |
| 73 | + } |
| 74 | + )* |
| 75 | + } |
| 76 | +} |
| 77 | + |
| 78 | +test_bind_and_connect_ip! { |
| 79 | + (bind_and_connect_v4, SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 0), "127.0.0.1:0", SocketAddr::is_ipv4), |
| 80 | + (bind_and_connect_v6, SocketAddr::new(Ipv6Addr::LOCALHOST.into(), 0), "[::1]:0", SocketAddr::is_ipv6), |
| 81 | +} |
| 82 | + |
45 | 83 | async fn test_connect_impl<A: ToSocketAddrsAsync>(mapping: impl FnOnce(&TcpListener) -> A) { |
46 | 84 | let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); |
47 | 85 | let addr = mapping(&listener); |
|
0 commit comments