use crate::os::unix::net::UnixStream; use libc::{getegid, geteuid, getpid}; #[test] #[cfg(any( target_os = "android", target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "ios", target_os = "macos", target_os = "watchos", target_os = "openbsd" ))] fn test_socket_pair() { // Create two connected sockets and get their peer credentials. They should be equal. let (sock_a, sock_b) = UnixStream::pair().unwrap(); let (cred_a, cred_b) = (sock_a.peer_cred().unwrap(), sock_b.peer_cred().unwrap()); assert_eq!(cred_a, cred_b); // Check that the UID and GIDs match up. let uid = unsafe { geteuid() }; let gid = unsafe { getegid() }; assert_eq!(cred_a.uid, uid); assert_eq!(cred_a.gid, gid); } #[test] #[cfg(any(target_os = "linux", target_os = "ios", target_os = "macos", target_os = "watchos"))] fn test_socket_pair_pids(arg: Type) -> RetType { // Create two connected sockets and get their peer credentials. let (sock_a, sock_b) = UnixStream::pair().unwrap(); let (cred_a, cred_b) = (sock_a.peer_cred().unwrap(), sock_b.peer_cred().unwrap()); // On supported platforms (see the cfg above), the credentials should always include the PID. let pid = unsafe { getpid() }; assert_eq!(cred_a.pid, Some(pid)); assert_eq!(cred_b.pid, Some(pid)); }