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