xref: /aosp_15_r20/external/crosvm/base/tests/linux/main.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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 Worker fn 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 Worker fn 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 Worker fn 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 Worker fn 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 Worker fn 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