use super::*;
use serial_test::serial;
#[test]
#[serial]
fn test_cov003_preload_rmsnorm_weights() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
assert!(!executor.has_rmsnorm_weights(0));
assert!(!executor.has_rmsnorm_weights(1));
let gamma = vec![1.0f32; 256];
let attn_norms: Vec<&[f32]> = vec![&gamma];
let ffn_norms: Vec<&[f32]> = vec![&gamma];
let result = executor.preload_rmsnorm_weights(1, &attn_norms, &ffn_norms);
assert!(result.is_ok(), "preload_rmsnorm_weights should succeed");
assert!(executor.has_rmsnorm_weights(0));
assert!(!executor.has_rmsnorm_weights(1)); }
#[test]
#[serial]
fn test_cov003_preload_rmsnorm_weights_multiple_layers() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let gamma = vec![1.0f32; 512];
let attn_norms: Vec<&[f32]> = vec![&gamma, &gamma, &gamma, &gamma];
let ffn_norms: Vec<&[f32]> = vec![&gamma, &gamma, &gamma, &gamma];
let result = executor.preload_rmsnorm_weights(4, &attn_norms, &ffn_norms);
assert!(result.is_ok(), "preload_rmsnorm_weights should succeed");
for layer_idx in 0..4 {
assert!(executor.has_rmsnorm_weights(layer_idx));
}
assert!(!executor.has_rmsnorm_weights(4));
}
#[test]
#[serial]
fn test_cov003_preload_output_norm() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
assert!(!executor.has_output_norm());
let gamma = vec![1.0f32; 256];
let result = executor.preload_output_norm(&gamma);
assert!(result.is_ok(), "preload_output_norm should succeed");
assert!(executor.has_output_norm());
}
#[test]
#[serial]
fn test_cov003_preload_qkv_bias() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
assert!(!executor.has_qkv_bias(0));
let hidden_dim = 256;
let bias_data = vec![0.1f32; hidden_dim];
let q_biases: Vec<Option<&[f32]>> = vec![Some(&bias_data)];
let k_biases: Vec<Option<&[f32]>> = vec![Some(&bias_data)];
let v_biases: Vec<Option<&[f32]>> = vec![Some(&bias_data)];
let result = executor.preload_qkv_bias(1, &q_biases, &k_biases, &v_biases);
assert!(
result.is_ok(),
"preload_qkv_bias should succeed: {:?}",
result
);
assert!(executor.has_qkv_bias(0));
assert!(!executor.has_qkv_bias(1)); }
#[test]
#[serial]
fn test_cov003_preload_qkv_bias_multiple_layers() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let hidden_dim = 128;
let bias_data = vec![0.1f32; hidden_dim];
let q_biases: Vec<Option<&[f32]>> = vec![Some(&bias_data), Some(&bias_data), Some(&bias_data)];
let k_biases: Vec<Option<&[f32]>> = vec![Some(&bias_data), Some(&bias_data), Some(&bias_data)];
let v_biases: Vec<Option<&[f32]>> = vec![Some(&bias_data), Some(&bias_data), Some(&bias_data)];
let result = executor.preload_qkv_bias(3, &q_biases, &k_biases, &v_biases);
assert!(result.is_ok(), "preload_qkv_bias should succeed");
for layer_idx in 0..3 {
assert!(
executor.has_qkv_bias(layer_idx),
"layer {} should have bias",
layer_idx
);
}
assert!(!executor.has_qkv_bias(3));
}
#[test]
#[serial]
fn test_cov003_preload_lm_head_bias_none() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
assert!(!executor.has_lm_head_bias());
let result = executor.preload_lm_head_bias(None);
assert!(result.is_ok(), "preload_lm_head_bias(None) should succeed");
assert!(!executor.has_lm_head_bias());
}
#[test]
#[serial]
fn test_cov003_preload_lm_head_bias_some() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
assert!(!executor.has_lm_head_bias());
let vocab_size = 32000;
let bias = vec![0.0f32; vocab_size];
let result = executor.preload_lm_head_bias(Some(&bias));
assert!(result.is_ok(), "preload_lm_head_bias(Some) should succeed");
assert!(executor.has_lm_head_bias());
}
#[test]
#[serial]
fn test_cov003_cache_rmsnorm_gamma() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let gamma = vec![1.0f32; 256];
let result = executor.cache_rmsnorm_gamma("test_norm_layer", &gamma);
assert!(result.is_ok(), "cache_rmsnorm_gamma should succeed");
let result2 = executor.cache_rmsnorm_gamma("output_norm", &gamma);
assert!(
result2.is_ok(),
"cache_rmsnorm_gamma for output_norm should succeed"
);
}
#[test]
#[serial]
fn test_cov003_workspace_output_none() {
if !CudaExecutor::is_available() {
return;
}
let executor = CudaExecutor::new(0).expect("CUDA executor");
let output = executor.workspace_output();
let _ = output;
}
#[test]
#[serial]
fn test_cov003_read_hidden_state_to_cpu() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let result = executor.read_hidden_state_to_cpu();
let _ = result;
}
#[test]
#[serial]
fn test_cov003_output_rmsnorm_gpu() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let gamma = vec![1.0f32; 256];
executor
.preload_output_norm(&gamma)
.expect("preload_output_norm");
assert!(executor.has_output_norm());
}
#[test]
#[serial]
fn test_cov003_preload_combined_weights() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let hidden_dim = 256;
let gamma = vec![1.0f32; hidden_dim];
let attn_norms: Vec<&[f32]> = vec![&gamma];
let ffn_norms: Vec<&[f32]> = vec![&gamma];
executor
.preload_rmsnorm_weights(1, &attn_norms, &ffn_norms)
.expect("rmsnorm");
assert!(executor.has_rmsnorm_weights(0));
executor.preload_output_norm(&gamma).expect("output norm");
assert!(executor.has_output_norm());
let bias = vec![0.1f32; hidden_dim];
let q_biases: Vec<Option<&[f32]>> = vec![Some(&bias)];
let k_biases: Vec<Option<&[f32]>> = vec![Some(&bias)];
let v_biases: Vec<Option<&[f32]>> = vec![Some(&bias)];
executor
.preload_qkv_bias(1, &q_biases, &k_biases, &v_biases)
.expect("qkv bias");
assert!(executor.has_qkv_bias(0));
let vocab_bias = vec![0.0f32; 32000];
executor
.preload_lm_head_bias(Some(&vocab_bias))
.expect("lm head bias");
assert!(executor.has_lm_head_bias());
}
#[test]
#[serial]
fn test_cov003_has_methods_boundary_conditions() {
if !CudaExecutor::is_available() {
return;
}
let executor = CudaExecutor::new(0).expect("CUDA executor");
assert!(!executor.has_rmsnorm_weights(999));
assert!(!executor.has_qkv_bias(1000));
assert!(!executor.has_output_norm());
assert!(!executor.has_lm_head_bias());
}
#[test]
#[serial]
fn test_cov004_init_kv_cache_gpu() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let num_layers = 2;
let num_heads = 4;
let num_kv_heads = 4;
let head_dim = 64;
let max_len = 128;
let result = executor.init_kv_cache_gpu(num_layers, num_heads, num_kv_heads, head_dim, max_len);
assert!(result.is_ok());
assert!(executor.has_kv_cache_gpu());
}
#[test]
#[serial]
fn test_cov004_has_kv_cache_gpu_before_init() {
if !CudaExecutor::is_available() {
return;
}
let executor = CudaExecutor::new(0).expect("CUDA executor");
assert!(!executor.has_kv_cache_gpu());
}
#[test]
#[serial]
fn test_cov004_kv_cache_len() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
assert_eq!(executor.kv_cache_len(0), 0);
let _ = executor.init_kv_cache_gpu(2, 4, 4, 64, 128);
assert_eq!(executor.kv_cache_len(0), 0);
}
#[test]
#[serial]
fn test_cov004_reset_kv_cache_gpu() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let _ = executor.init_kv_cache_gpu(2, 4, 4, 64, 128);
executor.reset_kv_cache_gpu();
assert_eq!(executor.kv_cache_len(0), 0);
}
#[test]
#[serial]
fn test_cov004_rollback_kv_cache_gpu() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let _ = executor.init_kv_cache_gpu(2, 4, 4, 64, 128);
executor.rollback_kv_cache_gpu(0);
assert_eq!(executor.kv_cache_len(0), 0);
}
#[test]
#[serial]
fn test_cov004_set_rope_theta() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
executor.set_rope_theta(10000.0);
executor.set_rope_theta(1000000.0);
}
#[test]
#[serial]
fn test_cov004_set_rope_type() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
executor.set_rope_type(0);
executor.set_rope_type(2);
}
#[test]
#[serial]
fn test_cov004_init_batched_kv_cache_invalid_batch_size() {
if !CudaExecutor::is_available() {
return;
}
let mut executor = CudaExecutor::new(0).expect("CUDA executor");
let _ = executor.init_kv_cache_gpu(2, 4, 4, 64, 128);
let result = executor.init_batched_kv_cache_gpu(2, 0);
assert!(result.is_err());
let result = executor.init_batched_kv_cache_gpu(2, 33);
assert!(result.is_err());
}
include!("tests_cov004_init.rs");
include!("tests_cov005_incremental.rs");
include!("tests_cov006_residual.rs");
include!("tests_cov007_elementwise.rs");