xref: /aosp_15_r20/external/crosvm/e2e_tests/tests/vsock.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 //! Testing vsock.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(any(target_os = "android", target_os = "linux"))]
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Write;
10*bb4ee6a4SAndroid Build Coastguard Worker use std::path::Path;
11*bb4ee6a4SAndroid Build Coastguard Worker use std::process::Command;
12*bb4ee6a4SAndroid Build Coastguard Worker use std::process::Stdio;
13*bb4ee6a4SAndroid Build Coastguard Worker use std::time::Duration;
14*bb4ee6a4SAndroid Build Coastguard Worker 
15*bb4ee6a4SAndroid Build Coastguard Worker use fixture::utils::retry;
16*bb4ee6a4SAndroid Build Coastguard Worker use fixture::utils::ChildExt;
17*bb4ee6a4SAndroid Build Coastguard Worker use fixture::utils::CommandExt;
18*bb4ee6a4SAndroid Build Coastguard Worker use fixture::vhost_user::CmdType;
19*bb4ee6a4SAndroid Build Coastguard Worker use fixture::vhost_user::Config as VuConfig;
20*bb4ee6a4SAndroid Build Coastguard Worker use fixture::vhost_user::VhostUserBackend;
21*bb4ee6a4SAndroid Build Coastguard Worker use fixture::vm::Config;
22*bb4ee6a4SAndroid Build Coastguard Worker use fixture::vm::TestVm;
23*bb4ee6a4SAndroid Build Coastguard Worker use rand::Rng;
24*bb4ee6a4SAndroid Build Coastguard Worker use tempfile::tempdir;
25*bb4ee6a4SAndroid Build Coastguard Worker use tempfile::NamedTempFile;
26*bb4ee6a4SAndroid Build Coastguard Worker 
27*bb4ee6a4SAndroid Build Coastguard Worker const ANY_CID: &str = "4294967295"; // -1U
28*bb4ee6a4SAndroid Build Coastguard Worker const HOST_CID: u64 = 2;
29*bb4ee6a4SAndroid Build Coastguard Worker 
30*bb4ee6a4SAndroid Build Coastguard Worker const SERVER_TIMEOUT: Duration = Duration::from_secs(3);
31*bb4ee6a4SAndroid Build Coastguard Worker const NCAT_RETRIES: usize = 10;
32*bb4ee6a4SAndroid Build Coastguard Worker 
33*bb4ee6a4SAndroid Build Coastguard Worker const MESSAGE_TO_HOST: &str = "Connection from the host is successfully established";
34*bb4ee6a4SAndroid Build Coastguard Worker const MESSAGE_TO_GUEST: &str = "Connection from the guest is successfully established";
35*bb4ee6a4SAndroid Build Coastguard Worker 
36*bb4ee6a4SAndroid Build Coastguard Worker // generate a random CID to avoid conflicts with other VMs run on different processes
generate_guest_cid() -> u3237*bb4ee6a4SAndroid Build Coastguard Worker fn generate_guest_cid() -> u32 {
38*bb4ee6a4SAndroid Build Coastguard Worker     // avoid special CIDs and negative values
39*bb4ee6a4SAndroid Build Coastguard Worker     rand::thread_rng().gen_range(3..0x8000_0000)
40*bb4ee6a4SAndroid Build Coastguard Worker }
41*bb4ee6a4SAndroid Build Coastguard Worker 
generate_vhost_port() -> u3242*bb4ee6a4SAndroid Build Coastguard Worker fn generate_vhost_port() -> u32 {
43*bb4ee6a4SAndroid Build Coastguard Worker     rand::thread_rng().gen_range(10000..99999)
44*bb4ee6a4SAndroid Build Coastguard Worker }
45*bb4ee6a4SAndroid Build Coastguard Worker 
46*bb4ee6a4SAndroid Build Coastguard Worker #[test]
47*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Test failing in latest version of debian. b/346365355"]
host_to_guest()48*bb4ee6a4SAndroid Build Coastguard Worker fn host_to_guest() {
49*bb4ee6a4SAndroid Build Coastguard Worker     let guest_port = generate_vhost_port();
50*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
51*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new().extra_args(vec!["--cid".to_string(), guest_cid.to_string()]);
52*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
53*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
54*bb4ee6a4SAndroid Build Coastguard Worker }
55*bb4ee6a4SAndroid Build Coastguard Worker 
56*bb4ee6a4SAndroid Build Coastguard Worker #[test]
57*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Test failing in latest version of debian. b/346365355"]
host_to_guest_disable_sandbox()58*bb4ee6a4SAndroid Build Coastguard Worker fn host_to_guest_disable_sandbox() {
59*bb4ee6a4SAndroid Build Coastguard Worker     let guest_port = generate_vhost_port();
60*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
61*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
62*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec!["--cid".to_string(), guest_cid.to_string()])
63*bb4ee6a4SAndroid Build Coastguard Worker         .disable_sandbox();
64*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
65*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
66*bb4ee6a4SAndroid Build Coastguard Worker }
67*bb4ee6a4SAndroid Build Coastguard Worker 
68*bb4ee6a4SAndroid Build Coastguard Worker #[test]
69*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Test failing in latest version of debian. b/346365355"]
host_to_guest_snapshot_restore()70*bb4ee6a4SAndroid Build Coastguard Worker fn host_to_guest_snapshot_restore() {
71*bb4ee6a4SAndroid Build Coastguard Worker     let guest_port = generate_vhost_port();
72*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
73*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
74*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
75*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
76*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
77*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
78*bb4ee6a4SAndroid Build Coastguard Worker         ])
79*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console");
80*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
81*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
82*bb4ee6a4SAndroid Build Coastguard Worker     let dir = tempdir().unwrap();
83*bb4ee6a4SAndroid Build Coastguard Worker     let snap = dir.path().join("snapshot.bkp");
84*bb4ee6a4SAndroid Build Coastguard Worker     vm.snapshot(&snap).unwrap();
85*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
86*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
87*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
88*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
89*bb4ee6a4SAndroid Build Coastguard Worker             "--restore".to_string(),
90*bb4ee6a4SAndroid Build Coastguard Worker             snap.to_str().unwrap().to_string(),
91*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
92*bb4ee6a4SAndroid Build Coastguard Worker         ])
93*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console");
94*bb4ee6a4SAndroid Build Coastguard Worker     drop(vm);
95*bb4ee6a4SAndroid Build Coastguard Worker     vm = TestVm::new_restore(config).unwrap();
96*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
97*bb4ee6a4SAndroid Build Coastguard Worker }
98*bb4ee6a4SAndroid Build Coastguard Worker 
99*bb4ee6a4SAndroid Build Coastguard Worker #[test]
100*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "Test failing in latest version of debian. b/346365355"]
host_to_guest_disable_sandbox_snapshot_restore()101*bb4ee6a4SAndroid Build Coastguard Worker fn host_to_guest_disable_sandbox_snapshot_restore() {
102*bb4ee6a4SAndroid Build Coastguard Worker     let guest_port = generate_vhost_port();
103*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
104*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
105*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
106*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
107*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
108*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
109*bb4ee6a4SAndroid Build Coastguard Worker         ])
110*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console");
111*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config.disable_sandbox()).unwrap();
112*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
113*bb4ee6a4SAndroid Build Coastguard Worker     let dir = tempdir().unwrap();
114*bb4ee6a4SAndroid Build Coastguard Worker     let snap = dir.path().join("snapshot.bkp");
115*bb4ee6a4SAndroid Build Coastguard Worker     vm.snapshot(&snap).unwrap();
116*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
117*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
118*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
119*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
120*bb4ee6a4SAndroid Build Coastguard Worker             "--restore".to_string(),
121*bb4ee6a4SAndroid Build Coastguard Worker             snap.to_str().unwrap().to_string(),
122*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
123*bb4ee6a4SAndroid Build Coastguard Worker         ])
124*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console");
125*bb4ee6a4SAndroid Build Coastguard Worker     drop(vm);
126*bb4ee6a4SAndroid Build Coastguard Worker     vm = TestVm::new_restore(config.disable_sandbox()).unwrap();
127*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
128*bb4ee6a4SAndroid Build Coastguard Worker }
129*bb4ee6a4SAndroid Build Coastguard Worker 
host_to_guest_connection(vm: &mut TestVm, guest_cid: u32, guest_port: u32)130*bb4ee6a4SAndroid Build Coastguard Worker fn host_to_guest_connection(vm: &mut TestVm, guest_cid: u32, guest_port: u32) {
131*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cmd = vm
132*bb4ee6a4SAndroid Build Coastguard Worker         .exec_in_guest_async(&format!(
133*bb4ee6a4SAndroid Build Coastguard Worker             "echo {MESSAGE_TO_HOST} | ncat -l --vsock --send-only {ANY_CID} {guest_port}"
134*bb4ee6a4SAndroid Build Coastguard Worker         ))
135*bb4ee6a4SAndroid Build Coastguard Worker         .unwrap();
136*bb4ee6a4SAndroid Build Coastguard Worker 
137*bb4ee6a4SAndroid Build Coastguard Worker     let output = retry(
138*bb4ee6a4SAndroid Build Coastguard Worker         || {
139*bb4ee6a4SAndroid Build Coastguard Worker             Command::new("ncat")
140*bb4ee6a4SAndroid Build Coastguard Worker                 .args([
141*bb4ee6a4SAndroid Build Coastguard Worker                     "--recv-only",
142*bb4ee6a4SAndroid Build Coastguard Worker                     "--vsock",
143*bb4ee6a4SAndroid Build Coastguard Worker                     &guest_cid.to_string(),
144*bb4ee6a4SAndroid Build Coastguard Worker                     &guest_port.to_string(),
145*bb4ee6a4SAndroid Build Coastguard Worker                 ])
146*bb4ee6a4SAndroid Build Coastguard Worker                 .stderr(Stdio::inherit())
147*bb4ee6a4SAndroid Build Coastguard Worker                 .log()
148*bb4ee6a4SAndroid Build Coastguard Worker                 .output_checked()
149*bb4ee6a4SAndroid Build Coastguard Worker         },
150*bb4ee6a4SAndroid Build Coastguard Worker         NCAT_RETRIES,
151*bb4ee6a4SAndroid Build Coastguard Worker     )
152*bb4ee6a4SAndroid Build Coastguard Worker     .unwrap();
153*bb4ee6a4SAndroid Build Coastguard Worker 
154*bb4ee6a4SAndroid Build Coastguard Worker     let host_stdout = std::str::from_utf8(&output.stdout).unwrap();
155*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(host_stdout.trim(), MESSAGE_TO_HOST);
156*bb4ee6a4SAndroid Build Coastguard Worker 
157*bb4ee6a4SAndroid Build Coastguard Worker     guest_cmd.wait_ok(vm).unwrap();
158*bb4ee6a4SAndroid Build Coastguard Worker }
159*bb4ee6a4SAndroid Build Coastguard Worker 
160*bb4ee6a4SAndroid Build Coastguard Worker #[test]
guest_to_host()161*bb4ee6a4SAndroid Build Coastguard Worker fn guest_to_host() {
162*bb4ee6a4SAndroid Build Coastguard Worker     let host_port = generate_vhost_port();
163*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
164*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new().extra_args(vec!["--cid".to_string(), guest_cid.to_string()]);
165*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
166*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
167*bb4ee6a4SAndroid Build Coastguard Worker }
168*bb4ee6a4SAndroid Build Coastguard Worker 
169*bb4ee6a4SAndroid Build Coastguard Worker #[test]
guest_to_host_disable_sandbox()170*bb4ee6a4SAndroid Build Coastguard Worker fn guest_to_host_disable_sandbox() {
171*bb4ee6a4SAndroid Build Coastguard Worker     let host_port = generate_vhost_port();
172*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
173*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
174*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec!["--cid".to_string(), guest_cid.to_string()])
175*bb4ee6a4SAndroid Build Coastguard Worker         .disable_sandbox();
176*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
177*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
178*bb4ee6a4SAndroid Build Coastguard Worker }
179*bb4ee6a4SAndroid Build Coastguard Worker 
180*bb4ee6a4SAndroid Build Coastguard Worker #[test]
guest_to_host_snapshot_restore()181*bb4ee6a4SAndroid Build Coastguard Worker fn guest_to_host_snapshot_restore() {
182*bb4ee6a4SAndroid Build Coastguard Worker     let host_port = generate_vhost_port();
183*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
184*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
185*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
186*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
187*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
188*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
189*bb4ee6a4SAndroid Build Coastguard Worker         ])
190*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console");
191*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
192*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
193*bb4ee6a4SAndroid Build Coastguard Worker     let dir = tempdir().unwrap();
194*bb4ee6a4SAndroid Build Coastguard Worker     let snap = dir.path().join("snapshot.bkp");
195*bb4ee6a4SAndroid Build Coastguard Worker     vm.snapshot(&snap).unwrap();
196*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
197*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
198*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
199*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
200*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
201*bb4ee6a4SAndroid Build Coastguard Worker             "--restore".to_string(),
202*bb4ee6a4SAndroid Build Coastguard Worker             snap.to_str().unwrap().to_string(),
203*bb4ee6a4SAndroid Build Coastguard Worker         ])
204*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console");
205*bb4ee6a4SAndroid Build Coastguard Worker     drop(vm);
206*bb4ee6a4SAndroid Build Coastguard Worker     vm = TestVm::new_restore(config).unwrap();
207*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
208*bb4ee6a4SAndroid Build Coastguard Worker }
209*bb4ee6a4SAndroid Build Coastguard Worker 
210*bb4ee6a4SAndroid Build Coastguard Worker #[test]
guest_to_host_disable_sandbox_snapshot_restore()211*bb4ee6a4SAndroid Build Coastguard Worker fn guest_to_host_disable_sandbox_snapshot_restore() {
212*bb4ee6a4SAndroid Build Coastguard Worker     let host_port = generate_vhost_port();
213*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
214*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
215*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
216*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
217*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
218*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
219*bb4ee6a4SAndroid Build Coastguard Worker         ])
220*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console")
221*bb4ee6a4SAndroid Build Coastguard Worker         .disable_sandbox();
222*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
223*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
224*bb4ee6a4SAndroid Build Coastguard Worker     let dir = tempdir().unwrap();
225*bb4ee6a4SAndroid Build Coastguard Worker     let snap = dir.path().join("snapshot.bkp");
226*bb4ee6a4SAndroid Build Coastguard Worker     vm.snapshot(&snap).unwrap();
227*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new()
228*bb4ee6a4SAndroid Build Coastguard Worker         .extra_args(vec![
229*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
230*bb4ee6a4SAndroid Build Coastguard Worker             guest_cid.to_string(),
231*bb4ee6a4SAndroid Build Coastguard Worker             "--no-usb".to_string(),
232*bb4ee6a4SAndroid Build Coastguard Worker             "--restore".to_string(),
233*bb4ee6a4SAndroid Build Coastguard Worker             snap.to_str().unwrap().to_string(),
234*bb4ee6a4SAndroid Build Coastguard Worker         ])
235*bb4ee6a4SAndroid Build Coastguard Worker         .with_stdout_hardware("legacy-virtio-console");
236*bb4ee6a4SAndroid Build Coastguard Worker     drop(vm);
237*bb4ee6a4SAndroid Build Coastguard Worker     vm = TestVm::new_restore(config.disable_sandbox()).unwrap();
238*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
239*bb4ee6a4SAndroid Build Coastguard Worker }
240*bb4ee6a4SAndroid Build Coastguard Worker 
guest_to_host_connection(vm: &mut TestVm, host_port: u32)241*bb4ee6a4SAndroid Build Coastguard Worker fn guest_to_host_connection(vm: &mut TestVm, host_port: u32) {
242*bb4ee6a4SAndroid Build Coastguard Worker     let mut host_ncat = Command::new("ncat")
243*bb4ee6a4SAndroid Build Coastguard Worker         .arg("-l")
244*bb4ee6a4SAndroid Build Coastguard Worker         .arg("--send-only")
245*bb4ee6a4SAndroid Build Coastguard Worker         .args(["--vsock", ANY_CID, &host_port.to_string()])
246*bb4ee6a4SAndroid Build Coastguard Worker         .stdin(Stdio::piped())
247*bb4ee6a4SAndroid Build Coastguard Worker         .log()
248*bb4ee6a4SAndroid Build Coastguard Worker         .spawn()
249*bb4ee6a4SAndroid Build Coastguard Worker         .expect("failed to execute process");
250*bb4ee6a4SAndroid Build Coastguard Worker 
251*bb4ee6a4SAndroid Build Coastguard Worker     host_ncat
252*bb4ee6a4SAndroid Build Coastguard Worker         .stdin
253*bb4ee6a4SAndroid Build Coastguard Worker         .take()
254*bb4ee6a4SAndroid Build Coastguard Worker         .unwrap()
255*bb4ee6a4SAndroid Build Coastguard Worker         .write_all(MESSAGE_TO_GUEST.as_bytes())
256*bb4ee6a4SAndroid Build Coastguard Worker         .unwrap();
257*bb4ee6a4SAndroid Build Coastguard Worker 
258*bb4ee6a4SAndroid Build Coastguard Worker     let cmd = format!("ncat --recv-only --vsock {HOST_CID} {host_port}; echo ''");
259*bb4ee6a4SAndroid Build Coastguard Worker     let guest_stdout = retry(|| vm.exec_in_guest(&cmd), NCAT_RETRIES).unwrap();
260*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(guest_stdout.stdout.trim(), MESSAGE_TO_GUEST);
261*bb4ee6a4SAndroid Build Coastguard Worker 
262*bb4ee6a4SAndroid Build Coastguard Worker     host_ncat.wait_with_timeout(SERVER_TIMEOUT).unwrap();
263*bb4ee6a4SAndroid Build Coastguard Worker }
264*bb4ee6a4SAndroid Build Coastguard Worker 
create_vu_config(cmd_type: CmdType, socket: &Path, cid: u32) -> VuConfig265*bb4ee6a4SAndroid Build Coastguard Worker fn create_vu_config(cmd_type: CmdType, socket: &Path, cid: u32) -> VuConfig {
266*bb4ee6a4SAndroid Build Coastguard Worker     let socket_path = socket.to_str().unwrap();
267*bb4ee6a4SAndroid Build Coastguard Worker     println!("cid={cid}, socket={socket_path}");
268*bb4ee6a4SAndroid Build Coastguard Worker     match cmd_type {
269*bb4ee6a4SAndroid Build Coastguard Worker         CmdType::Device => VuConfig::new(cmd_type, "vsock").extra_args(vec![
270*bb4ee6a4SAndroid Build Coastguard Worker             "vsock".to_string(),
271*bb4ee6a4SAndroid Build Coastguard Worker             "--socket-path".to_string(),
272*bb4ee6a4SAndroid Build Coastguard Worker             socket_path.to_string(),
273*bb4ee6a4SAndroid Build Coastguard Worker             "--cid".to_string(),
274*bb4ee6a4SAndroid Build Coastguard Worker             cid.to_string(),
275*bb4ee6a4SAndroid Build Coastguard Worker         ]),
276*bb4ee6a4SAndroid Build Coastguard Worker         CmdType::Devices => VuConfig::new(cmd_type, "vsock").extra_args(vec![
277*bb4ee6a4SAndroid Build Coastguard Worker             "--vsock".to_string(),
278*bb4ee6a4SAndroid Build Coastguard Worker             format!("vhost={},cid={}", socket_path, cid),
279*bb4ee6a4SAndroid Build Coastguard Worker         ]),
280*bb4ee6a4SAndroid Build Coastguard Worker     }
281*bb4ee6a4SAndroid Build Coastguard Worker }
282*bb4ee6a4SAndroid Build Coastguard Worker 
283*bb4ee6a4SAndroid Build Coastguard Worker #[test]
284*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "b/333090069 test is flaky"]
vhost_user_host_to_guest()285*bb4ee6a4SAndroid Build Coastguard Worker fn vhost_user_host_to_guest() {
286*bb4ee6a4SAndroid Build Coastguard Worker     let guest_port = generate_vhost_port();
287*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
288*bb4ee6a4SAndroid Build Coastguard Worker     let socket = NamedTempFile::new().unwrap();
289*bb4ee6a4SAndroid Build Coastguard Worker 
290*bb4ee6a4SAndroid Build Coastguard Worker     let vu_config = create_vu_config(CmdType::Device, socket.path(), guest_cid);
291*bb4ee6a4SAndroid Build Coastguard Worker     let _vu_device = VhostUserBackend::new(vu_config).unwrap();
292*bb4ee6a4SAndroid Build Coastguard Worker 
293*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new().extra_args(vec![
294*bb4ee6a4SAndroid Build Coastguard Worker         "--vhost-user".to_string(),
295*bb4ee6a4SAndroid Build Coastguard Worker         format!("vsock,socket={}", socket.path().to_str().unwrap()),
296*bb4ee6a4SAndroid Build Coastguard Worker     ]);
297*bb4ee6a4SAndroid Build Coastguard Worker 
298*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
299*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
300*bb4ee6a4SAndroid Build Coastguard Worker }
301*bb4ee6a4SAndroid Build Coastguard Worker 
302*bb4ee6a4SAndroid Build Coastguard Worker #[test]
303*bb4ee6a4SAndroid Build Coastguard Worker #[ignore = "b/333090069 test is flaky"]
vhost_user_host_to_guest_with_devices()304*bb4ee6a4SAndroid Build Coastguard Worker fn vhost_user_host_to_guest_with_devices() {
305*bb4ee6a4SAndroid Build Coastguard Worker     let guest_port = generate_vhost_port();
306*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
307*bb4ee6a4SAndroid Build Coastguard Worker     let socket = NamedTempFile::new().unwrap();
308*bb4ee6a4SAndroid Build Coastguard Worker 
309*bb4ee6a4SAndroid Build Coastguard Worker     let vu_config = create_vu_config(CmdType::Devices, socket.path(), guest_cid);
310*bb4ee6a4SAndroid Build Coastguard Worker     let _vu_device = VhostUserBackend::new(vu_config).unwrap();
311*bb4ee6a4SAndroid Build Coastguard Worker 
312*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new().extra_args(vec![
313*bb4ee6a4SAndroid Build Coastguard Worker         "--vhost-user".to_string(),
314*bb4ee6a4SAndroid Build Coastguard Worker         format!("vsock,socket={}", socket.path().to_str().unwrap()),
315*bb4ee6a4SAndroid Build Coastguard Worker     ]);
316*bb4ee6a4SAndroid Build Coastguard Worker 
317*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
318*bb4ee6a4SAndroid Build Coastguard Worker     host_to_guest_connection(&mut vm, guest_cid, guest_port);
319*bb4ee6a4SAndroid Build Coastguard Worker }
320*bb4ee6a4SAndroid Build Coastguard Worker 
321*bb4ee6a4SAndroid Build Coastguard Worker #[test]
vhost_user_guest_to_host()322*bb4ee6a4SAndroid Build Coastguard Worker fn vhost_user_guest_to_host() {
323*bb4ee6a4SAndroid Build Coastguard Worker     let host_port = generate_vhost_port();
324*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
325*bb4ee6a4SAndroid Build Coastguard Worker     let socket = NamedTempFile::new().unwrap();
326*bb4ee6a4SAndroid Build Coastguard Worker 
327*bb4ee6a4SAndroid Build Coastguard Worker     let vu_config = create_vu_config(CmdType::Device, socket.path(), guest_cid);
328*bb4ee6a4SAndroid Build Coastguard Worker     let _vu_device = VhostUserBackend::new(vu_config).unwrap();
329*bb4ee6a4SAndroid Build Coastguard Worker 
330*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new().extra_args(vec![
331*bb4ee6a4SAndroid Build Coastguard Worker         "--vhost-user".to_string(),
332*bb4ee6a4SAndroid Build Coastguard Worker         format!("vsock,socket={}", socket.path().to_str().unwrap()),
333*bb4ee6a4SAndroid Build Coastguard Worker     ]);
334*bb4ee6a4SAndroid Build Coastguard Worker 
335*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
336*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
337*bb4ee6a4SAndroid Build Coastguard Worker }
338*bb4ee6a4SAndroid Build Coastguard Worker 
339*bb4ee6a4SAndroid Build Coastguard Worker #[test]
vhost_user_guest_to_host_with_devices()340*bb4ee6a4SAndroid Build Coastguard Worker fn vhost_user_guest_to_host_with_devices() {
341*bb4ee6a4SAndroid Build Coastguard Worker     let host_port = generate_vhost_port();
342*bb4ee6a4SAndroid Build Coastguard Worker     let guest_cid = generate_guest_cid();
343*bb4ee6a4SAndroid Build Coastguard Worker     let socket = NamedTempFile::new().unwrap();
344*bb4ee6a4SAndroid Build Coastguard Worker 
345*bb4ee6a4SAndroid Build Coastguard Worker     let vu_config = create_vu_config(CmdType::Devices, socket.path(), guest_cid);
346*bb4ee6a4SAndroid Build Coastguard Worker     let _vu_device = VhostUserBackend::new(vu_config).unwrap();
347*bb4ee6a4SAndroid Build Coastguard Worker 
348*bb4ee6a4SAndroid Build Coastguard Worker     let config = Config::new().extra_args(vec![
349*bb4ee6a4SAndroid Build Coastguard Worker         "--vhost-user".to_string(),
350*bb4ee6a4SAndroid Build Coastguard Worker         format!("vsock,socket={}", socket.path().to_str().unwrap()),
351*bb4ee6a4SAndroid Build Coastguard Worker     ]);
352*bb4ee6a4SAndroid Build Coastguard Worker 
353*bb4ee6a4SAndroid Build Coastguard Worker     let mut vm = TestVm::new(config).unwrap();
354*bb4ee6a4SAndroid Build Coastguard Worker     guest_to_host_connection(&mut vm, host_port);
355*bb4ee6a4SAndroid Build Coastguard Worker }
356