use std::sync::Arc;
use tensor_wasm_core::types::TenantId;
use tensor_wasm_jit::cache::{
CacheKey, CachedKernel, CompiledHandle, KernelCache, KernelCacheConfig,
};
use tensor_wasm_jit::ptx_emit::EmittedPtx;
fn fixture_ptx(text: &str) -> Arc<EmittedPtx> {
Arc::new(EmittedPtx {
text: text.to_string(),
launch_geometry: (1, 1),
})
}
#[test]
fn verify_on_get_default_recomputes() {
let cache = KernelCache::new();
assert!(
cache.config().verify_on_get,
"default config must keep verify-on-get enabled"
);
let key = CacheKey::for_tenant(TenantId(1), 0xABCD, 80);
let kernel = CachedKernel::new(
0xABCD,
fixture_ptx(".visible .entry recompute_default(){}"),
CompiledHandle::default(),
);
cache.put(key, kernel);
assert_eq!(
cache.verify_skipped_total(),
0,
"default config must not increment the skip counter"
);
for _ in 0..2 {
let got = cache.get(&key).expect("default get must succeed");
assert_eq!(got.fingerprint, 0xABCD);
}
assert_eq!(
cache.verify_skipped_total(),
0,
"default config must keep the skip counter at zero across hits"
);
}
#[test]
fn verify_on_get_false_skips_recompute() {
let cache = KernelCache::with_config(KernelCacheConfig::default().with_verify_on_get(false));
assert!(
!cache.config().verify_on_get,
"explicit opt-out must persist in the cache config"
);
let key = CacheKey::for_tenant(TenantId(2), 0xF00D, 80);
let kernel = CachedKernel::new(
0xF00D,
fixture_ptx(".visible .entry skip_recompute(){}"),
CompiledHandle::default(),
);
cache.put(key, kernel);
assert_eq!(
cache.verify_skipped_total(),
0,
"no skips recorded before the first get"
);
let _ = cache.get(&key).expect("first get must succeed");
assert_eq!(
cache.verify_skipped_total(),
1,
"first get on opt-out path must increment the skip counter"
);
let _ = cache.get(&key).expect("second get must succeed");
assert_eq!(
cache.verify_skipped_total(),
2,
"second get on opt-out path must increment the skip counter again"
);
}
#[test]
fn verify_on_get_false_still_rejects_zero_hash() {
let cache = KernelCache::with_config(KernelCacheConfig::default().with_verify_on_get(false));
let key = CacheKey::for_tenant(TenantId(3), 0xBADD_F00D, 80);
let bad = CachedKernel {
fingerprint: 0xBADD_F00D,
ptx: fixture_ptx(".visible .entry hostile(){}"),
compiled: CompiledHandle::default(),
integrity_hash: [0u8; 32],
};
cache.__test_only_insert_unchecked(key, bad);
assert!(
cache.get(&key).is_none(),
"verify-on-get=false must still refuse a zero-hash entry"
);
}