diff --git a/src/net.rs b/src/net.rs index db06ffc..dfa23b9 100644 --- a/src/net.rs +++ b/src/net.rs @@ -970,7 +970,8 @@ impl WsaExtension { #[cfg(test)] mod tests { use std::io::prelude::*; - use std::net::{SocketAddr, TcpListener, TcpStream, UdpSocket}; + use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV6, TcpListener, TcpStream, UdpSocket}; + use std::slice; use std::thread; use socket2::{Domain, Socket, Type}; @@ -1239,4 +1240,36 @@ mod tests { assert_eq!(addrs.remote(), Some(remote)); }) } + + #[test] + fn sockaddr_convert_4() { + let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(3, 4, 5, 6)), 0xabcd); + let (raw_addr, addr_len) = super::socket_addr_to_ptrs(&addr); + assert_eq!(addr_len, 16); + let addr_bytes = unsafe { slice::from_raw_parts(raw_addr as *const u8, addr_len as usize) }; + assert_eq!(addr_bytes, &[2, 0, 0xab, 0xcd, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0]); + + let addr2 = unsafe { super::ptrs_to_socket_addr(raw_addr, addr_len).unwrap() }; + assert_eq!(addr, addr2); + } + + #[test] + fn sockaddr_convert_v6() { + let port = 0xabcd; + let flowinfo = 0x12345678; + let scope_id = 0x987654321; + let addr = SocketAddr::V6(SocketAddrV6::new( + Ipv6Addr::new(0x0102, 0x0304, 0x0506, 0x0708, 0x090a, 0x0b0c, 0x0d0e, 0x0f10), + port, + flowinfo, + scope_id + )); + let (raw_addr, addr_len) = super::socket_addr_to_ptrs(&addr); + assert_eq!(addr_len, 28); + let addr_bytes = unsafe { slice::from_raw_parts(raw_addr as *const u8, addr_len as usize) }; + assert_eq!(addr_bytes, &[23, 0, 0xab, 0xcd, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0]); + + let addr2 = unsafe { super::ptrs_to_socket_addr(raw_addr, addr_len).unwrap() }; + assert_eq!(addr, addr2); + } }