use hypomnesis::{Snapshot, device_count, device_info, gpu_processes, process_gpu_info};
#[test]
#[ignore = "requires NVIDIA GPU + driver"]
#[allow(clippy::expect_used)]
fn device_count_succeeds() {
let count = device_count().expect("NVIDIA GPU + driver required");
assert!(count >= 1, "expected at least one NVIDIA GPU, got {count}");
}
#[test]
#[ignore = "requires NVIDIA GPU + driver"]
#[allow(clippy::expect_used)]
fn device_info_returns_plausible_total_bytes() {
let info = device_info(0).expect("device_info(0) requires NVIDIA GPU + driver");
assert!(
info.total_bytes >= 1024 * 1024 * 1024,
"total_bytes={} (expected ≥ 1 GiB)",
info.total_bytes
);
assert!(
info.total_bytes <= 1024_u64.pow(4),
"total_bytes={} (expected ≤ 1 TiB)",
info.total_bytes
);
assert!(info.free_bytes <= info.total_bytes);
assert!(info.used_bytes <= info.total_bytes);
}
#[test]
#[ignore = "requires NVIDIA GPU + driver"]
#[allow(clippy::expect_used)]
fn snapshot_now_returns_ram_and_gpu_device() {
let snap = Snapshot::now(0).expect("Snapshot::now failed");
assert!(snap.ram_bytes > 0);
assert!(
snap.gpu_device.is_some(),
"expected gpu_device to be populated on an NVIDIA-equipped host"
);
}
#[test]
#[ignore = "requires NVIDIA GPU + driver"]
#[allow(clippy::expect_used)]
fn process_gpu_info_returns_expected_source_per_platform() {
let info = process_gpu_info(0).expect("process_gpu_info(0) requires NVIDIA GPU + driver");
#[cfg(target_os = "windows")]
{
assert_eq!(info.source, hypomnesis::GpuQuerySource::Dxgi);
assert!(info.is_per_process);
}
#[cfg(target_os = "linux")]
{
assert!(
info.source == hypomnesis::GpuQuerySource::NvidiaSmi
|| info.source == hypomnesis::GpuQuerySource::Nvml,
"expected NvidiaSmi or Nvml on Linux, got {:?}",
info.source
);
}
}
#[test]
#[ignore = "requires NVIDIA GPU + driver"]
fn out_of_range_index_yields_device_index_error() {
let result = device_info(255);
assert!(
matches!(
result,
Err(hypomnesis::HypomnesisError::DeviceIndexOutOfRange { .. })
),
"expected DeviceIndexOutOfRange, got {result:?}"
);
}
#[test]
#[ignore = "requires NVIDIA GPU + driver"]
#[allow(clippy::expect_used)]
fn snapshot_all_enumerates_nvidia_and_optional_extras() {
let snaps = Snapshot::all().expect("Snapshot::all failed on NVIDIA-equipped host");
assert!(
!snaps.is_empty(),
"expected at least one GPU snapshot on an NVIDIA-equipped host"
);
for (expected_idx, snap) in snaps.iter().enumerate() {
assert!(snap.ram_bytes > 0, "entry {expected_idx} ram_bytes == 0");
let dev = snap
.gpu_device
.as_ref()
.expect("Snapshot::all entry missing gpu_device");
#[allow(clippy::as_conversions, clippy::cast_possible_truncation)]
let want = expected_idx as u32;
assert_eq!(
dev.index, want,
"entry {expected_idx} has index {} (expected {want})",
dev.index
);
assert!(
dev.total_bytes > 0,
"entry {expected_idx} total_bytes == 0 (name={:?})",
dev.name
);
}
#[cfg(windows)]
if let Some(extra) = snaps.get(1) {
let dev = extra
.gpu_device
.as_ref()
.expect("second Snapshot::all entry missing gpu_device");
assert!(dev.index >= 1, "second entry index < 1");
if let Some(p) = &extra.gpu {
assert_eq!(p.source, hypomnesis::GpuQuerySource::Dxgi);
assert!(p.is_per_process);
}
}
}
#[test]
#[ignore = "requires NVIDIA GPU + driver"]
#[allow(clippy::expect_used)]
fn gpu_processes_succeeds_on_live_host() {
let rows = gpu_processes(0).expect("gpu_processes(0) failed on NVIDIA-equipped host");
for row in &rows {
assert!(row.pid > 0, "expected positive PID, got {}", row.pid);
assert!(
matches!(
row.source,
hypomnesis::GpuQuerySource::Nvml | hypomnesis::GpuQuerySource::NvidiaSmi
),
"unexpected source {:?} for gpu_processes row",
row.source
);
assert!(
row.used_bytes > 0,
"compute process pid {} should have positive used_bytes",
row.pid
);
}
}