use serial_test::serial;
use splimes::{GpuConfig, effective_gpu_config, gpu_buffer_pool_stats, gpu_config_applied, prewarm_gpu, prewarm_gpu_with_config};
fn gpu_available_or_skip(test: &str) -> bool {
match prewarm_gpu() {
Ok(()) => true,
Err(e) if std::env::var_os("SPLIMES_REQUIRE_GPU").is_some() => panic!("{test}: SPLIMES_REQUIRE_GPU is set but no GPU adapter is available: {e:#}"),
Err(e) => {
eprintln!("{test}: skipped, no GPU adapter ({e:#}); set SPLIMES_REQUIRE_GPU=1 to make this a failure");
false
}
}
}
#[serial(gpu_tests)]
#[test]
fn test_gpu_prewarm_succeeds() {
if !gpu_available_or_skip("test_gpu_prewarm_succeeds") {
return;
}
let result = prewarm_gpu();
assert!(result.is_ok(), "GPU prewarming should succeed");
}
#[serial(gpu_tests)]
#[test]
fn test_gpu_config_presets_are_applied_or_refused_with_a_reason() {
for (name, config) in [("default", GpuConfig::default()), ("low_memory", GpuConfig::low_memory()), ("high_performance", GpuConfig::high_performance()), ("minimal", GpuConfig::minimal())] {
match prewarm_gpu_with_config(config.clone()) {
Ok(()) => {
assert!(gpu_config_applied(), "{name}: a successful request must report the config as applied");
let effective = effective_gpu_config();
assert_eq!(effective.buffer_pool.max_pool_memory, config.buffer_pool.max_pool_memory, "{name}: the effective pool size must be the one requested");
assert_eq!(effective.num_staging_buffers, config.num_staging_buffers, "{name}: the effective staging count must be the one requested");
}
Err(e) => {
let msg = e.to_string();
assert!(msg.contains("already initialized") || msg.contains("already requested") || msg.contains("GPU") || msg.contains("adapter"), "{name}: a refusal must say why; got: {msg}");
}
}
}
}
#[serial(gpu_tests)]
#[test]
fn test_gpu_config_is_never_silently_ignored() {
if prewarm_gpu_with_config(GpuConfig::low_memory()).is_ok() {
assert!(gpu_config_applied(), "a config accepted without error must actually be in force");
}
}
#[serial(gpu_tests)]
#[test]
fn test_buffer_pool_stats_available() {
if !gpu_available_or_skip("test_buffer_pool_stats_available") {
return;
}
let stats_result = gpu_buffer_pool_stats();
assert!(stats_result.is_ok(), "Buffer pool stats should be accessible");
let stats = stats_result.unwrap();
assert!(stats.total_allocated_bytes < 1024 * 1024 * 1024, "Total allocated should be reasonable (< 1GB)");
}
#[serial(gpu_tests)]
#[test]
fn test_config_presets_are_different() {
let default = GpuConfig::default();
let low_mem = GpuConfig::low_memory();
let high_perf = GpuConfig::high_performance();
let minimal = GpuConfig::minimal();
assert_ne!(default.buffer_pool.max_pool_memory, low_mem.buffer_pool.max_pool_memory, "Default and low_memory should have different pool sizes");
assert_ne!(default.buffer_pool.max_pool_memory, high_perf.buffer_pool.max_pool_memory, "Default and high_performance should have different pool sizes");
assert_ne!(low_mem.buffer_pool.max_pool_memory, minimal.buffer_pool.max_pool_memory, "Low_memory and minimal should have different pool sizes");
assert_ne!(default.num_staging_buffers, low_mem.num_staging_buffers, "Default and low_memory should have different staging buffer counts");
}
#[serial(gpu_tests)]
#[test]
fn test_config_presets_ordered_by_resources() {
let minimal = GpuConfig::minimal();
let low_mem = GpuConfig::low_memory();
let default = GpuConfig::default();
let high_perf = GpuConfig::high_performance();
assert!(minimal.buffer_pool.max_pool_memory < low_mem.buffer_pool.max_pool_memory, "Pool memory should increase from minimal to low_memory");
assert!(low_mem.buffer_pool.max_pool_memory < default.buffer_pool.max_pool_memory, "Pool memory should increase from low_memory to default");
assert!(default.buffer_pool.max_pool_memory < high_perf.buffer_pool.max_pool_memory, "Pool memory should increase from default to high_performance");
assert!(minimal.num_staging_buffers <= low_mem.num_staging_buffers, "Staging buffers should increase from minimal to low_memory");
assert!(low_mem.num_staging_buffers <= default.num_staging_buffers, "Staging buffers should increase from low_memory to default");
assert!(default.num_staging_buffers <= high_perf.num_staging_buffers, "Staging buffers should increase from default to high_performance");
}