tests: Return stderr when executing commands

If we want to test for error cases, it can be useful to inspect the
`stderr` of a `Command` to analyze the errors. For example, this allows
us to ensure that a `Command` returns an `IoError` by parsing the
error trace, if an `IoError` is expected.

This commit prepares the implementation of negative integration tests
for the configurable BDFs.

Signed-off-by: Pascal Scholz <pascal.scholz@cyberus-technology.de>
On-behalf-of: SAP pascal.scholz@sap.com
This commit is contained in:
Pascal Scholz
2026-03-25 19:34:56 +01:00
committed by Rob Bradford
parent b4723999f8
commit 8259f92909
4 changed files with 26 additions and 26 deletions

View File

@@ -981,7 +981,7 @@ pub(crate) fn _test_virtio_fs(
if hotplug {
// Add fs to the VM
let (cmd_success, cmd_output) =
let (cmd_success, cmd_output, _) =
remote_command_w_output(&api_socket, add_arg, Some(&fs_params));
assert!(cmd_success);
@@ -1085,7 +1085,7 @@ pub(crate) fn _test_virtio_fs(
);
// Add back and check it works
let (cmd_success, cmd_output) =
let (cmd_success, cmd_output, _) =
remote_command_w_output(&api_socket, add_arg, Some(&fs_params));
assert!(cmd_success);
if let Some(pci_segment) = pci_segment {
@@ -1230,7 +1230,7 @@ pub(crate) fn _test_virtio_vsock(guest: &Guest, hotplug: bool) {
guest.wait_vm_boot().unwrap();
if hotplug {
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-vsock",
Some(format!("cid=3,socket={socket},id=test0").as_str()),
@@ -2697,7 +2697,7 @@ pub(crate) fn _test_disk_hotplug(guest: &Guest, landlock_enabled: bool) {
);
// Now let's add the extra disk.
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(
@@ -2733,7 +2733,7 @@ pub(crate) fn _test_disk_hotplug(guest: &Guest, landlock_enabled: bool) {
.is_ok_and(|s| s.trim().parse::<u32>().unwrap_or(1) == 0)));
// And add it back to validate unplug did work correctly.
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(
@@ -2898,7 +2898,7 @@ pub(crate) fn _test_net_hotplug(
let r = std::panic::catch_unwind(|| {
// Add network
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-net",
Some(
@@ -2959,7 +2959,7 @@ pub(crate) fn _test_net_hotplug(
}));
// Add network
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-net",
Some(
@@ -3341,7 +3341,7 @@ pub(crate) fn _test_macvtap(
None
)));
// Hotplug the virtio-net device
let (cmd_success, cmd_output) =
let (cmd_success, cmd_output, _) =
remote_command_w_output(&api_socket, "add-net", Some(&net_params));
assert!(cmd_success);
#[cfg(target_arch = "x86_64")]
@@ -3436,7 +3436,7 @@ pub(crate) fn _test_vdpa_block(guest: &Guest) {
// Hotplug an extra vDPA block device behind the vIOMMU
// Add a new vDPA device to the VM
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-vdpa",
Some("id=myvdpa0,path=/dev/vhost-vdpa-1,num_queues=1,pci_segment=1,iommu=on"),

View File

@@ -688,7 +688,7 @@ pub struct Counters {
pub(crate) fn get_counters(api_socket: &str) -> Counters {
// Get counters
let (cmd_success, cmd_output) = remote_command_w_output(api_socket, "counters", None);
let (cmd_success, cmd_output, _) = remote_command_w_output(api_socket, "counters", None);
assert!(cmd_success);
let counters: HashMap<&str, HashMap<&str, u64>> =
@@ -738,7 +738,7 @@ pub(super) fn pty_read(mut pty: std::fs::File) -> Receiver<String> {
}
pub(crate) fn get_pty_path(api_socket: &str, pty_type: &str) -> PathBuf {
let (cmd_success, cmd_output) = remote_command_w_output(api_socket, "info", None);
let (cmd_success, cmd_output, _) = remote_command_w_output(api_socket, "info", None);
assert!(cmd_success);
let info: serde_json::Value = serde_json::from_slice(&cmd_output).unwrap_or_default();
assert_eq!("Pty", info["config"][pty_type]["mode"]);
@@ -786,7 +786,7 @@ pub(crate) fn cleanup_vfio_network_interfaces() {
}
pub(crate) fn balloon_size(api_socket: &str) -> u64 {
let (cmd_success, cmd_output) = remote_command_w_output(api_socket, "info", None);
let (cmd_success, cmd_output, _) = remote_command_w_output(api_socket, "info", None);
assert!(cmd_success);
let info: serde_json::Value = serde_json::from_slice(&cmd_output).unwrap_or_default();
@@ -802,7 +802,7 @@ pub(crate) fn balloon_size(api_socket: &str) -> u64 {
}
pub(crate) fn vm_state(api_socket: &str) -> String {
let (cmd_success, cmd_output) = remote_command_w_output(api_socket, "info", None);
let (cmd_success, cmd_output, _) = remote_command_w_output(api_socket, "info", None);
assert!(cmd_success);
let info: serde_json::Value = serde_json::from_slice(&cmd_output).unwrap_or_default();

View File

@@ -375,7 +375,7 @@ mod common_parallel {
guest.wait_vm_boot().unwrap();
let r = std::panic::catch_unwind(|| {
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(
@@ -2979,7 +2979,7 @@ mod common_parallel {
guest.wait_vm_boot().unwrap();
// Add the disk to the VM
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some("path=/tmp/resize.img,id=test0"),
@@ -3094,7 +3094,7 @@ mod common_parallel {
guest.wait_vm_boot().unwrap();
// Add the QCOW2 disk to the VM
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(&format!(
@@ -4907,7 +4907,7 @@ mod common_parallel {
let pmem_temp_file = TempFile::new().unwrap();
pmem_temp_file.as_file().set_len(128 << 20).unwrap();
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-pmem",
Some(&format!(
@@ -5405,7 +5405,7 @@ mod common_parallel {
guest.wait_vm_boot().unwrap();
// Hotplug the SPDK-NVMe device to the VM
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-user-device",
Some(&format!(
@@ -7982,7 +7982,7 @@ mod windows {
assert_eq!(netdev_ctrl_threads_count(child.id()), netdev_num);
// Hotplug network device
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-net",
Some(windows_guest.guest().default_net_string().as_str()),
@@ -8066,7 +8066,7 @@ mod windows {
assert_eq!(disk_ctrl_threads_count(child.id()), disk_num);
// Hotplug disk device
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(format!("path={disk},readonly=off").as_str()),
@@ -8104,7 +8104,7 @@ mod windows {
assert_eq!(disk_ctrl_threads_count(child.id()), disk_num);
// Remount and check the file exists with the expected contents
let (cmd_success, _cmd_output) = remote_command_w_output(
let (cmd_success, _cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(format!("path={disk},readonly=off").as_str()),
@@ -8195,7 +8195,7 @@ mod windows {
let expected_ctrl_threads = disk_ctrl_threads_count(child.id()) + 1;
// Hotplug disk device
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(format!("path={disk},readonly=off").as_str()),
@@ -8248,7 +8248,7 @@ mod windows {
// Remount
for it in &disk_test_data {
let disk = it[1].as_str();
let (cmd_success, _cmd_output) = remote_command_w_output(
let (cmd_success, _cmd_output, _) = remote_command_w_output(
&api_socket,
"add-disk",
Some(format!("path={disk},readonly=off").as_str()),
@@ -8514,7 +8514,7 @@ mod vfio {
guest.wait_vm_boot().unwrap();
// Hotplug the card to the VM
let (cmd_success, cmd_output) = remote_command_w_output(
let (cmd_success, cmd_output, _) = remote_command_w_output(
&api_socket,
"add-device",
Some(format!("id=vfio0,path={NVIDIA_VFIO_DEVICE}").as_str()),

View File

@@ -1981,7 +1981,7 @@ pub fn remote_command_w_output(
api_socket: &str,
command: &str,
arg: Option<&str>,
) -> (bool, Vec<u8>) {
) -> (bool, Vec<u8> /* stdout */, Vec<u8> /* stderr */) {
let mut cmd = Command::new(clh_command("ch-remote"));
cmd.args([&format!("--api-socket={api_socket}"), command]);
@@ -1991,7 +1991,7 @@ pub fn remote_command_w_output(
let output = cmd.output().expect("Failed to launch ch-remote");
(output.status.success(), output.stdout)
(output.status.success(), output.stdout, output.stderr)
}
pub fn parse_iperf3_output(output: &[u8], sender: bool, bandwidth: bool) -> Result<f64, Error> {