#![cfg_attr(coverage_nightly, coverage(off))]
use super::*;
pub struct GpuScheduler {
_limits: GpuLimits,
}
impl GpuScheduler {
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn new(limits: GpuLimits) -> Result<Self, ResourceError> {
Ok(Self { _limits: limits })
}
}
impl ResourceController for GpuScheduler {
fn apply_limits(&self, _limits: &ResourceLimits) -> Result<(), ResourceError> {
Ok(())
}
fn get_usage(&self) -> Result<ResourceUsage, ResourceError> {
Ok(ResourceUsage {
cpu_percent: 0.0,
memory_bytes: 0,
gpu_memory_bytes: Some(0),
gpu_compute_percent: Some(0.0),
network_ingress_bytes: 0,
network_egress_bytes: 0,
disk_read_bytes: 0,
disk_write_bytes: 0,
timestamp: std::time::SystemTime::now(),
})
}
fn release(&self) -> Result<(), ResourceError> {
Ok(())
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod coverage_tests {
use super::*;
fn create_test_gpu_limits() -> GpuLimits {
GpuLimits {
device_id: 0,
memory_bytes: 8 * 1024 * 1024 * 1024, compute_percent: 100.0,
exclusive: false,
}
}
fn create_test_resource_limits() -> ResourceLimits {
ResourceLimits::default()
}
#[test]
fn test_gpu_scheduler_new_success() {
let limits = create_test_gpu_limits();
let result = GpuScheduler::new(limits);
assert!(result.is_ok());
}
#[test]
fn test_gpu_scheduler_new_with_different_device() {
let limits = GpuLimits {
device_id: 1,
memory_bytes: 4 * 1024 * 1024 * 1024, compute_percent: 50.0,
exclusive: true,
};
let result = GpuScheduler::new(limits);
assert!(result.is_ok());
}
#[test]
fn test_gpu_scheduler_new_exclusive_mode() {
let limits = GpuLimits {
device_id: 0,
memory_bytes: 16 * 1024 * 1024 * 1024, compute_percent: 100.0,
exclusive: true,
};
let result = GpuScheduler::new(limits);
assert!(result.is_ok());
}
#[test]
fn test_gpu_scheduler_new_with_minimal_resources() {
let limits = GpuLimits {
device_id: 0,
memory_bytes: 1,
compute_percent: 0.1,
exclusive: false,
};
let result = GpuScheduler::new(limits);
assert!(result.is_ok());
}
#[test]
fn test_gpu_scheduler_apply_limits() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
let resource_limits = create_test_resource_limits();
let result = scheduler.apply_limits(&resource_limits);
assert!(result.is_ok());
}
#[test]
fn test_gpu_scheduler_get_usage() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
let result = scheduler.get_usage();
assert!(result.is_ok());
let usage = result.unwrap();
assert_eq!(usage.cpu_percent, 0.0);
assert_eq!(usage.memory_bytes, 0);
assert_eq!(usage.gpu_memory_bytes, Some(0));
assert_eq!(usage.gpu_compute_percent, Some(0.0));
assert_eq!(usage.network_ingress_bytes, 0);
assert_eq!(usage.network_egress_bytes, 0);
assert_eq!(usage.disk_read_bytes, 0);
assert_eq!(usage.disk_write_bytes, 0);
}
#[test]
fn test_gpu_scheduler_get_usage_reports_gpu_metrics() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
let usage = scheduler.get_usage().unwrap();
assert!(usage.gpu_memory_bytes.is_some());
assert!(usage.gpu_compute_percent.is_some());
}
#[test]
fn test_gpu_scheduler_get_usage_has_valid_timestamp() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
let before = std::time::SystemTime::now();
let usage = scheduler.get_usage().unwrap();
let after = std::time::SystemTime::now();
assert!(usage.timestamp >= before);
assert!(usage.timestamp <= after);
}
#[test]
fn test_gpu_scheduler_release() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
let result = scheduler.release();
assert!(result.is_ok());
}
#[test]
fn test_gpu_scheduler_multiple_usage_calls() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
for _ in 0..10 {
assert!(scheduler.get_usage().is_ok());
}
}
#[test]
fn test_gpu_scheduler_apply_limits_with_gpu_config() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
let mut resource_limits = create_test_resource_limits();
resource_limits.gpu = Some(GpuLimits {
device_id: 0,
memory_bytes: 4 * 1024 * 1024 * 1024,
compute_percent: 50.0,
exclusive: false,
});
let result = scheduler.apply_limits(&resource_limits);
assert!(result.is_ok());
}
#[test]
fn test_gpu_scheduler_release_then_get_usage() {
let limits = create_test_gpu_limits();
let scheduler = GpuScheduler::new(limits).unwrap();
assert!(scheduler.release().is_ok());
assert!(scheduler.get_usage().is_ok());
}
#[test]
fn test_gpu_scheduler_with_zero_compute_percent() {
let limits = GpuLimits {
device_id: 0,
memory_bytes: 1024,
compute_percent: 0.0,
exclusive: false,
};
let result = GpuScheduler::new(limits);
assert!(result.is_ok());
}
}