1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(any(target_os = "android", target_os = "linux"))] 6*bb4ee6a4SAndroid Build Coastguard Worker 7*bb4ee6a4SAndroid Build Coastguard Worker use std::path::Path; 8*bb4ee6a4SAndroid Build Coastguard Worker 9*bb4ee6a4SAndroid Build Coastguard Worker use base::safe_descriptor_from_path; 10*bb4ee6a4SAndroid Build Coastguard Worker use base::Error; 11*bb4ee6a4SAndroid Build Coastguard Worker use base::FromRawDescriptor; 12*bb4ee6a4SAndroid Build Coastguard Worker use base::SafeDescriptor; 13*bb4ee6a4SAndroid Build Coastguard Worker use libc::EBADF; 14*bb4ee6a4SAndroid Build Coastguard Worker use libc::EINVAL; 15*bb4ee6a4SAndroid Build Coastguard Worker 16*bb4ee6a4SAndroid Build Coastguard Worker /// Runs all unix specific integration tests in a single binary. 17*bb4ee6a4SAndroid Build Coastguard Worker mod net; 18*bb4ee6a4SAndroid Build Coastguard Worker mod syslog; 19*bb4ee6a4SAndroid Build Coastguard Worker mod tube; 20*bb4ee6a4SAndroid Build Coastguard Worker 21*bb4ee6a4SAndroid Build Coastguard Worker #[test] safe_descriptor_from_path_valid()22*bb4ee6a4SAndroid Build Coastguard Workerfn safe_descriptor_from_path_valid() { 23*bb4ee6a4SAndroid Build Coastguard Worker assert!(safe_descriptor_from_path(Path::new("/proc/self/fd/2")) 24*bb4ee6a4SAndroid Build Coastguard Worker .unwrap() 25*bb4ee6a4SAndroid Build Coastguard Worker .is_some()); 26*bb4ee6a4SAndroid Build Coastguard Worker } 27*bb4ee6a4SAndroid Build Coastguard Worker 28*bb4ee6a4SAndroid Build Coastguard Worker #[test] safe_descriptor_from_path_invalid_integer()29*bb4ee6a4SAndroid Build Coastguard Workerfn safe_descriptor_from_path_invalid_integer() { 30*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!( 31*bb4ee6a4SAndroid Build Coastguard Worker safe_descriptor_from_path(Path::new("/proc/self/fd/blah")), 32*bb4ee6a4SAndroid Build Coastguard Worker Err(Error::new(EINVAL)) 33*bb4ee6a4SAndroid Build Coastguard Worker ); 34*bb4ee6a4SAndroid Build Coastguard Worker } 35*bb4ee6a4SAndroid Build Coastguard Worker 36*bb4ee6a4SAndroid Build Coastguard Worker #[test] safe_descriptor_from_path_invalid_fd()37*bb4ee6a4SAndroid Build Coastguard Workerfn safe_descriptor_from_path_invalid_fd() { 38*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!( 39*bb4ee6a4SAndroid Build Coastguard Worker safe_descriptor_from_path(Path::new("/proc/self/fd/42")), 40*bb4ee6a4SAndroid Build Coastguard Worker Err(Error::new(EBADF)) 41*bb4ee6a4SAndroid Build Coastguard Worker ); 42*bb4ee6a4SAndroid Build Coastguard Worker } 43*bb4ee6a4SAndroid Build Coastguard Worker 44*bb4ee6a4SAndroid Build Coastguard Worker #[test] safe_descriptor_from_path_none()45*bb4ee6a4SAndroid Build Coastguard Workerfn safe_descriptor_from_path_none() { 46*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!( 47*bb4ee6a4SAndroid Build Coastguard Worker safe_descriptor_from_path(Path::new("/something/else")).unwrap(), 48*bb4ee6a4SAndroid Build Coastguard Worker None 49*bb4ee6a4SAndroid Build Coastguard Worker ); 50*bb4ee6a4SAndroid Build Coastguard Worker } 51*bb4ee6a4SAndroid Build Coastguard Worker 52*bb4ee6a4SAndroid Build Coastguard Worker #[test] 53*bb4ee6a4SAndroid Build Coastguard Worker #[allow(clippy::eq_op)] clone_equality()54*bb4ee6a4SAndroid Build Coastguard Workerfn clone_equality() { 55*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: Safe because return value is checked. 56*bb4ee6a4SAndroid Build Coastguard Worker let ret = unsafe { libc::eventfd(0, 0) }; 57*bb4ee6a4SAndroid Build Coastguard Worker if ret < 0 { 58*bb4ee6a4SAndroid Build Coastguard Worker panic!("failed to create eventfd"); 59*bb4ee6a4SAndroid Build Coastguard Worker } 60*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: Safe because ret is valid and return value is checked. 61*bb4ee6a4SAndroid Build Coastguard Worker let descriptor = unsafe { SafeDescriptor::from_raw_descriptor(ret) }; 62*bb4ee6a4SAndroid Build Coastguard Worker 63*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!(descriptor, descriptor); 64*bb4ee6a4SAndroid Build Coastguard Worker 65*bb4ee6a4SAndroid Build Coastguard Worker assert_eq!( 66*bb4ee6a4SAndroid Build Coastguard Worker descriptor, 67*bb4ee6a4SAndroid Build Coastguard Worker descriptor.try_clone().expect("failed to clone eventfd") 68*bb4ee6a4SAndroid Build Coastguard Worker ); 69*bb4ee6a4SAndroid Build Coastguard Worker 70*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: Safe because return value is checked. 71*bb4ee6a4SAndroid Build Coastguard Worker let ret = unsafe { libc::eventfd(0, 0) }; 72*bb4ee6a4SAndroid Build Coastguard Worker if ret < 0 { 73*bb4ee6a4SAndroid Build Coastguard Worker panic!("failed to create eventfd"); 74*bb4ee6a4SAndroid Build Coastguard Worker } 75*bb4ee6a4SAndroid Build Coastguard Worker 76*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: Safe because ret is valid and return value is checked. 77*bb4ee6a4SAndroid Build Coastguard Worker let another = unsafe { SafeDescriptor::from_raw_descriptor(ret) }; 78*bb4ee6a4SAndroid Build Coastguard Worker 79*bb4ee6a4SAndroid Build Coastguard Worker assert_ne!(descriptor, another); 80*bb4ee6a4SAndroid Build Coastguard Worker } 81