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