use ringkernel::prelude::*;
#[tokio::test]
async fn test_cpu_runtime_creation() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create CPU runtime");
assert_eq!(runtime.backend(), Backend::Cpu);
}
#[tokio::test]
async fn test_kernel_lifecycle() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create runtime");
let kernel = runtime
.launch("test_kernel", LaunchOptions::default())
.await
.expect("Failed to launch kernel");
assert_eq!(kernel.id().as_str(), "test_kernel");
let kernels = runtime.list_kernels();
assert_eq!(kernels.len(), 1);
assert_eq!(kernels[0].as_str(), "test_kernel");
runtime.shutdown().await.expect("Failed to shutdown");
}
#[tokio::test]
async fn test_multiple_kernels() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create runtime");
let kernel1 = runtime
.launch("kernel_1", LaunchOptions::default())
.await
.expect("Failed to launch kernel 1");
let kernel2 = runtime
.launch("kernel_2", LaunchOptions::default())
.await
.expect("Failed to launch kernel 2");
let kernel3 = runtime
.launch("kernel_3", LaunchOptions::default())
.await
.expect("Failed to launch kernel 3");
assert_eq!(kernel1.id().as_str(), "kernel_1");
assert_eq!(kernel2.id().as_str(), "kernel_2");
assert_eq!(kernel3.id().as_str(), "kernel_3");
let kernels = runtime.list_kernels();
assert_eq!(kernels.len(), 3);
let metrics = runtime.metrics();
assert_eq!(metrics.total_launched, 3);
runtime.shutdown().await.expect("Failed to shutdown");
}
#[tokio::test]
async fn test_runtime_metrics() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create runtime");
let metrics = runtime.metrics();
assert_eq!(metrics.total_launched, 0);
assert_eq!(metrics.active_kernels, 0);
let _kernel = runtime
.launch("metrics_test", LaunchOptions::default())
.await
.expect("Failed to launch kernel");
let metrics = runtime.metrics();
assert_eq!(metrics.total_launched, 1);
runtime.shutdown().await.expect("Failed to shutdown");
}
#[tokio::test]
async fn test_backend_availability() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create runtime");
assert!(runtime.is_backend_available(Backend::Cpu));
let _ = runtime.is_backend_available(Backend::Cuda);
let _ = runtime.is_backend_available(Backend::Metal);
let _ = runtime.is_backend_available(Backend::Wgpu);
runtime.shutdown().await.expect("Failed to shutdown");
}
#[tokio::test]
async fn test_auto_backend_fallback() {
let runtime = RingKernel::builder()
.backend(Backend::Auto)
.build()
.await
.expect("Failed to create runtime with auto backend");
let backend = runtime.backend();
assert!(
matches!(
backend,
Backend::Cpu | Backend::Cuda | Backend::Metal | Backend::Wgpu
),
"Backend should be one of the supported types"
);
runtime.shutdown().await.expect("Failed to shutdown");
}
#[tokio::test]
async fn test_launch_options() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create runtime");
let options = LaunchOptions::multi_block(2, 128).with_queue_capacity(2048);
let kernel = runtime
.launch("options_test", options)
.await
.expect("Failed to launch kernel with options");
assert_eq!(kernel.id().as_str(), "options_test");
runtime.shutdown().await.expect("Failed to shutdown");
}
#[tokio::test]
async fn test_duplicate_kernel_id() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create runtime");
let _kernel1 = runtime
.launch("duplicate_test", LaunchOptions::default())
.await
.expect("Failed to launch first kernel");
let result = runtime
.launch("duplicate_test", LaunchOptions::default())
.await;
assert!(result.is_err());
runtime.shutdown().await.expect("Failed to shutdown");
}
#[tokio::test]
async fn test_get_kernel() {
let runtime = RingKernel::builder()
.backend(Backend::Cpu)
.build()
.await
.expect("Failed to create runtime");
let kernel = runtime
.launch("get_test", LaunchOptions::default())
.await
.expect("Failed to launch kernel");
let retrieved = runtime.get_kernel(kernel.id());
assert!(retrieved.is_some());
assert_eq!(retrieved.unwrap().id(), kernel.id());
let non_existent = runtime.get_kernel(&KernelId::new("non_existent"));
assert!(non_existent.is_none());
runtime.shutdown().await.expect("Failed to shutdown");
}