1#![cfg_attr(not(io_safety_is_in_std), allow(unused_imports))] 2#![cfg_attr(target_os = "wasi", feature(wasi_ext))] 3 4use std::mem::size_of; 5 6#[cfg(any(unix, target_os = "wasi"))] 7use io_lifetimes::{BorrowedFd, OwnedFd}; 8#[cfg(windows)] 9use io_lifetimes::{BorrowedSocket, OwnedSocket}; 10 11#[cfg(unix)] 12use std::os::unix::io::{FromRawFd, IntoRawFd, RawFd}; 13#[cfg(target_os = "wasi")] 14use std::os::wasi::io::{FromRawFd, IntoRawFd, RawFd}; 15#[cfg(windows)] 16use std::os::windows::io::{FromRawSocket, IntoRawSocket, RawSocket}; 17 18#[cfg(all(io_safety_is_in_std, any(unix, target_os = "wasi")))] 19#[test] 20fn test_niche_optimizations() { 21 assert_eq!(size_of::<Option<OwnedFd>>(), size_of::<RawFd>()); 22 assert_eq!(size_of::<Option<BorrowedFd<'static>>>(), size_of::<RawFd>()); 23 unsafe { 24 assert_eq!(OwnedFd::from_raw_fd(RawFd::MIN).into_raw_fd(), RawFd::MIN); 25 assert_eq!(OwnedFd::from_raw_fd(RawFd::MAX).into_raw_fd(), RawFd::MAX); 26 assert_eq!( 27 Some(OwnedFd::from_raw_fd(RawFd::MIN)) 28 .unwrap() 29 .into_raw_fd(), 30 RawFd::MIN 31 ); 32 assert_eq!( 33 Some(OwnedFd::from_raw_fd(RawFd::MAX)) 34 .unwrap() 35 .into_raw_fd(), 36 RawFd::MAX 37 ); 38 } 39} 40 41#[cfg(all(io_safety_is_in_std, windows))] 42#[test] 43fn test_niche_optimizations_socket() { 44 assert_eq!(size_of::<Option<OwnedSocket>>(), size_of::<RawSocket>()); 45 assert_eq!( 46 size_of::<Option<BorrowedSocket<'static>>>(), 47 size_of::<RawSocket>(), 48 ); 49 unsafe { 50 #[cfg(target_pointer_width = "32")] 51 let (min, max) = (i32::MIN as u32, i32::MAX as u32); 52 #[cfg(target_pointer_width = "64")] 53 let (min, max) = (i64::MIN as u64, i64::MAX as u64); 54 55 assert_eq!(OwnedSocket::from_raw_socket(min).into_raw_socket(), min); 56 assert_eq!(OwnedSocket::from_raw_socket(max).into_raw_socket(), max); 57 assert_eq!( 58 Some(OwnedSocket::from_raw_socket(min)) 59 .unwrap() 60 .into_raw_socket(), 61 min 62 ); 63 assert_eq!( 64 Some(OwnedSocket::from_raw_socket(max)) 65 .unwrap() 66 .into_raw_socket(), 67 max 68 ); 69 } 70} 71