use std::sync::Arc;
use tensor_wasm_core::types::TenantId;
use tensor_wasm_exec::engine::TensorWasmEngine;
use tensor_wasm_exec::executor::{SpawnConfig, TensorWasmExecutor};
use tensor_wasm_exec::instance_pool::{InstancePool, InstancePoolConfig};
fn noop_wasm() -> Vec<u8> {
wat::parse_str(r#"(module (func (export "noop")))"#).unwrap()
}
#[test]
fn pool_default_config_is_disabled() {
let cfg = InstancePoolConfig::default();
assert_eq!(
cfg.warm_instances_per_tuple, 0,
"default config must leave the pool disabled (no warm instances)",
);
assert_eq!(
cfg.max_total_warm, 0,
"default config must leave the global warm cap unbounded (0 = unlimited)",
);
}
#[tokio::test]
async fn pool_with_zero_warm_falls_through_to_spawn() {
let mut engine = TensorWasmEngine::new().expect("engine");
engine.spawn_epoch_ticker();
let engine = Arc::new(engine);
let exec = TensorWasmExecutor::new(engine);
let mut config = InstancePoolConfig::default();
config.warm_instances_per_tuple = 0;
config.max_total_warm = 0;
let pool = InstancePool::new(config);
let wasm = noop_wasm();
let cfg = SpawnConfig::for_tenant(TenantId(1));
let pooled = pool
.acquire(&exec, &wasm, cfg)
.await
.expect("acquire should succeed via spawn fall-through");
assert_eq!(pool.warm_count(), 0);
let id = pooled.into_inner();
assert_eq!(exec.live_count(), 1);
exec.terminate(id).await.expect("terminate");
assert_eq!(exec.live_count(), 0);
}
#[tokio::test]
async fn executor_with_instance_pool_builder_wires_pool() {
let engine = Arc::new(TensorWasmEngine::new().expect("engine"));
let pool = Arc::new(InstancePool::new(InstancePoolConfig::default()));
let exec = TensorWasmExecutor::new(engine).with_instance_pool(Arc::clone(&pool));
let attached = exec
.instance_pool()
.expect("pool should be attached after with_instance_pool");
assert!(
Arc::ptr_eq(attached, &pool),
"instance_pool() should return the same Arc passed to with_instance_pool",
);
}
#[test]
fn executor_without_pool_returns_none() {
let engine = Arc::new(TensorWasmEngine::new().expect("engine"));
let exec = TensorWasmExecutor::new(engine);
assert!(exec.instance_pool().is_none());
}