1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2024 Google LLC 2*cf78ab8cSAndroid Build Coastguard Worker // 3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*cf78ab8cSAndroid Build Coastguard Worker // 7*cf78ab8cSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*cf78ab8cSAndroid Build Coastguard Worker // 9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License. 14*cf78ab8cSAndroid Build Coastguard Worker 15*cf78ab8cSAndroid Build Coastguard Worker use bytes::Bytes; 16*cf78ab8cSAndroid Build Coastguard Worker use libslirp_rs::libslirp::LibSlirp; 17*cf78ab8cSAndroid Build Coastguard Worker use libslirp_rs::libslirp_config::SlirpConfig; 18*cf78ab8cSAndroid Build Coastguard Worker 19*cf78ab8cSAndroid Build Coastguard Worker use std::io; 20*cf78ab8cSAndroid Build Coastguard Worker use std::sync::mpsc; 21*cf78ab8cSAndroid Build Coastguard Worker use std::time::Duration; 22*cf78ab8cSAndroid Build Coastguard Worker 23*cf78ab8cSAndroid Build Coastguard Worker /// Test whether shutdown closes the rx channel 24*cf78ab8cSAndroid Build Coastguard Worker #[test] it_shutdown()25*cf78ab8cSAndroid Build Coastguard Workerfn it_shutdown() { 26*cf78ab8cSAndroid Build Coastguard Worker let config = SlirpConfig { ..Default::default() }; 27*cf78ab8cSAndroid Build Coastguard Worker 28*cf78ab8cSAndroid Build Coastguard Worker let before_fd_count = count_open_fds().unwrap(); 29*cf78ab8cSAndroid Build Coastguard Worker 30*cf78ab8cSAndroid Build Coastguard Worker let (tx, rx) = mpsc::channel::<Bytes>(); 31*cf78ab8cSAndroid Build Coastguard Worker let slirp = LibSlirp::new(config, tx, None); 32*cf78ab8cSAndroid Build Coastguard Worker slirp.shutdown(); 33*cf78ab8cSAndroid Build Coastguard Worker assert_eq!( 34*cf78ab8cSAndroid Build Coastguard Worker rx.recv_timeout(Duration::from_millis(5)), 35*cf78ab8cSAndroid Build Coastguard Worker Err(mpsc::RecvTimeoutError::Disconnected) 36*cf78ab8cSAndroid Build Coastguard Worker ); 37*cf78ab8cSAndroid Build Coastguard Worker 38*cf78ab8cSAndroid Build Coastguard Worker let after_fd_count = count_open_fds().unwrap(); 39*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(before_fd_count, after_fd_count); 40*cf78ab8cSAndroid Build Coastguard Worker } 41*cf78ab8cSAndroid Build Coastguard Worker 42*cf78ab8cSAndroid Build Coastguard Worker #[cfg(target_os = "linux")] count_open_fds() -> io::Result<usize>43*cf78ab8cSAndroid Build Coastguard Workerfn count_open_fds() -> io::Result<usize> { 44*cf78ab8cSAndroid Build Coastguard Worker use std::fs; 45*cf78ab8cSAndroid Build Coastguard Worker let entries = fs::read_dir("/proc/self/fd")?; 46*cf78ab8cSAndroid Build Coastguard Worker Ok(entries.count()) 47*cf78ab8cSAndroid Build Coastguard Worker } 48*cf78ab8cSAndroid Build Coastguard Worker 49*cf78ab8cSAndroid Build Coastguard Worker #[cfg(not(target_os = "linux"))] count_open_fds() -> io::Result<usize>50*cf78ab8cSAndroid Build Coastguard Workerfn count_open_fds() -> io::Result<usize> { 51*cf78ab8cSAndroid Build Coastguard Worker Ok(0) 52*cf78ab8cSAndroid Build Coastguard Worker } 53