use super::ffi;
use super::loader::{
LIBZE_PATHS, MAX_L0_HANDLES, cap_handle_count, format_pci_bdf, normalise_pci_bdf,
try_load_library,
};
use super::refresh::{
compute_engine_busy_pct, compute_power_watts, make_engine_sample, make_power_sample,
};
use super::*;
#[path = "tests/apply.rs"]
mod apply;
#[path = "tests/ffi_layout.rs"]
mod ffi_layout;
#[test]
fn engine_group_enum_values_match_spec() {
assert_eq!(ffi::ZES_ENGINE_GROUP_ALL, 0);
assert_eq!(ffi::ZES_ENGINE_GROUP_COMPUTE_ALL, 1);
assert_eq!(ffi::ZES_ENGINE_GROUP_MEDIA_ALL, 2);
assert_eq!(ffi::ZES_ENGINE_GROUP_COPY_ALL, 3);
assert_eq!(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE, 4);
assert_eq!(ffi::ZES_ENGINE_GROUP_RENDER_SINGLE, 5);
assert_eq!(ffi::ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, 6);
assert_eq!(ffi::ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, 7);
assert_eq!(ffi::ZES_ENGINE_GROUP_COPY_SINGLE, 8);
assert_eq!(ffi::ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, 9);
assert_eq!(ffi::ZES_ENGINE_GROUP_3D_SINGLE, 10);
assert_eq!(ffi::ZES_ENGINE_GROUP_3D_RENDER_COMPUTE_ALL, 11);
assert_eq!(ffi::ZES_ENGINE_GROUP_RENDER_ALL, 12);
assert_eq!(ffi::ZES_ENGINE_GROUP_3D_ALL, 13);
assert_eq!(ffi::ZES_ENGINE_GROUP_MEDIA_CODEC_SINGLE, 14);
}
#[test]
fn init_flags_match_spec() {
assert_eq!(ffi::ZE_INIT_FLAG_DEFAULT, 0);
assert_eq!(ffi::ZE_RESULT_SUCCESS, 0);
}
#[test]
fn structure_type_constants_match_spec() {
assert_eq!(ffi::ZES_STRUCTURE_TYPE_PCI_PROPERTIES, 0x0000_0002);
assert_eq!(ffi::ZES_STRUCTURE_TYPE_ENGINE_PROPERTIES, 0x0000_0005);
}
#[cfg(target_pointer_width = "64")]
#[test]
fn zes_pci_address_t_size_matches_spec() {
assert_eq!(std::mem::size_of::<ffi::zes_pci_address_t>(), 16);
}
#[cfg(target_pointer_width = "64")]
#[test]
fn zes_pci_speed_t_size_matches_spec() {
assert_eq!(std::mem::size_of::<ffi::zes_pci_speed_t>(), 16);
}
#[cfg(target_pointer_width = "64")]
#[test]
fn zes_pci_properties_t_size_matches_spec() {
assert_eq!(std::mem::size_of::<ffi::zes_pci_properties_t>(), 56);
}
#[cfg(target_pointer_width = "64")]
#[test]
fn zes_engine_properties_t_size_matches_spec() {
assert_eq!(std::mem::size_of::<ffi::zes_engine_properties_t>(), 32);
}
#[cfg(target_pointer_width = "64")]
#[test]
fn zes_engine_stats_t_size_matches_spec() {
assert_eq!(std::mem::size_of::<ffi::zes_engine_stats_t>(), 16);
}
#[cfg(target_pointer_width = "64")]
#[test]
fn zes_power_energy_counter_t_size_matches_spec() {
assert_eq!(std::mem::size_of::<ffi::zes_power_energy_counter_t>(), 16);
}
#[test]
fn engine_label_maps_known_groups() {
assert_eq!(
engine_label(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE),
"compute (XMX)"
);
assert_eq!(engine_label(ffi::ZES_ENGINE_GROUP_RENDER_SINGLE), "render");
assert_eq!(engine_label(ffi::ZES_ENGINE_GROUP_COPY_SINGLE), "copy");
assert_eq!(
engine_label(ffi::ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE),
"media-decode"
);
assert_eq!(
engine_label(ffi::ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE),
"media-encode"
);
}
#[test]
fn engine_label_unknown_becomes_other() {
assert_eq!(engine_label(ffi::ZES_ENGINE_GROUP_ALL), "other");
assert_eq!(engine_label(ffi::ZES_ENGINE_GROUP_3D_SINGLE), "other");
assert_eq!(engine_label(999), "other");
}
#[test]
fn is_tracked_engine_only_singletons() {
assert!(is_tracked_engine(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE));
assert!(is_tracked_engine(ffi::ZES_ENGINE_GROUP_RENDER_SINGLE));
assert!(is_tracked_engine(ffi::ZES_ENGINE_GROUP_COPY_SINGLE));
assert!(is_tracked_engine(ffi::ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE));
assert!(is_tracked_engine(ffi::ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE));
assert!(!is_tracked_engine(ffi::ZES_ENGINE_GROUP_ALL));
assert!(!is_tracked_engine(ffi::ZES_ENGINE_GROUP_COMPUTE_ALL));
assert!(!is_tracked_engine(ffi::ZES_ENGINE_GROUP_MEDIA_ALL));
assert!(!is_tracked_engine(ffi::ZES_ENGINE_GROUP_COPY_ALL));
assert!(!is_tracked_engine(
ffi::ZES_ENGINE_GROUP_3D_RENDER_COMPUTE_ALL
));
assert!(!is_tracked_engine(ffi::ZES_ENGINE_GROUP_3D_ALL));
assert!(!is_tracked_engine(ffi::ZES_ENGINE_GROUP_RENDER_ALL));
}
#[test]
fn pci_bdf_format_matches_sysfs() {
let addr = ffi::zes_pci_address_t {
domain: 0,
bus: 0x03,
device: 0x00,
function: 0,
};
assert_eq!(format_pci_bdf(&addr), "0000:03:00.0");
}
#[test]
fn pci_bdf_format_handles_nonzero_domain() {
let addr = ffi::zes_pci_address_t {
domain: 0xABCD,
bus: 0xEF,
device: 0x12,
function: 7,
};
assert_eq!(format_pci_bdf(&addr), "abcd:ef:12.7");
}
#[test]
fn normalise_pci_bdf_lowercases() {
assert_eq!(normalise_pci_bdf("0000:03:00.0"), "0000:03:00.0");
assert_eq!(normalise_pci_bdf("ABCD:EF:12.7"), "abcd:ef:12.7");
}
#[test]
fn engine_busy_first_call_seeds_zero() {
let sample = make_engine_sample(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE, 0, 0);
let stats = ffi::zes_engine_stats_t {
active_time: 1_000,
timestamp: 10_000,
};
assert_eq!(compute_engine_busy_pct(&sample, &stats), 0.0);
}
#[test]
fn engine_busy_percent_correct() {
let sample = make_engine_sample(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE, 1_000, 5_000);
let stats = ffi::zes_engine_stats_t {
active_time: 1_500, timestamp: 6_000, };
let pct = compute_engine_busy_pct(&sample, &stats);
assert!((pct - 50.0).abs() < 1e-9, "pct={pct}");
}
#[test]
fn engine_busy_clamps_to_100_on_overrun() {
let sample = make_engine_sample(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE, 1_000, 5_000);
let stats = ffi::zes_engine_stats_t {
active_time: 10_000, timestamp: 6_000, };
assert_eq!(compute_engine_busy_pct(&sample, &stats), 100.0);
}
#[test]
fn engine_busy_handles_backwards_clock() {
let sample = make_engine_sample(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE, 1_000, 6_000);
let stats = ffi::zes_engine_stats_t {
active_time: 0,
timestamp: 5_000,
};
assert_eq!(compute_engine_busy_pct(&sample, &stats), 0.0);
}
#[test]
fn engine_busy_handles_zero_delta_t() {
let sample = make_engine_sample(ffi::ZES_ENGINE_GROUP_COMPUTE_SINGLE, 1_000, 5_000);
let stats = ffi::zes_engine_stats_t {
active_time: 1_500,
timestamp: 5_000,
};
assert_eq!(compute_engine_busy_pct(&sample, &stats), 0.0);
}
#[test]
fn power_first_call_seeds_none() {
let sample = make_power_sample(0, 0);
let counter = ffi::zes_power_energy_counter_t {
energy: 1_000_000_000,
timestamp: 10_000,
};
assert!(compute_power_watts(&sample, &counter).is_none());
}
#[test]
fn power_watts_correct() {
let sample = make_power_sample(0, 5_000_000); let counter = ffi::zes_power_energy_counter_t {
energy: 30_000_000, timestamp: 6_000_000, };
let watts = compute_power_watts(&sample, &counter).unwrap();
assert!((watts - 30.0).abs() < 1e-9, "watts={watts}");
}
#[test]
fn power_handles_backwards_clock() {
let sample = make_power_sample(1_000, 6_000_000);
let counter = ffi::zes_power_energy_counter_t {
energy: 0,
timestamp: 5_000_000,
};
assert!(compute_power_watts(&sample, &counter).is_none());
}
#[test]
fn power_handles_zero_delta_t() {
let sample = make_power_sample(1_000, 5_000_000);
let counter = ffi::zes_power_energy_counter_t {
energy: 10_000,
timestamp: 5_000_000,
};
assert!(compute_power_watts(&sample, &counter).is_none());
}
#[test]
fn power_handles_energy_reset() {
let sample = make_power_sample(1_000_000, 5_000_000);
let counter = ffi::zes_power_energy_counter_t {
energy: 500_000, timestamp: 6_000_000,
};
assert!(compute_power_watts(&sample, &counter).is_none());
}
#[test]
fn primary_utilization_prefers_render_or_compute() {
let engines = vec![
("compute (XMX)", 80.0_f64),
("render", 30.0_f64),
("copy", 90.0_f64),
("media-decode", 5.0_f64),
];
assert_eq!(primary_utilization(&engines), Some(80.0));
}
#[test]
fn primary_utilization_falls_back_when_no_compute() {
let engines = vec![("copy", 12.0_f64), ("media-decode", 7.0_f64)];
assert_eq!(primary_utilization(&engines), Some(12.0));
}
#[test]
fn primary_utilization_empty_returns_none() {
let engines: Vec<(&'static str, f64)> = Vec::new();
assert_eq!(primary_utilization(&engines), None);
}
#[test]
fn try_load_library_returns_none_for_nonexistent_path() {
let bogus = "/nonexistent/path/to/libze_loader.so.1";
let result = unsafe { try_load_library(bogus) };
assert!(
result.is_none(),
"expected None for nonexistent loader path"
);
}
const EXPECT_LOADER_ENV: &str = "ALL_SMI_EXPECT_LEVEL_ZERO_LOADER";
const LOADER_ASSERTED_MARKER: &str = "all-smi: level-zero-loader-assertion-ran";
#[test]
fn the_installed_loader_exports_every_symbol_we_resolve() {
if std::env::var_os(EXPECT_LOADER_ENV).is_none() {
return;
}
let loaded = LIBZE_PATHS
.iter()
.find_map(|path| unsafe { try_load_library(path) });
assert!(
loaded.is_some(),
"{EXPECT_LOADER_ENV} is set, so a Level Zero loader is installed, but none of \
{LIBZE_PATHS:?} loaded with every required symbol resolved. Either a path in \
LIBZE_PATHS no longer matches what the loader package installs, or a symbol \
name in LzApi is wrong."
);
println!("{LOADER_ASSERTED_MARKER}");
}
#[test]
fn enumerated_pci_bdfs_empty_when_runtime_absent() {
let bdfs = enumerated_pci_bdfs();
let _: Vec<String> = bdfs;
}
#[test]
fn refresh_returns_none_without_runtime() {
let mut state = LevelZeroState::empty();
let result = refresh(&mut state, "0000:03:00.0");
if let Some(readout) = result {
assert!(
!readout.has_fresh_data(),
"unknown BDF must not produce data, got {readout:?}"
);
}
}
#[test]
fn diagnostic_helpers_on_empty_state() {
let state = LevelZeroState::empty();
assert_eq!(engine_count(&state), 0);
assert_eq!(power_domain_count(&state), 0);
assert!(!is_bound(&state));
}
#[test]
fn sort_engine_entries_canonical_order() {
let mut engines = vec![
("media-encode", 10.0_f64),
("compute (XMX)", 50.0_f64),
("render", 30.0_f64),
("copy", 5.0_f64),
("media-decode", 2.0_f64),
];
sort_engine_entries(&mut engines);
let order: Vec<&'static str> = engines.iter().map(|(l, _)| *l).collect();
assert_eq!(
order,
vec![
"render",
"compute (XMX)",
"copy",
"media-decode",
"media-encode"
]
);
}
#[test]
fn cap_handle_count_passes_through_when_under_cap() {
let (safe, capped_u32) = cap_handle_count(6, "engine groups");
assert_eq!(safe, 6);
assert_eq!(capped_u32, 6);
}
#[test]
fn cap_handle_count_clamps_when_over_cap() {
let giant: u32 = u32::MAX;
let (safe, capped_u32) = cap_handle_count(giant, "drivers");
assert_eq!(safe, MAX_L0_HANDLES);
assert_eq!(capped_u32, MAX_L0_HANDLES as u32);
assert_eq!(safe, capped_u32 as usize);
}
#[test]
fn cap_handle_count_at_exact_boundary() {
let at_limit = MAX_L0_HANDLES as u32;
let (safe, capped_u32) = cap_handle_count(at_limit, "devices");
assert_eq!(safe, MAX_L0_HANDLES);
assert_eq!(capped_u32, at_limit);
}
#[test]
fn cap_handle_count_one_over_boundary_is_clamped() {
let one_over = (MAX_L0_HANDLES + 1) as u32;
let (safe, capped_u32) = cap_handle_count(one_over, "power domains");
assert_eq!(safe, MAX_L0_HANDLES);
assert_eq!(capped_u32, MAX_L0_HANDLES as u32);
}