tests: trim qualified paths in integration_cvm

Import the modules used in the shared common test helpers instead of
spelling the full paths at every use site, and drop the now-unnecessary
crate-level #![expect(clippy::absolute_paths)] from integration_cvm.

Signed-off-by: Henry Hrvoje Tonkovac <htonkovac@gmail.com>
Assisted-by: Claude:Opus-4.8
This commit is contained in:
Henry Hrvoje Tonkovac
2026-06-23 19:21:03 +02:00
committed by Sebastien Boeuf
parent 01de980615
commit 17cc156ccb
3 changed files with 110 additions and 123 deletions
+80 -78
View File
@@ -4,12 +4,14 @@
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use std::fs::{self, OpenOptions}; use std::fs::{self, OpenOptions};
use std::io::{Read, Seek, SeekFrom, Write}; use std::io::{Read, Seek, SeekFrom, Write};
use std::net::{IpAddr, Ipv4Addr};
use std::os::unix::io::AsRawFd; use std::os::unix::io::AsRawFd;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::process::{Child, Command};
use std::string::String; use std::string::String;
use std::sync::mpsc; use std::sync::mpsc;
use std::thread;
use std::time::Duration; use std::time::Duration;
use std::{panic, thread};
use block::ImageType; use block::ImageType;
use net_util::MacAddr; use net_util::MacAddr;
@@ -37,7 +39,7 @@ pub(crate) fn _test_api_create_boot(target_api: &TargetApi, guest: &Guest) {
let request_body = guest.api_create_body(); let request_body = guest.api_create_body();
let temp_config_path = guest.tmp_dir.as_path().join("config"); let temp_config_path = guest.tmp_dir.as_path().join("config");
std::fs::write(&temp_config_path, request_body).unwrap(); fs::write(&temp_config_path, request_body).unwrap();
let create_config = temp_config_path.as_os_str().to_str().unwrap(); let create_config = temp_config_path.as_os_str().to_str().unwrap();
assert!(target_api.remote_command("create", Some(create_config),)); assert!(target_api.remote_command("create", Some(create_config),));
@@ -45,7 +47,7 @@ pub(crate) fn _test_api_create_boot(target_api: &TargetApi, guest: &Guest) {
// Then boot it // Then boot it
assert!(target_api.remote_command("boot", None)); assert!(target_api.remote_command("boot", None));
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check that the VM booted as expected // Check that the VM booted as expected
guest.validate_cpu_count(None); guest.validate_cpu_count(None);
@@ -76,10 +78,10 @@ pub(crate) fn _test_api_shutdown(target_api: &TargetApi, guest: &Guest) {
let request_body = guest.api_create_body(); let request_body = guest.api_create_body();
let temp_config_path = guest.tmp_dir.as_path().join("config"); let temp_config_path = guest.tmp_dir.as_path().join("config");
std::fs::write(&temp_config_path, request_body).unwrap(); fs::write(&temp_config_path, request_body).unwrap();
let create_config = temp_config_path.as_os_str().to_str().unwrap(); let create_config = temp_config_path.as_os_str().to_str().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
assert!(target_api.remote_command("create", Some(create_config))); assert!(target_api.remote_command("create", Some(create_config)));
// Then boot it // Then boot it
@@ -136,10 +138,10 @@ pub(crate) fn _test_api_delete(target_api: &TargetApi, guest: &Guest) {
let request_body = guest.api_create_body(); let request_body = guest.api_create_body();
let temp_config_path = guest.tmp_dir.as_path().join("config"); let temp_config_path = guest.tmp_dir.as_path().join("config");
std::fs::write(&temp_config_path, request_body).unwrap(); fs::write(&temp_config_path, request_body).unwrap();
let create_config = temp_config_path.as_os_str().to_str().unwrap(); let create_config = temp_config_path.as_os_str().to_str().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
assert!(target_api.remote_command("create", Some(create_config))); assert!(target_api.remote_command("create", Some(create_config)));
// Then boot it // Then boot it
@@ -199,7 +201,7 @@ pub(crate) fn _test_api_pause_resume(target_api: &TargetApi, guest: &Guest) {
let request_body = guest.api_create_body(); let request_body = guest.api_create_body();
let temp_config_path = guest.tmp_dir.as_path().join("config"); let temp_config_path = guest.tmp_dir.as_path().join("config");
std::fs::write(&temp_config_path, request_body).unwrap(); fs::write(&temp_config_path, request_body).unwrap();
let create_config = temp_config_path.as_os_str().to_str().unwrap(); let create_config = temp_config_path.as_os_str().to_str().unwrap();
assert!(target_api.remote_command("create", Some(create_config))); assert!(target_api.remote_command("create", Some(create_config)));
@@ -207,7 +209,7 @@ pub(crate) fn _test_api_pause_resume(target_api: &TargetApi, guest: &Guest) {
// Then boot it // Then boot it
assert!(target_api.remote_command("boot", None)); assert!(target_api.remote_command("boot", None));
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check that the VM booted as expected // Check that the VM booted as expected
@@ -220,7 +222,7 @@ pub(crate) fn _test_api_pause_resume(target_api: &TargetApi, guest: &Guest) {
// Check pausing again fails // Check pausing again fails
assert!(!target_api.remote_command("pause", None)); assert!(!target_api.remote_command("pause", None));
thread::sleep(std::time::Duration::new(2, 0)); thread::sleep(Duration::new(2, 0));
// SSH into the VM should fail // SSH into the VM should fail
ssh_command_ip( ssh_command_ip(
@@ -237,7 +239,7 @@ pub(crate) fn _test_api_pause_resume(target_api: &TargetApi, guest: &Guest) {
// Check resuming again fails // Check resuming again fails
assert!(!target_api.remote_command("resume", None)); assert!(!target_api.remote_command("resume", None));
thread::sleep(std::time::Duration::new(2, 0)); thread::sleep(Duration::new(2, 0));
// Now we should be able to SSH back in and get the right number of CPUs // Now we should be able to SSH back in and get the right number of CPUs
guest.validate_cpu_count(None); guest.validate_cpu_count(None);
@@ -250,7 +252,7 @@ pub(crate) fn _test_api_pause_resume(target_api: &TargetApi, guest: &Guest) {
} }
pub(crate) fn _test_pty_interaction(pty_path: PathBuf) { pub(crate) fn _test_pty_interaction(pty_path: PathBuf) {
let mut cf = std::fs::OpenOptions::new() let mut cf = fs::OpenOptions::new()
.write(true) .write(true)
.read(true) .read(true)
.open(pty_path) .open(pty_path)
@@ -265,19 +267,19 @@ pub(crate) fn _test_pty_interaction(pty_path: PathBuf) {
// before the console is up and we don't want // before the console is up and we don't want
// to try and write the next line before the // to try and write the next line before the
// login process is ready. // login process is ready.
thread::sleep(std::time::Duration::new(5, 0)); thread::sleep(Duration::new(5, 0));
assert_eq!(cf.write(b"cloud\n").unwrap(), 6); assert_eq!(cf.write(b"cloud\n").unwrap(), 6);
thread::sleep(std::time::Duration::new(2, 0)); thread::sleep(Duration::new(2, 0));
assert_eq!(cf.write(b"cloud123\n").unwrap(), 9); assert_eq!(cf.write(b"cloud123\n").unwrap(), 9);
thread::sleep(std::time::Duration::new(2, 0)); thread::sleep(Duration::new(2, 0));
assert_eq!(cf.write(b"echo test_pty_console\n").unwrap(), 22); assert_eq!(cf.write(b"echo test_pty_console\n").unwrap(), 22);
thread::sleep(std::time::Duration::new(2, 0)); thread::sleep(Duration::new(2, 0));
let mut prev = String::new(); let mut prev = String::new();
// The console can stream continuously (e.g. journald forwarded to it), so // The console can stream continuously (e.g. journald forwarded to it), so
// bound the wait: a missing marker must not loop until the harness timeout. // bound the wait: a missing marker must not loop until the harness timeout.
for _ in 0..20 { for _ in 0..20 {
thread::sleep(std::time::Duration::new(2, 0)); thread::sleep(Duration::new(2, 0));
// Drain everything available this round so a large replayed backlog // Drain everything available this round so a large replayed backlog
// does not take one 2s tick per chunk to get through. // does not take one 2s tick per chunk to get through.
loop { loop {
@@ -329,7 +331,7 @@ pub(crate) fn test_cpu_topology(
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!( assert_eq!(
guest.get_cpu_count().unwrap_or_default(), guest.get_cpu_count().unwrap_or_default(),
@@ -458,7 +460,7 @@ pub(crate) fn _test_guest_numa_nodes(acpi: bool) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
guest.check_numa_common( guest.check_numa_common(
@@ -481,7 +483,7 @@ pub(crate) fn _test_guest_numa_nodes(acpi: bool) {
// Resize to the maximum amount of CPUs and check each NUMA // Resize to the maximum amount of CPUs and check each NUMA
// node has been assigned the right CPUs set. // node has been assigned the right CPUs set.
resize_command(&api_socket, Some(12), None, None, None); resize_command(&api_socket, Some(12), None, None, None);
thread::sleep(std::time::Duration::new(5, 0)); thread::sleep(Duration::new(5, 0));
guest.check_numa_common( guest.check_numa_common(
Some(&[3_840_000, 3_840_000, 3_840_000]), Some(&[3_840_000, 3_840_000, 3_840_000]),
@@ -512,7 +514,7 @@ pub(crate) fn _test_power_button(guest: &Guest) {
let child = cmd.spawn().unwrap(); let child = cmd.spawn().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert!(remote_command(&api_socket, "power-button", None)); assert!(remote_command(&api_socket, "power-button", None));
}); });
@@ -580,8 +582,8 @@ pub(crate) fn test_vhost_user_net(
.args(["--api-socket", &api_socket]) .args(["--api-socket", &api_socket])
.capture_output(); .capture_output();
let mut daemon_child: std::process::Child; let mut daemon_child: Child;
let mut child: std::process::Child; let mut child: Child;
if client_mode_daemon { if client_mode_daemon {
child = ch_command.spawn().unwrap(); child = ch_command.spawn().unwrap();
@@ -601,7 +603,7 @@ pub(crate) fn test_vhost_user_net(
child = ch_command.spawn().unwrap(); child = ch_command.spawn().unwrap();
} }
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
if let Some(tap_name) = tap { if let Some(tap_name) = tap {
@@ -692,7 +694,7 @@ pub(crate) fn test_vhost_user_net(
handle_child_output(r, &output); handle_child_output(r, &output);
} }
type PrepareBlkDaemon = dyn Fn(&TempDir, &str, usize, bool, bool) -> (std::process::Child, String); type PrepareBlkDaemon = dyn Fn(&TempDir, &str, usize, bool, bool) -> (Child, String);
pub(crate) fn test_vhost_user_blk( pub(crate) fn test_vhost_user_blk(
num_queues: usize, num_queues: usize,
@@ -745,7 +747,7 @@ pub(crate) fn test_vhost_user_blk(
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check both if /dev/vdc exists and if the block size is 16M. // Check both if /dev/vdc exists and if the block size is 16M.
@@ -887,7 +889,7 @@ pub(crate) fn test_boot_from_vhost_user_blk(
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Just check the VM booted correctly. // Just check the VM booted correctly.
@@ -906,7 +908,7 @@ pub(crate) fn test_boot_from_vhost_user_blk(
} }
pub(crate) fn _test_virtio_fs( pub(crate) fn _test_virtio_fs(
prepare_daemon: &dyn Fn(&TempDir, &str) -> (std::process::Child, String), prepare_daemon: &dyn Fn(&TempDir, &str) -> (Child, String),
hotplug: bool, hotplug: bool,
use_generic_vhost_user: bool, use_generic_vhost_user: bool,
pci_segment: Option<u16>, pci_segment: Option<u16>,
@@ -984,7 +986,7 @@ pub(crate) fn _test_virtio_fs(
"add-fs" "add-fs"
}; };
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
if hotplug { if hotplug {
@@ -1073,12 +1075,12 @@ pub(crate) fn _test_virtio_fs(
let _ = daemon_child.kill(); let _ = daemon_child.kill();
let _ = daemon_child.wait(); let _ = daemon_child.wait();
// Remove the stale socket so wait_for_virtiofsd_socket actually waits // Remove the stale socket so wait_for_virtiofsd_socket actually waits
let _ = std::fs::remove_file(&virtiofsd_socket_path); let _ = fs::remove_file(&virtiofsd_socket_path);
let (daemon_child, virtiofsd_socket_path) = let (daemon_child, virtiofsd_socket_path) =
prepare_daemon(&guest.tmp_dir, shared_dir.to_str().unwrap()); prepare_daemon(&guest.tmp_dir, shared_dir.to_str().unwrap());
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
// Wait for the daemon socket to be ready // Wait for the daemon socket to be ready
assert!(wait_until(Duration::from_secs(10), || Path::new( assert!(wait_until(Duration::from_secs(10), || Path::new(
&virtiofsd_socket_path &virtiofsd_socket_path
@@ -1158,7 +1160,7 @@ pub(crate) fn test_virtio_pmem(discard_writes: bool, specify_size: bool) {
let pmem_temp_file = TempFile::new().unwrap(); let pmem_temp_file = TempFile::new().unwrap();
pmem_temp_file.as_file().set_len(128 << 20).unwrap(); pmem_temp_file.as_file().set_len(128 << 20).unwrap();
std::process::Command::new("mkfs.ext4") Command::new("mkfs.ext4")
.arg(pmem_temp_file.as_path()) .arg(pmem_temp_file.as_path())
.output() .output()
.expect("Expect creating disk image to succeed"); .expect("Expect creating disk image to succeed");
@@ -1188,7 +1190,7 @@ pub(crate) fn test_virtio_pmem(discard_writes: bool, specify_size: bool) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check for the presence of /dev/pmem0 // Check for the presence of /dev/pmem0
@@ -1241,7 +1243,7 @@ pub(crate) fn _test_virtio_vsock(guest: &Guest, hotplug: bool) {
let mut child = cmd.capture_output().spawn().unwrap(); let mut child = cmd.capture_output().spawn().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
if hotplug { if hotplug {
@@ -1255,7 +1257,7 @@ pub(crate) fn _test_virtio_vsock(guest: &Guest, hotplug: bool) {
String::from_utf8_lossy(&cmd_output) String::from_utf8_lossy(&cmd_output)
.contains("{\"id\":\"test0\",\"bdf\":\"0000:00:06.0\"}") .contains("{\"id\":\"test0\",\"bdf\":\"0000:00:06.0\"}")
); );
thread::sleep(std::time::Duration::new(10, 0)); thread::sleep(Duration::new(10, 0));
// Check adding a second one fails // Check adding a second one fails
assert!(!remote_command( assert!(!remote_command(
&api_socket, &api_socket,
@@ -1305,7 +1307,7 @@ pub(crate) fn test_memory_mergeable(mergeable: bool) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest1.wait_vm_boot().unwrap(); guest1.wait_vm_boot().unwrap();
}); });
if r.is_err() { if r.is_err() {
@@ -1331,7 +1333,7 @@ pub(crate) fn test_memory_mergeable(mergeable: bool) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest2.wait_vm_boot().unwrap(); guest2.wait_vm_boot().unwrap();
let ksm_ps_guest2 = get_ksm_pages_shared(); let ksm_ps_guest2 = get_ksm_pages_shared();
@@ -1398,7 +1400,7 @@ pub(crate) fn _test_virtio_iommu(_acpi: bool /* not needed on x86_64 */) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Verify the virtio-iommu device is present. // Verify the virtio-iommu device is present.
@@ -1602,7 +1604,7 @@ pub(crate) fn _test_simple_launch(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
guest.validate_cpu_count(None); guest.validate_cpu_count(None);
@@ -1663,7 +1665,7 @@ pub(crate) fn _test_multi_cpu(guest: &Guest) {
let mut child = cmd.spawn().unwrap(); let mut child = cmd.spawn().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!(guest.get_cpu_count().unwrap_or_default(), 2); assert_eq!(guest.get_cpu_count().unwrap_or_default(), 2);
@@ -1705,7 +1707,7 @@ pub(crate) fn _test_cpu_affinity(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
let pid = child.id(); let pid = child.id();
let taskset_vcpu0 = exec_host_command_output(format!("taskset -pc $(ps -T -p {pid} | grep vcpu0 | xargs | cut -f 2 -d \" \") | cut -f 6 -d \" \"").as_str()); let taskset_vcpu0 = exec_host_command_output(format!("taskset -pc $(ps -T -p {pid} | grep vcpu0 | xargs | cut -f 2 -d \" \") | cut -f 6 -d \" \"").as_str());
@@ -1753,7 +1755,7 @@ pub(crate) fn _test_virtio_queue_affinity(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
let pid = child.id(); let pid = child.id();
let taskset_q0 = exec_host_command_output(format!("taskset -pc $(ps -T -p {pid} | grep disk1_q0 | xargs | cut -f 2 -d \" \") | cut -f 6 -d \" \"").as_str()); let taskset_q0 = exec_host_command_output(format!("taskset -pc $(ps -T -p {pid} | grep disk1_q0 | xargs | cut -f 2 -d \" \") | cut -f 6 -d \" \"").as_str());
@@ -1786,7 +1788,7 @@ pub(crate) fn _test_pci_msi(guest: &Guest) {
let grep_cmd = format!("grep -c {} /proc/interrupts", get_msi_interrupt_pattern()); let grep_cmd = format!("grep -c {} /proc/interrupts", get_msi_interrupt_pattern());
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
assert_eq!( assert_eq!(
guest guest
.ssh_command(&grep_cmd) .ssh_command(&grep_cmd)
@@ -1822,7 +1824,7 @@ pub(crate) fn _test_virtio_net_ctrl_queue(guest: &Guest) {
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
let iface = "ens4"; let iface = "ens4";
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
assert_eq!( assert_eq!(
guest guest
.ssh_command( .ssh_command(
@@ -1896,7 +1898,7 @@ pub(crate) fn _test_pci_multiple_segments(
let grep_cmd = "lspci | grep \"Host bridge\" | wc -l"; let grep_cmd = "lspci | grep \"Host bridge\" | wc -l";
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
// There should be MAX_NUM_PCI_SEGMENTS PCI host bridges in the guest. // There should be MAX_NUM_PCI_SEGMENTS PCI host bridges in the guest.
assert_eq!( assert_eq!(
guest guest
@@ -1960,7 +1962,7 @@ pub(crate) fn _test_direct_kernel_boot(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
guest.validate_cpu_count(None); guest.validate_cpu_count(None);
@@ -2037,7 +2039,7 @@ pub(crate) fn _test_virtio_block(
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check both if /dev/vdc exists and if the block size is 16M. // Check both if /dev/vdc exists and if the block size is 16M.
@@ -2103,7 +2105,7 @@ pub fn _test_virtio_block_dynamic_vhdx_expand(guest: &Guest) {
let vhdx_path = vhdx_pathbuf.to_str().unwrap(); let vhdx_path = vhdx_pathbuf.to_str().unwrap();
// Generate a 100 MiB dynamic VHDX file // Generate a 100 MiB dynamic VHDX file
std::process::Command::new("qemu-img") Command::new("qemu-img")
.arg("create") .arg("create")
.args(["-f", "vhdx"]) .args(["-f", "vhdx"])
.arg(vhdx_path) .arg(vhdx_path)
@@ -2137,7 +2139,7 @@ pub fn _test_virtio_block_dynamic_vhdx_expand(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check both if /dev/vdc exists and if the block size is 100 MiB. // Check both if /dev/vdc exists and if the block size is 100 MiB.
@@ -2169,7 +2171,7 @@ pub fn _test_virtio_block_dynamic_vhdx_expand(guest: &Guest) {
} }
fn vhdx_image_size(disk_name: &str) -> u64 { fn vhdx_image_size(disk_name: &str) -> u64 {
std::fs::File::open(disk_name) fs::File::open(disk_name)
.unwrap() .unwrap()
.seek(SeekFrom::End(0)) .seek(SeekFrom::End(0))
.unwrap() .unwrap()
@@ -2187,7 +2189,7 @@ pub fn _test_split_irqchip(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!( assert_eq!(
@@ -2228,7 +2230,7 @@ pub(crate) fn _test_dmi_serial_number(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!( assert_eq!(
@@ -2259,7 +2261,7 @@ pub(crate) fn _test_dmi_uuid(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!( assert_eq!(
@@ -2293,7 +2295,7 @@ pub(crate) fn _test_dmi_oem_strings(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!( assert_eq!(
@@ -2354,7 +2356,7 @@ pub(crate) fn _test_dmi_system_and_chassis(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
for (_, dmidecode_field, expected) in fields { for (_, dmidecode_field, expected) in fields {
@@ -2387,7 +2389,7 @@ pub(crate) fn _test_serial_off(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Test that there is no ttyS0 // Test that there is no ttyS0
@@ -2424,7 +2426,7 @@ pub(crate) fn _test_multiple_network_interfaces(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
let tap_count = exec_host_command_output("ip link | grep -c mytap1"); let tap_count = exec_host_command_output("ip link | grep -c mytap1");
@@ -2464,7 +2466,7 @@ pub(crate) fn _test_virtio_console(guest: &Guest) {
let text = String::from("On a branch floating down river a cricket, singing."); let text = String::from("On a branch floating down river a cricket, singing.");
let cmd = format!("echo {text} | sudo tee /dev/hvc0"); let cmd = format!("echo {text} | sudo tee /dev/hvc0");
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert!( assert!(
@@ -2480,7 +2482,7 @@ pub(crate) fn _test_virtio_console(guest: &Guest) {
let output = child.wait_with_output().unwrap(); let output = child.wait_with_output().unwrap();
handle_child_output(r, &output); handle_child_output(r, &output);
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
assert!(String::from_utf8_lossy(&output.stdout).contains(&text)); assert!(String::from_utf8_lossy(&output.stdout).contains(&text));
}); });
@@ -2507,17 +2509,17 @@ pub(crate) fn _test_console_file(guest: &Guest) {
guest.ssh_command("sudo shutdown -h now").unwrap(); guest.ssh_command("sudo shutdown -h now").unwrap();
let _ = child.wait_timeout(std::time::Duration::from_secs(20)); let _ = child.wait_timeout(Duration::from_secs(20));
kill_child(&mut child); kill_child(&mut child);
let output = child.wait_with_output().unwrap(); let output = child.wait_with_output().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
// Check that the cloud-hypervisor binary actually terminated // Check that the cloud-hypervisor binary actually terminated
assert!(output.status.success()); assert!(output.status.success());
// Do this check after shutdown of the VM as an easy way to ensure // Do this check after shutdown of the VM as an easy way to ensure
// all writes are flushed to disk // all writes are flushed to disk
let mut f = std::fs::File::open(console_path).unwrap(); let mut f = fs::File::open(console_path).unwrap();
let mut buf = String::new(); let mut buf = String::new();
f.read_to_string(&mut buf).unwrap(); f.read_to_string(&mut buf).unwrap();
@@ -2543,7 +2545,7 @@ pub(crate) fn _test_direct_kernel_boot_noacpi(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!(guest.get_cpu_count().unwrap_or_default(), 1); assert_eq!(guest.get_cpu_count().unwrap_or_default(), 1);
@@ -2571,7 +2573,7 @@ pub(crate) fn _test_pci_bar_reprogramming(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// 2 network interfaces + default localhost ==> 3 interfaces // 2 network interfaces + default localhost ==> 3 interfaces
@@ -2656,7 +2658,7 @@ pub(crate) fn _test_memory_overhead(guest: &Guest, guest_memory_size_kb: u32) {
MAXIMUM_VMM_OVERHEAD_KB MAXIMUM_VMM_OVERHEAD_KB
}; };
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
let overhead = get_vmm_overhead(child.id(), guest_memory_size_kb); let overhead = get_vmm_overhead(child.id(), guest_memory_size_kb);
eprintln!("Guest memory overhead: {overhead} vs {max_overhead}"); eprintln!("Guest memory overhead: {overhead} vs {max_overhead}");
assert!(overhead <= max_overhead); assert!(overhead <= max_overhead);
@@ -2683,7 +2685,7 @@ pub(crate) fn _test_landlock(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check /dev/vdc is not there // Check /dev/vdc is not there
@@ -2747,7 +2749,7 @@ pub(crate) fn _test_disk_hotplug(guest: &Guest, landlock_enabled: bool) {
let mut child = cmd.spawn().unwrap(); let mut child = cmd.spawn().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check /dev/vdc is not there // Check /dev/vdc is not there
@@ -2891,7 +2893,7 @@ pub(crate) fn _test_virtio_block_topology(guest: &Guest, loop_dev: &str) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// MIN-IO column // MIN-IO column
@@ -2961,7 +2963,7 @@ pub(crate) fn _test_net_hotplug(
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
// Add network // Add network
let (cmd_success, cmd_output, _) = remote_command_w_output( let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket, &api_socket,
@@ -3110,7 +3112,7 @@ pub(crate) fn _test_counters(guest: &Guest) {
let mut child = cmd.spawn().unwrap(); let mut child = cmd.spawn().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
let orig_counters = get_counters(&api_socket); let orig_counters = get_counters(&api_socket);
@@ -3147,7 +3149,7 @@ pub(crate) fn _test_watchdog(guest: &Guest) {
let mut child = cmd.spawn().unwrap(); let mut child = cmd.spawn().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
let mut expected_reboot_count = 1; let mut expected_reboot_count = 1;
@@ -3167,7 +3169,7 @@ pub(crate) fn _test_watchdog(guest: &Guest) {
); );
// Allow some normal time to elapse to check we don't get spurious reboots // Allow some normal time to elapse to check we don't get spurious reboots
thread::sleep(std::time::Duration::new(40, 0)); thread::sleep(Duration::new(40, 0));
// Check no reboot // Check no reboot
assert_eq!(get_reboot_count(guest), expected_reboot_count); assert_eq!(get_reboot_count(guest), expected_reboot_count);
@@ -3224,7 +3226,7 @@ pub(crate) fn _test_pvpanic(guest: &Guest) {
let mut child = cmd.spawn().unwrap(); let mut child = cmd.spawn().unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Trigger guest a panic // Trigger guest a panic
@@ -3255,8 +3257,8 @@ pub(crate) fn _test_tap_from_fd(guest: &Guest) {
use std::str::FromStr; use std::str::FromStr;
let taps = net_util::open_tap( let taps = net_util::open_tap(
Some("chtap0"), Some("chtap0"),
Some(std::net::IpAddr::V4( Some(IpAddr::V4(
std::net::Ipv4Addr::from_str(&guest.network.host_ip0).unwrap(), Ipv4Addr::from_str(&guest.network.host_ip0).unwrap(),
)), )),
None, None,
&mut None, &mut None,
@@ -3285,7 +3287,7 @@ pub(crate) fn _test_tap_from_fd(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!( assert_eq!(
@@ -3432,7 +3434,7 @@ pub(crate) fn _test_macvtap(
// The functional connectivity provided by the virtio-net device // The functional connectivity provided by the virtio-net device
// gets tested through wait_vm_boot() as it expects to receive a // gets tested through wait_vm_boot() as it expects to receive a
// HTTP request, and through the SSH command as well. // HTTP request, and through the SSH command as well.
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
assert_eq!( assert_eq!(
@@ -3483,7 +3485,7 @@ pub(crate) fn _test_vdpa_block(guest: &Guest) {
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest.wait_vm_boot().unwrap(); guest.wait_vm_boot().unwrap();
// Check both if /dev/vdc exists and if the block size is 128M. // Check both if /dev/vdc exists and if the block size is 128M.
+30 -43
View File
@@ -7,12 +7,12 @@ use std::io::{BufRead, Read, Seek, SeekFrom, Write};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
#[cfg(not(feature = "mshv"))] #[cfg(not(feature = "mshv"))]
use std::process::Stdio; use std::process::Stdio;
use std::process::{Child, Command}; use std::process::{Child, Command, Output};
use std::string::String; use std::string::String;
use std::sync::mpsc; use std::sync::mpsc;
use std::sync::mpsc::Receiver; use std::sync::mpsc::Receiver;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use std::{cmp, fs, io, thread}; use std::{cmp, fs, io, panic, thread};
use block::formats::qcow::internal::ImageType as QcowImageType; use block::formats::qcow::internal::ImageType as QcowImageType;
use test_infra::*; use test_infra::*;
@@ -112,10 +112,7 @@ pub(crate) fn wait_for_virtiofsd_socket(socket: &str) {
} }
} }
pub(crate) fn prepare_virtiofsd( pub(crate) fn prepare_virtiofsd(tmp_dir: &TempDir, shared_dir: &str) -> (Child, String) {
tmp_dir: &TempDir,
shared_dir: &str,
) -> (std::process::Child, String) {
let mut workload_path = dirs::home_dir().unwrap(); let mut workload_path = dirs::home_dir().unwrap();
workload_path.push("workloads"); workload_path.push("workloads");
@@ -146,7 +143,7 @@ pub(crate) fn prepare_vubd(
num_queues: usize, num_queues: usize,
rdonly: bool, rdonly: bool,
direct: bool, direct: bool,
) -> (std::process::Child, String) { ) -> (Child, String) {
let mut workload_path = dirs::home_dir().unwrap(); let mut workload_path = dirs::home_dir().unwrap();
workload_path.push("workloads"); workload_path.push("workloads");
@@ -168,7 +165,7 @@ pub(crate) fn prepare_vubd(
.spawn() .spawn()
.unwrap(); .unwrap();
thread::sleep(std::time::Duration::new(10, 0)); thread::sleep(Duration::new(10, 0));
(child, vubd_socket_path) (child, vubd_socket_path)
} }
@@ -184,7 +181,7 @@ pub(crate) fn temp_event_monitor_path(tmp_dir: &TempDir) -> String {
// Creates the directory and returns the path. // Creates the directory and returns the path.
pub(crate) fn temp_snapshot_dir_path(tmp_dir: &TempDir) -> String { pub(crate) fn temp_snapshot_dir_path(tmp_dir: &TempDir) -> String {
let snapshot_dir = String::from(tmp_dir.as_path().join("snapshot").to_str().unwrap()); let snapshot_dir = String::from(tmp_dir.as_path().join("snapshot").to_str().unwrap());
std::fs::create_dir(&snapshot_dir).unwrap(); fs::create_dir(&snapshot_dir).unwrap();
snapshot_dir snapshot_dir
} }
@@ -212,7 +209,7 @@ pub(crate) fn prepare_vhost_user_net_daemon(
mtu: Option<u16>, mtu: Option<u16>,
num_queues: usize, num_queues: usize,
client_mode: bool, client_mode: bool,
) -> (std::process::Command, String) { ) -> (Command, String) {
let vunet_socket_path = String::from(tmp_dir.as_path().join("vunet.sock").to_str().unwrap()); let vunet_socket_path = String::from(tmp_dir.as_path().join("vunet.sock").to_str().unwrap());
// Start the daemon // Start the daemon
@@ -234,7 +231,7 @@ pub(crate) fn prepare_vhost_user_net_daemon(
(command, vunet_socket_path) (command, vunet_socket_path)
} }
pub(crate) fn prepare_swtpm_daemon(tmp_dir: &TempDir) -> (std::process::Command, String) { pub(crate) fn prepare_swtpm_daemon(tmp_dir: &TempDir) -> (Command, String) {
let swtpm_tpm_dir = String::from(tmp_dir.as_path().join("swtpm").to_str().unwrap()); let swtpm_tpm_dir = String::from(tmp_dir.as_path().join("swtpm").to_str().unwrap());
let swtpm_socket_path = String::from( let swtpm_socket_path = String::from(
tmp_dir tmp_dir
@@ -244,7 +241,7 @@ pub(crate) fn prepare_swtpm_daemon(tmp_dir: &TempDir) -> (std::process::Command,
.to_str() .to_str()
.unwrap(), .unwrap(),
); );
std::fs::create_dir(&swtpm_tpm_dir).unwrap(); fs::create_dir(&swtpm_tpm_dir).unwrap();
let mut swtpm_command = Command::new("swtpm"); let mut swtpm_command = Command::new("swtpm");
let swtpm_args = [ let swtpm_args = [
@@ -298,7 +295,7 @@ pub(crate) fn resize_command(
}, },
]; ];
// See: #5938 // See: #5938
thread::sleep(std::time::Duration::new(1, 0)); thread::sleep(Duration::new(1, 0));
assert!(check_latest_events_exact(&latest_events, event_path)); assert!(check_latest_events_exact(&latest_events, event_path));
} }
@@ -393,7 +390,7 @@ pub(crate) fn setup_ovs_dpdk_guests(
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
let guest_net_iface = "enp0s5"; let guest_net_iface = "enp0s5";
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest1.wait_vm_boot().unwrap(); guest1.wait_vm_boot().unwrap();
guest1 guest1
@@ -438,7 +435,7 @@ pub(crate) fn setup_ovs_dpdk_guests(
.spawn() .spawn()
.unwrap(); .unwrap();
let r = std::panic::catch_unwind(|| { let r = panic::catch_unwind(|| {
guest2.wait_vm_boot().unwrap(); guest2.wait_vm_boot().unwrap();
guest2 guest2
@@ -660,14 +657,8 @@ pub(super) fn get_msi_interrupt_pattern() -> String {
} }
} }
pub(super) type PrepareNetDaemon = dyn Fn( pub(super) type PrepareNetDaemon =
&TempDir, dyn Fn(&TempDir, &str, Option<&str>, Option<u16>, usize, bool) -> (Command, String);
&str,
Option<&str>,
Option<u16>,
usize,
bool,
) -> (std::process::Command, String);
pub(super) fn get_ksm_pages_shared() -> u32 { pub(super) fn get_ksm_pages_shared() -> u32 {
fs::read_to_string("/sys/kernel/mm/ksm/pages_shared") fs::read_to_string("/sys/kernel/mm/ksm/pages_shared")
@@ -778,7 +769,7 @@ pub(crate) fn get_counters(api_socket: &str) -> Counters {
} }
} }
pub(super) fn pty_read(mut pty: std::fs::File) -> Receiver<String> { pub(super) fn pty_read(mut pty: fs::File) -> Receiver<String> {
let (tx, rx) = mpsc::channel::<String>(); let (tx, rx) = mpsc::channel::<String>();
thread::spawn(move || { thread::spawn(move || {
loop { loop {
@@ -881,8 +872,8 @@ pub(crate) fn make_virtio_block_guest(factory: &GuestFactory, image_name: &str)
} }
pub(crate) fn compute_backing_checksum( pub(crate) fn compute_backing_checksum(
path_or_image_name: impl AsRef<std::path::Path>, path_or_image_name: impl AsRef<Path>,
) -> Option<(std::path::PathBuf, String, u32)> { ) -> Option<(PathBuf, String, u32)> {
let path = resolve_disk_path(path_or_image_name); let path = resolve_disk_path(path_or_image_name);
let mut file = File::open(&path).ok()?; let mut file = File::open(&path).ok()?;
@@ -896,11 +887,11 @@ pub(crate) fn compute_backing_checksum(
let info = get_image_info(&path)?; let info = get_image_info(&path)?;
let backing_file = info["backing-filename"].as_str()?; let backing_file = info["backing-filename"].as_str()?;
let backing_path = if std::path::Path::new(backing_file).is_absolute() { let backing_path = if Path::new(backing_file).is_absolute() {
std::path::PathBuf::from(backing_file) PathBuf::from(backing_file)
} else { } else {
path.parent() path.parent()
.unwrap_or_else(|| std::path::Path::new(".")) .unwrap_or_else(|| Path::new("."))
.join(backing_file) .join(backing_file)
}; };
@@ -928,8 +919,8 @@ pub(crate) fn compute_backing_checksum(
/// ///
/// For QCOW2 v3 images, also verifies the dirty bit is cleared. /// For QCOW2 v3 images, also verifies the dirty bit is cleared.
pub(crate) fn disk_check_consistency( pub(crate) fn disk_check_consistency(
path_or_image_name: impl AsRef<std::path::Path>, path_or_image_name: impl AsRef<Path>,
initial_backing_checksum: Option<(std::path::PathBuf, String, u32)>, initial_backing_checksum: Option<(PathBuf, String, u32)>,
) { ) {
let path = resolve_disk_path(path_or_image_name); let path = resolve_disk_path(path_or_image_name);
let output = run_qemu_img(&path, &["check"], None); let output = run_qemu_img(&path, &["check"], None);
@@ -968,12 +959,8 @@ pub(crate) fn disk_check_consistency(
} }
} }
pub(crate) fn run_qemu_img( pub(crate) fn run_qemu_img(path: &Path, args: &[&str], trailing_args: Option<&[&str]>) -> Output {
path: &std::path::Path, let mut cmd = Command::new("qemu-img");
args: &[&str],
trailing_args: Option<&[&str]>,
) -> std::process::Output {
let mut cmd = std::process::Command::new("qemu-img");
cmd.arg(args[0]) cmd.arg(args[0])
.args(&args[1..]) .args(&args[1..])
.arg(path.to_str().unwrap()); .arg(path.to_str().unwrap());
@@ -983,7 +970,7 @@ pub(crate) fn run_qemu_img(
cmd.output().unwrap() cmd.output().unwrap()
} }
fn get_image_info(path: &std::path::Path) -> Option<serde_json::Value> { fn get_image_info(path: &Path) -> Option<serde_json::Value> {
let output = run_qemu_img(path, &["info", "-U", "--output=json"], None); let output = run_qemu_img(path, &["info", "-U", "--output=json"], None);
output.status.success().then_some(())?; output.status.success().then_some(())?;
@@ -1032,7 +1019,7 @@ pub(crate) fn set_corrupt_flag(path: &Path, corrupt: bool) -> io::Result<()> {
Ok(()) Ok(())
} }
fn resolve_disk_path(path_or_image_name: impl AsRef<std::path::Path>) -> std::path::PathBuf { fn resolve_disk_path(path_or_image_name: impl AsRef<Path>) -> PathBuf {
if path_or_image_name.as_ref().exists() { if path_or_image_name.as_ref().exists() {
// A full path is provided // A full path is provided
path_or_image_name.as_ref().to_path_buf() path_or_image_name.as_ref().to_path_buf()
@@ -1044,7 +1031,7 @@ fn resolve_disk_path(path_or_image_name: impl AsRef<std::path::Path>) -> std::pa
} }
} }
pub(crate) fn compute_file_checksum(reader: &mut dyn std::io::Read, size: u64) -> u32 { pub(crate) fn compute_file_checksum(reader: &mut dyn io::Read, size: u64) -> u32 {
// Read first 16MB or entire data if smaller // Read first 16MB or entire data if smaller
let read_size = cmp::min(size, 16 * 1024 * 1024) as usize; let read_size = cmp::min(size, 16 * 1024 * 1024) as usize;
@@ -1143,7 +1130,7 @@ pub(crate) fn start_live_migration(
.spawn() .spawn()
.unwrap(); .unwrap();
// Give it '1s' to make sure the 'migration_socket' file is properly created // Give it '1s' to make sure the 'migration_socket' file is properly created
thread::sleep(std::time::Duration::new(1, 0)); thread::sleep(Duration::new(1, 0));
if paused { if paused {
// Test the migration of a paused VM. // Test the migration of a paused VM.
@@ -1174,7 +1161,7 @@ pub(crate) fn start_live_migration(
// The 'send-migration' command should be executed successfully within the given timeout // The 'send-migration' command should be executed successfully within the given timeout
let send_success = if let Some(status) = send_migration let send_success = if let Some(status) = send_migration
.wait_timeout(std::time::Duration::from_secs(30)) .wait_timeout(Duration::from_secs(30))
.unwrap() .unwrap()
{ {
status.success() status.success()
@@ -1196,7 +1183,7 @@ pub(crate) fn start_live_migration(
// The 'receive-migration' command should be executed successfully within the given timeout // The 'receive-migration' command should be executed successfully within the given timeout
let receive_success = if let Some(status) = receive_migration let receive_success = if let Some(status) = receive_migration
.wait_timeout(std::time::Duration::from_secs(30)) .wait_timeout(Duration::from_secs(30))
.unwrap() .unwrap()
{ {
status.success() status.success()
@@ -4,8 +4,6 @@
// //
#![cfg(any(devcli_testenv, clippy))] #![cfg(any(devcli_testenv, clippy))]
#![expect(clippy::undocumented_unsafe_blocks)] #![expect(clippy::undocumented_unsafe_blocks)]
// TODO: Trim qualified paths in this crate, then drop this expectation.
#![expect(clippy::absolute_paths)]
// When enabling the `mshv` feature, we skip quite some tests and // When enabling the `mshv` feature, we skip quite some tests and
// hence have known dead-code. This annotation silences dead-code // hence have known dead-code. This annotation silences dead-code
// related warnings for our quality workflow to pass. // related warnings for our quality workflow to pass.