diff options
Diffstat (limited to 'vendor/rustix/tests/net')
-rw-r--r-- | vendor/rustix/tests/net/addr.rs | 92 | ||||
-rw-r--r-- | vendor/rustix/tests/net/connect_bind_send.rs | 487 | ||||
-rw-r--r-- | vendor/rustix/tests/net/main.rs | 32 | ||||
-rw-r--r-- | vendor/rustix/tests/net/poll.rs | 119 | ||||
-rw-r--r-- | vendor/rustix/tests/net/sockopt.rs | 158 | ||||
-rw-r--r-- | vendor/rustix/tests/net/unix.rs | 147 | ||||
-rw-r--r-- | vendor/rustix/tests/net/v4.rs | 86 | ||||
-rw-r--r-- | vendor/rustix/tests/net/v6.rs | 95 |
8 files changed, 1216 insertions, 0 deletions
diff --git a/vendor/rustix/tests/net/addr.rs b/vendor/rustix/tests/net/addr.rs new file mode 100644 index 000000000..124413132 --- /dev/null +++ b/vendor/rustix/tests/net/addr.rs @@ -0,0 +1,92 @@ +#[test] +fn encode_decode() { + #[cfg(unix)] + use rustix::net::SocketAddrUnix; + use rustix::net::{ + Ipv4Addr, Ipv6Addr, SocketAddrAny, SocketAddrStorage, SocketAddrV4, SocketAddrV6, + }; + + unsafe { + let orig = SocketAddrV4::new(Ipv4Addr::new(2, 3, 5, 6), 33); + let mut encoded = std::mem::MaybeUninit::<SocketAddrStorage>::uninit(); + let len = SocketAddrAny::V4(orig).write(encoded.as_mut_ptr()); + let decoded = SocketAddrAny::read(encoded.as_ptr(), len).unwrap(); + assert_eq!(decoded, SocketAddrAny::V4(orig)); + + let orig = SocketAddrV6::new(Ipv6Addr::new(2, 3, 5, 6, 8, 9, 11, 12), 33, 34, 36); + let mut encoded = std::mem::MaybeUninit::<SocketAddrStorage>::uninit(); + let len = SocketAddrAny::V6(orig).write(encoded.as_mut_ptr()); + let decoded = SocketAddrAny::read(encoded.as_ptr(), len).unwrap(); + assert_eq!(decoded, SocketAddrAny::V6(orig)); + + #[cfg(not(windows))] + { + let orig = SocketAddrUnix::new("/path/to/socket").unwrap(); + let mut encoded = std::mem::MaybeUninit::<SocketAddrStorage>::uninit(); + let len = SocketAddrAny::Unix(orig.clone()).write(encoded.as_mut_ptr()); + let decoded = SocketAddrAny::read(encoded.as_ptr(), len).unwrap(); + assert_eq!(decoded, SocketAddrAny::Unix(orig)); + } + } +} + +#[cfg(not(windows))] +#[test] +fn test_unix_addr() { + use rustix::cstr; + use rustix::net::SocketAddrUnix; + + assert_eq!( + SocketAddrUnix::new("/").unwrap().path().unwrap(), + cstr!("/") + ); + assert_eq!( + SocketAddrUnix::new("//").unwrap().path().unwrap(), + cstr!("//") + ); + assert_eq!( + SocketAddrUnix::new("/foo/bar").unwrap().path().unwrap(), + cstr!("/foo/bar") + ); + assert_eq!( + SocketAddrUnix::new("foo").unwrap().path().unwrap(), + cstr!("foo") + ); + SocketAddrUnix::new("/foo\0/bar").unwrap_err(); + assert!(SocketAddrUnix::new("").unwrap().path().is_none()); + + #[cfg(any(target_os = "android", target_os = "linux"))] + { + assert!(SocketAddrUnix::new("foo") + .unwrap() + .abstract_name() + .is_none()); + + assert_eq!( + SocketAddrUnix::new_abstract_name(b"test") + .unwrap() + .abstract_name() + .unwrap(), + b"test" + ); + assert_eq!( + SocketAddrUnix::new_abstract_name(b"") + .unwrap() + .abstract_name() + .unwrap(), + b"" + ); + assert_eq!( + SocketAddrUnix::new_abstract_name(b"this\0that") + .unwrap() + .abstract_name() + .unwrap(), + b"this\0that" + ); + SocketAddrUnix::new_abstract_name(&[b'a'; 500]).unwrap_err(); + assert!(SocketAddrUnix::new_abstract_name(b"test") + .unwrap() + .path() + .is_none()); + } +} diff --git a/vendor/rustix/tests/net/connect_bind_send.rs b/vendor/rustix/tests/net/connect_bind_send.rs new file mode 100644 index 000000000..84720975f --- /dev/null +++ b/vendor/rustix/tests/net/connect_bind_send.rs @@ -0,0 +1,487 @@ +use rustix::net::{ + AddressFamily, Ipv6Addr, Protocol, RecvFlags, SendFlags, SocketAddrAny, SocketAddrV4, + SocketAddrV6, SocketType, +}; +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; + +/// Test `connect_any`. +#[test] +fn net_v4_connect_any() -> std::io::Result<()> { + let localhost = IpAddr::V4(Ipv4Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = + rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} + +/// Similar, but with V6. +#[test] +fn net_v6_connect_any() -> std::io::Result<()> { + let localhost = IpAddr::V6(Ipv6Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} + +/// Test `connect` with a `SocketAddr`. +#[test] +fn net_v4_connect() -> std::io::Result<()> { + let localhost = IpAddr::V4(Ipv4Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = + rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let local_addr = match local_addr { + SocketAddrAny::V4(v4) => SocketAddr::V4(v4), + other => panic!("unexpected socket address {:?}", other), + }; + let sender = rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::connect(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} + +/// Similar, but use V6. +#[test] +fn net_v6_connect() -> std::io::Result<()> { + let localhost = IpAddr::V6(Ipv6Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let local_addr = match local_addr { + SocketAddrAny::V6(v6) => SocketAddr::V6(v6), + other => panic!("unexpected socket address {:?}", other), + }; + let sender = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::connect(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} + +/// Test `bind_any`. +#[test] +fn net_v4_bind_any() -> std::io::Result<()> { + let localhost = Ipv4Addr::LOCALHOST; + let addr = SocketAddrAny::V4(SocketAddrV4::new(localhost, 0)); + let listener = + rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::bind_any(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} + +/// Similar, but use V6. +#[test] +fn net_v6_bind_any() -> std::io::Result<()> { + let localhost = Ipv6Addr::LOCALHOST; + let addr = SocketAddrAny::V6(SocketAddrV6::new(localhost, 0, 0, 0)); + let listener = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::bind_any(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} + +/// Test `sendto`. +#[test] +fn net_v4_sendto() -> std::io::Result<()> { + let localhost = IpAddr::V4(Ipv4Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = + rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let local_addr = match local_addr { + SocketAddrAny::V4(v4) => SocketAddr::V4(v4), + other => panic!("unexpected socket address {:?}", other), + }; + let n = rustix::net::sendto(&sender, request, SendFlags::empty(), &local_addr).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let (n, from) = + rustix::net::recvfrom(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + assert!(from.is_none()); + + Ok(()) +} + +/// Similar, but with V6. +#[test] +fn net_v6_sendto() -> std::io::Result<()> { + let localhost = IpAddr::V6(Ipv6Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let local_addr = match local_addr { + SocketAddrAny::V6(v6) => SocketAddr::V6(v6), + other => panic!("unexpected socket address {:?}", other), + }; + let n = rustix::net::sendto(&sender, request, SendFlags::empty(), &local_addr).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let (n, from) = + rustix::net::recvfrom(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + assert!(from.is_none()); + + Ok(()) +} + +/// Test `sendto_any`. +#[test] +fn net_v4_sendto_any() -> std::io::Result<()> { + let localhost = IpAddr::V4(Ipv4Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = + rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = + rustix::net::sendto_any(&sender, request, SendFlags::empty(), &local_addr).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let (n, from) = + rustix::net::recvfrom(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + assert!(from.is_none()); + + Ok(()) +} + +/// Test `sendto_any`. +#[test] +fn net_v6_sendto_any() -> std::io::Result<()> { + let localhost = IpAddr::V6(Ipv6Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = + rustix::net::sendto_any(&sender, request, SendFlags::empty(), &local_addr).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let accepted = rustix::net::accept(&listener).expect("accept"); + let mut response = [0_u8; 128]; + let (n, from) = + rustix::net::recvfrom(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + assert!(from.is_none()); + + Ok(()) +} + +/// Test `acceptfrom`. +#[test] +fn net_v4_acceptfrom() -> std::io::Result<()> { + let localhost = IpAddr::V4(Ipv4Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = + rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default())?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let (accepted, from) = rustix::net::acceptfrom(&listener).expect("accept"); + + assert_ne!(from.clone().unwrap(), local_addr); + + let from = match from.unwrap() { + SocketAddrAny::V4(v4) => v4, + other => panic!("unexpected socket address {:?}", other), + }; + let local_addr = match local_addr { + SocketAddrAny::V4(v4) => v4, + other => panic!("unexpected socket address {:?}", other), + }; + + assert_eq!(from.clone().ip(), local_addr.ip()); + assert_ne!(from.clone().port(), local_addr.port()); + + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} + +/// Similar, but with V6. +#[test] +fn net_v6_acceptfrom() -> std::io::Result<()> { + let localhost = IpAddr::V6(Ipv6Addr::LOCALHOST); + let addr = SocketAddr::new(localhost, 0); + let listener = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::bind(&listener, &addr).expect("bind"); + rustix::net::listen(&listener, 1).expect("listen"); + + let local_addr = rustix::net::getsockname(&listener)?; + let sender = rustix::net::socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + )?; + rustix::net::connect_any(&sender, &local_addr).expect("connect"); + let request = b"Hello, World!!!"; + let n = rustix::net::send(&sender, request, SendFlags::empty()).expect("send"); + drop(sender); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + let (accepted, from) = rustix::net::acceptfrom(&listener).expect("accept"); + + assert_ne!(from.clone().unwrap(), local_addr); + + let from = match from.unwrap() { + SocketAddrAny::V6(v6) => v6, + other => panic!("unexpected socket address {:?}", other), + }; + let local_addr = match local_addr { + SocketAddrAny::V6(v6) => v6, + other => panic!("unexpected socket address {:?}", other), + }; + + assert_eq!(from.clone().ip(), local_addr.ip()); + assert_ne!(from.clone().port(), local_addr.port()); + + let mut response = [0_u8; 128]; + let n = rustix::net::recv(&accepted, &mut response, RecvFlags::empty()).expect("recv"); + + // Not strictly required, but it makes the test simpler. + assert_eq!(n, request.len()); + + assert_eq!(request, &response[..n]); + + Ok(()) +} diff --git a/vendor/rustix/tests/net/main.rs b/vendor/rustix/tests/net/main.rs new file mode 100644 index 000000000..0745282aa --- /dev/null +++ b/vendor/rustix/tests/net/main.rs @@ -0,0 +1,32 @@ +//! Tests for [`rustix::net`]. + +#![cfg(feature = "net")] +#![cfg_attr(target_os = "wasi", feature(wasi_ext))] +#![cfg(not(any(target_os = "redox", target_os = "wasi")))] +#![cfg_attr(io_lifetimes_use_std, feature(io_safety))] +#![cfg_attr(core_c_str, feature(core_c_str))] + +mod addr; +mod connect_bind_send; +mod poll; +mod sockopt; +#[cfg(unix)] +mod unix; +mod v4; +mod v6; + +/// Windows requires us to call a setup function before using any of the +/// socket APIs. +#[cfg(windows)] +#[ctor::ctor] +fn windows_startup() { + let _ = rustix::net::wsa_startup().unwrap(); +} + +/// Windows requires us to call a cleanup function after using any of the +/// socket APIs. +#[cfg(windows)] +#[ctor::dtor] +fn windows_shutdown() { + rustix::net::wsa_cleanup().unwrap(); +} diff --git a/vendor/rustix/tests/net/poll.rs b/vendor/rustix/tests/net/poll.rs new file mode 100644 index 000000000..7933983f2 --- /dev/null +++ b/vendor/rustix/tests/net/poll.rs @@ -0,0 +1,119 @@ +//! The same as v6.rs, but with `poll` calls. + +#![cfg(not(any(target_os = "redox", target_os = "wasi")))] + +use rustix::io::{poll, PollFd, PollFlags}; +use rustix::net::{ + accept, bind_v6, connect_v6, getsockname, listen, recv, send, socket, AddressFamily, Ipv6Addr, + Protocol, RecvFlags, SendFlags, SocketAddrAny, SocketAddrV6, SocketType, +}; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread; + +const BUFFER_SIZE: usize = 20; + +fn server(ready: Arc<(Mutex<u16>, Condvar)>) { + let connection_socket = socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + ) + .unwrap(); + + let name = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 0, 0, 0); + bind_v6(&connection_socket, &name).unwrap(); + + let who = match getsockname(&connection_socket).unwrap() { + SocketAddrAny::V6(addr) => addr, + _ => panic!(), + }; + + listen(&connection_socket, 1).unwrap(); + + { + let (lock, cvar) = &*ready; + let mut port = lock.lock().unwrap(); + *port = who.port(); + cvar.notify_all(); + } + + let mut buffer = vec![0; BUFFER_SIZE]; + let data_socket = accept(&connection_socket).unwrap(); + + let mut fds = [PollFd::new(&data_socket, PollFlags::IN)]; + assert_eq!(poll(&mut fds, -1).unwrap(), 1); + assert!(fds[0].revents().intersects(PollFlags::IN)); + assert!(!fds[0].revents().intersects(PollFlags::OUT)); + + let expected_nread = rustix::io::ioctl_fionread(&data_socket).unwrap(); + let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap(); + assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "hello, world"); + assert_eq!(expected_nread, nread as u64); + + let mut fds = [PollFd::new(&data_socket, PollFlags::OUT)]; + assert_eq!(poll(&mut fds, -1).unwrap(), 1); + assert!(!fds[0].revents().intersects(PollFlags::IN)); + assert!(fds[0].revents().intersects(PollFlags::OUT)); + + send(&data_socket, b"goodnight, moon", SendFlags::empty()).unwrap(); +} + +fn client(ready: Arc<(Mutex<u16>, Condvar)>) { + let port = { + let (lock, cvar) = &*ready; + let mut port = lock.lock().unwrap(); + while *port == 0 { + port = cvar.wait(port).unwrap(); + } + *port + }; + + let addr = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), port, 0, 0); + let mut buffer = vec![0; BUFFER_SIZE]; + + let data_socket = socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + ) + .unwrap(); + connect_v6(&data_socket, &addr).unwrap(); + + let mut fds = [PollFd::new(&data_socket, PollFlags::OUT)]; + assert_eq!(poll(&mut fds, -1).unwrap(), 1); + assert!(!fds[0].revents().intersects(PollFlags::IN)); + assert!(fds[0].revents().intersects(PollFlags::OUT)); + + send(&data_socket, b"hello, world", SendFlags::empty()).unwrap(); + + let mut fds = [PollFd::new(&data_socket, PollFlags::IN)]; + assert_eq!(poll(&mut fds, -1).unwrap(), 1); + assert!(fds[0].revents().intersects(PollFlags::IN)); + assert!(!fds[0].revents().intersects(PollFlags::OUT)); + + let expected_nread = rustix::io::ioctl_fionread(&data_socket).unwrap(); + let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap(); + assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "goodnight, moon"); + assert_eq!(expected_nread, nread as u64); +} + +#[test] +fn test_poll() { + let ready = Arc::new((Mutex::new(0_u16), Condvar::new())); + let ready_clone = Arc::clone(&ready); + + let server = thread::Builder::new() + .name("server".to_string()) + .spawn(move || { + server(ready); + }) + .unwrap(); + let client = thread::Builder::new() + .name("client".to_string()) + .spawn(move || { + client(ready_clone); + }) + .unwrap(); + client.join().unwrap(); + server.join().unwrap(); +} diff --git a/vendor/rustix/tests/net/sockopt.rs b/vendor/rustix/tests/net/sockopt.rs new file mode 100644 index 000000000..8e4cf52e8 --- /dev/null +++ b/vendor/rustix/tests/net/sockopt.rs @@ -0,0 +1,158 @@ +#[test] +fn test_sockopts() { + use rustix::net::{AddressFamily, Protocol, SocketType}; + use std::time::Duration; + + let s = + rustix::net::socket(AddressFamily::INET, SocketType::STREAM, Protocol::default()).unwrap(); + + // On a new socket we shouldn't have a timeout yet. + assert!( + rustix::net::sockopt::get_socket_timeout(&s, rustix::net::sockopt::Timeout::Recv) + .unwrap() + .is_none() + ); + assert_eq!( + rustix::net::sockopt::get_socket_type(&s).unwrap(), + SocketType::STREAM + ); + #[cfg(not(windows))] + assert_eq!( + rustix::net::sockopt::get_socket_broadcast(&s).unwrap(), + false + ); + // On a new socket we shouldn't have a linger yet. + assert!(rustix::net::sockopt::get_socket_linger(&s) + .unwrap() + .is_none()); + #[cfg(any(target_os = "android", target_os = "linux"))] + assert_eq!( + rustix::net::sockopt::get_socket_passcred(&s).unwrap(), + false + ); + assert_ne!(rustix::net::sockopt::get_ip_ttl(&s).unwrap(), 0); + assert_ne!(rustix::net::sockopt::get_ip_ttl(&s).unwrap(), 77); + #[cfg(not(any( + windows, + target_os = "dragonfly", + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + )))] + assert_eq!( + rustix::net::sockopt::get_ip_multicast_loop(&s).unwrap(), + true + ); + #[cfg(not(any( + windows, + target_os = "dragonfly", + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + )))] + assert_eq!(rustix::net::sockopt::get_ip_multicast_ttl(&s).unwrap(), 1); + assert_eq!(rustix::net::sockopt::get_tcp_nodelay(&s).unwrap(), false); + + // Set a timeout. + rustix::net::sockopt::set_socket_timeout( + &s, + rustix::net::sockopt::Timeout::Recv, + Some(Duration::new(1, 1)), + ) + .unwrap(); + + // Check that we have a timeout of at least the time we set. + if cfg!(not(target_os = "freebsd")) { + assert!( + rustix::net::sockopt::get_socket_timeout(&s, rustix::net::sockopt::Timeout::Recv) + .unwrap() + .unwrap() + >= Duration::new(1, 1) + ); + } else { + // On FreeBSD <= 12, it appears the system rounds the timeout down. + assert!( + rustix::net::sockopt::get_socket_timeout(&s, rustix::net::sockopt::Timeout::Recv) + .unwrap() + .unwrap() + >= Duration::new(1, 0) + ); + } + + #[cfg(not(windows))] + { + // Set the broadcast flag; + rustix::net::sockopt::set_socket_broadcast(&s, true).unwrap(); + + // Check that the broadcast flag is set. This has no effect on stream + // sockets, and not all platforms even remember the value. + #[cfg(not(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + )))] + assert_eq!( + rustix::net::sockopt::get_socket_broadcast(&s).unwrap(), + true + ); + } + + // Set a linger. + rustix::net::sockopt::set_socket_linger(&s, Some(Duration::new(1, 1))).unwrap(); + + // Check that we have a linger of at least the time we set. + assert!( + dbg!(rustix::net::sockopt::get_socket_linger(&s) + .unwrap() + .unwrap()) + >= Duration::new(1, 1) + ); + + #[cfg(any(target_os = "android", target_os = "linux"))] + { + // Set the passcred flag; + rustix::net::sockopt::set_socket_passcred(&s, true).unwrap(); + + // Check that the passcred flag is set. + assert_eq!(rustix::net::sockopt::get_socket_passcred(&s).unwrap(), true); + } + + // Set the ip ttl. + rustix::net::sockopt::set_ip_ttl(&s, 77).unwrap(); + + // Check the ip ttl. + assert_eq!(rustix::net::sockopt::get_ip_ttl(&s).unwrap(), 77); + + #[cfg(not(any( + windows, + target_os = "dragonfly", + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + )))] + { + // Set the multicast loop flag; + rustix::net::sockopt::set_ip_multicast_loop(&s, false).unwrap(); + + // Check that the multicast loop flag is set. + assert_eq!( + rustix::net::sockopt::get_ip_multicast_loop(&s).unwrap(), + false + ); + } + + // Set the nodelay flag; + rustix::net::sockopt::set_tcp_nodelay(&s, true).unwrap(); + + // Check that the nodelay flag is set. + assert_eq!(rustix::net::sockopt::get_tcp_nodelay(&s).unwrap(), true); +} diff --git a/vendor/rustix/tests/net/unix.rs b/vendor/rustix/tests/net/unix.rs new file mode 100644 index 000000000..21a6542f8 --- /dev/null +++ b/vendor/rustix/tests/net/unix.rs @@ -0,0 +1,147 @@ +//! Test a simple Unix-domain socket server and client. +//! +//! The client sends lists of integers and the server sends back sums. + +// This test uses `AF_UNIX` with `SOCK_SEQPACKET` which is unsupported on macOS. +#![cfg(not(any( + target_os = "ios", + target_os = "macos", + target_os = "redox", + target_os = "wasi", +)))] +// This test uses `DecInt`. +#![cfg(feature = "itoa")] +#![cfg(feature = "fs")] + +use rustix::fs::{cwd, unlinkat, AtFlags}; +use rustix::io::{read, write}; +use rustix::net::{ + accept, bind_unix, connect_unix, listen, socket, AddressFamily, Protocol, SocketAddrUnix, + SocketType, +}; +use rustix::path::DecInt; +use std::path::Path; +use std::str::FromStr; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread; + +const BUFFER_SIZE: usize = 20; + +fn server(ready: Arc<(Mutex<bool>, Condvar)>, path: &Path) { + let connection_socket = socket( + AddressFamily::UNIX, + SocketType::SEQPACKET, + Protocol::default(), + ) + .unwrap(); + + let name = SocketAddrUnix::new(path).unwrap(); + bind_unix(&connection_socket, &name).unwrap(); + listen(&connection_socket, 1).unwrap(); + + { + let (lock, cvar) = &*ready; + let mut started = lock.lock().unwrap(); + *started = true; + cvar.notify_all(); + } + + let mut buffer = vec![0; BUFFER_SIZE]; + 'exit: loop { + let data_socket = accept(&connection_socket).unwrap(); + let mut sum = 0; + loop { + let nread = read(&data_socket, &mut buffer).unwrap(); + + if &buffer[..nread] == b"exit" { + break 'exit; + } + if &buffer[..nread] == b"sum" { + break; + } + + sum += i32::from_str(&String::from_utf8_lossy(&buffer[..nread])).unwrap(); + } + + write(&data_socket, DecInt::new(sum).as_bytes()).unwrap(); + } + + unlinkat(cwd(), path, AtFlags::empty()).unwrap(); +} + +fn client(ready: Arc<(Mutex<bool>, Condvar)>, path: &Path, runs: &[(&[&str], i32)]) { + { + let (lock, cvar) = &*ready; + let mut started = lock.lock().unwrap(); + while !*started { + started = cvar.wait(started).unwrap(); + } + } + + let addr = SocketAddrUnix::new(path).unwrap(); + let mut buffer = vec![0; BUFFER_SIZE]; + + for (args, sum) in runs { + let data_socket = socket( + AddressFamily::UNIX, + SocketType::SEQPACKET, + Protocol::default(), + ) + .unwrap(); + connect_unix(&data_socket, &addr).unwrap(); + + for arg in *args { + write(&data_socket, arg.as_bytes()).unwrap(); + } + write(&data_socket, b"sum").unwrap(); + + let nread = read(&data_socket, &mut buffer).unwrap(); + assert_eq!( + i32::from_str(&String::from_utf8_lossy(&buffer[..nread])).unwrap(), + *sum + ); + } + + let data_socket = socket( + AddressFamily::UNIX, + SocketType::SEQPACKET, + Protocol::default(), + ) + .unwrap(); + connect_unix(&data_socket, &addr).unwrap(); + write(&data_socket, b"exit").unwrap(); +} + +#[test] +fn test_unix() { + let ready = Arc::new((Mutex::new(false), Condvar::new())); + let ready_clone = Arc::clone(&ready); + + let tmp = tempfile::tempdir().unwrap(); + let path = tmp.path().join("soccer"); + let send_path = path.to_owned(); + let server = thread::Builder::new() + .name("server".to_string()) + .spawn(move || { + server(ready, &send_path); + }) + .unwrap(); + let send_path = path.to_owned(); + let client = thread::Builder::new() + .name("client".to_string()) + .spawn(move || { + client( + ready_clone, + &send_path, + &[ + (&["1", "2"], 3), + (&["4", "77", "103"], 184), + (&["5", "78", "104"], 187), + (&[], 0), + ], + ); + }) + .unwrap(); + client.join().unwrap(); + server.join().unwrap(); +} diff --git a/vendor/rustix/tests/net/v4.rs b/vendor/rustix/tests/net/v4.rs new file mode 100644 index 000000000..0908057be --- /dev/null +++ b/vendor/rustix/tests/net/v4.rs @@ -0,0 +1,86 @@ +//! Test a simple IPv4 socket server and client. +//! +//! The client send a message and the server sends one back. + +#![cfg(not(any(target_os = "redox", target_os = "wasi")))] + +use rustix::net::{ + accept, bind_v4, connect_v4, getsockname, listen, recv, send, socket, AddressFamily, Ipv4Addr, + Protocol, RecvFlags, SendFlags, SocketAddrAny, SocketAddrV4, SocketType, +}; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread; + +const BUFFER_SIZE: usize = 20; + +fn server(ready: Arc<(Mutex<u16>, Condvar)>) { + let connection_socket = + socket(AddressFamily::INET, SocketType::STREAM, Protocol::default()).unwrap(); + + let name = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 0); + bind_v4(&connection_socket, &name).unwrap(); + + let who = match getsockname(&connection_socket).unwrap() { + SocketAddrAny::V4(addr) => addr, + _ => panic!(), + }; + + listen(&connection_socket, 1).unwrap(); + + { + let (lock, cvar) = &*ready; + let mut port = lock.lock().unwrap(); + *port = who.port(); + cvar.notify_all(); + } + + let mut buffer = vec![0; BUFFER_SIZE]; + let data_socket = accept(&connection_socket).unwrap(); + let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap(); + assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "hello, world"); + + send(&data_socket, b"goodnight, moon", SendFlags::empty()).unwrap(); +} + +fn client(ready: Arc<(Mutex<u16>, Condvar)>) { + let port = { + let (lock, cvar) = &*ready; + let mut port = lock.lock().unwrap(); + while *port == 0 { + port = cvar.wait(port).unwrap(); + } + *port + }; + + let addr = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), port); + let mut buffer = vec![0; BUFFER_SIZE]; + + let data_socket = socket(AddressFamily::INET, SocketType::STREAM, Protocol::default()).unwrap(); + connect_v4(&data_socket, &addr).unwrap(); + + send(&data_socket, b"hello, world", SendFlags::empty()).unwrap(); + + let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap(); + assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "goodnight, moon"); +} + +#[test] +fn test_v4() { + let ready = Arc::new((Mutex::new(0_u16), Condvar::new())); + let ready_clone = Arc::clone(&ready); + + let server = thread::Builder::new() + .name("server".to_string()) + .spawn(move || { + server(ready); + }) + .unwrap(); + let client = thread::Builder::new() + .name("client".to_string()) + .spawn(move || { + client(ready_clone); + }) + .unwrap(); + client.join().unwrap(); + server.join().unwrap(); +} diff --git a/vendor/rustix/tests/net/v6.rs b/vendor/rustix/tests/net/v6.rs new file mode 100644 index 000000000..07205be89 --- /dev/null +++ b/vendor/rustix/tests/net/v6.rs @@ -0,0 +1,95 @@ +//! Test a simple IPv6 socket server and client. +//! +//! The client send a message and the server sends one back. + +#![cfg(not(any(target_os = "redox", target_os = "wasi")))] + +use rustix::net::{ + accept, bind_v6, connect_v6, getsockname, listen, recv, send, socket, AddressFamily, Ipv6Addr, + Protocol, RecvFlags, SendFlags, SocketAddrAny, SocketAddrV6, SocketType, +}; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread; + +const BUFFER_SIZE: usize = 20; + +fn server(ready: Arc<(Mutex<u16>, Condvar)>) { + let connection_socket = socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + ) + .unwrap(); + + let name = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 0, 0, 0); + bind_v6(&connection_socket, &name).unwrap(); + + let who = match getsockname(&connection_socket).unwrap() { + SocketAddrAny::V6(addr) => addr, + _ => panic!(), + }; + + listen(&connection_socket, 1).unwrap(); + + { + let (lock, cvar) = &*ready; + let mut port = lock.lock().unwrap(); + *port = who.port(); + cvar.notify_all(); + } + + let mut buffer = vec![0; BUFFER_SIZE]; + let data_socket = accept(&connection_socket).unwrap(); + let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap(); + assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "hello, world"); + + send(&data_socket, b"goodnight, moon", SendFlags::empty()).unwrap(); +} + +fn client(ready: Arc<(Mutex<u16>, Condvar)>) { + let port = { + let (lock, cvar) = &*ready; + let mut port = lock.lock().unwrap(); + while *port == 0 { + port = cvar.wait(port).unwrap(); + } + *port + }; + + let addr = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), port, 0, 0); + let mut buffer = vec![0; BUFFER_SIZE]; + + let data_socket = socket( + AddressFamily::INET6, + SocketType::STREAM, + Protocol::default(), + ) + .unwrap(); + connect_v6(&data_socket, &addr).unwrap(); + + send(&data_socket, b"hello, world", SendFlags::empty()).unwrap(); + + let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap(); + assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "goodnight, moon"); +} + +#[test] +fn test_v6() { + let ready = Arc::new((Mutex::new(0_u16), Condvar::new())); + let ready_clone = Arc::clone(&ready); + + let server = thread::Builder::new() + .name("server".to_string()) + .spawn(move || { + server(ready); + }) + .unwrap(); + let client = thread::Builder::new() + .name("client".to_string()) + .spawn(move || { + client(ready_clone); + }) + .unwrap(); + client.join().unwrap(); + server.join().unwrap(); +} |