iperf3-rs 1.0.1

Rust API for libiperf with live iperf3 metrics export
Documentation
use std::{fs, process::Command};

use super::helpers::*;

#[cfg(all(feature = "pushgateway", feature = "serde"))]
#[test]
fn cli_writes_jsonl_metrics_file_without_replacing_stdout() {
    let port = free_loopback_port();
    let _server = OneOffServer::start(port);
    let metrics_file = temp_metrics_path("jsonl");

    let output = run_cli_metrics_file_client(port, &metrics_file, &[]);
    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(stdout.contains("[ ID]"));
    assert!(stdout.contains("sender"));

    let metrics = fs::read_to_string(&metrics_file).unwrap();
    assert!(metrics.lines().any(
        |line| line.contains(r#""schema_version":1"#) && line.contains(r#""event":"interval""#)
    ));
    assert!(metrics.contains(r#""bandwidth_bits_per_second":"#));
    let _ = fs::remove_file(metrics_file);
}

#[cfg(all(feature = "pushgateway", feature = "serde"))]
#[test]
fn cli_writes_prometheus_metrics_file_with_custom_prefix() {
    let port = free_loopback_port();
    let _server = OneOffServer::start(port);
    let metrics_file = temp_metrics_path("prom");

    let output = run_cli_metrics_file_client(
        port,
        &metrics_file,
        &[
            "--metrics.format",
            "prometheus",
            "--metrics.prefix",
            "nettest",
            "--metrics.label",
            "site=ci",
        ],
    );
    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(stdout.contains("[ ID]"));
    assert!(stdout.contains("sender"));

    let metrics = fs::read_to_string(&metrics_file).unwrap();
    assert!(metrics.contains("nettest_transferred_bytes{site=\"ci\"} "));
    assert!(metrics.contains("nettest_bandwidth_bits_per_second{site=\"ci\"} "));
    assert!(!metrics.contains("iperf3_transferred_bytes "));
    let _ = fs::remove_file(metrics_file);
}

#[cfg(all(feature = "pushgateway", feature = "serde"))]
#[test]
fn cli_treats_metrics_file_create_failure_as_fatal() {
    let missing_dir = temp_metrics_path("missing-dir");
    let metrics_file = missing_dir.join("metrics.jsonl");
    let port = free_loopback_port().to_string();
    let metrics_file_arg = metrics_file.to_string_lossy();

    let output = Command::new(env!("CARGO_BIN_EXE_iperf3-rs"))
        .args([
            "-c",
            "127.0.0.1",
            "-p",
            port.as_str(),
            "--metrics.file",
            metrics_file_arg.as_ref(),
        ])
        .output()
        .expect("run iperf3-rs client with unwritable metrics file");

    assert!(!output.status.success());
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(
        stderr.contains("failed to create metrics file"),
        "stderr should explain metrics file failure:\n{stderr}"
    );
}