use crate::serve::backends::{BackendSelector, PrivacyTier, ServingBackend};
use crate::serve::circuit_breaker::{CircuitBreakerConfig, CircuitState, CostCircuitBreaker};
use crate::serve::context::{ContextConfig, ContextManager, ContextWindow, TruncationStrategy};
use crate::serve::router::{RouterConfig, RoutingDecision, SpilloverRouter};
use crate::serve::templates::{ChatMessage, ChatTemplateEngine, TemplateFormat};
#[test]
#[allow(non_snake_case)]
fn falsify_PRIV_001_sovereign_blocks_all_remote() {
let remote_backends = [
ServingBackend::HuggingFace,
ServingBackend::Together,
ServingBackend::Replicate,
ServingBackend::Anyscale,
ServingBackend::Modal,
ServingBackend::Fireworks,
ServingBackend::Groq,
ServingBackend::OpenAI,
ServingBackend::Anthropic,
ServingBackend::AzureOpenAI,
ServingBackend::AwsBedrock,
ServingBackend::GoogleVertex,
ServingBackend::AwsLambda,
ServingBackend::CloudflareWorkers,
];
for backend in &remote_backends {
assert!(
!PrivacyTier::Sovereign.allows(*backend),
"Sovereign must block {:?} but allows() returned true",
backend
);
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_PRIV_002_sovereign_allows_all_local() {
let local_backends = [
ServingBackend::Realizar,
ServingBackend::Ollama,
ServingBackend::LlamaCpp,
ServingBackend::Llamafile,
ServingBackend::Candle,
ServingBackend::Vllm,
ServingBackend::Tgi,
ServingBackend::LocalAI,
];
for backend in &local_backends {
assert!(
PrivacyTier::Sovereign.allows(*backend),
"Sovereign must allow {:?} but allows() returned false",
backend
);
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_PRIV_003_standard_allows_all() {
let all_backends = [
ServingBackend::Realizar,
ServingBackend::Ollama,
ServingBackend::LlamaCpp,
ServingBackend::Llamafile,
ServingBackend::Candle,
ServingBackend::Vllm,
ServingBackend::Tgi,
ServingBackend::LocalAI,
ServingBackend::HuggingFace,
ServingBackend::Together,
ServingBackend::Replicate,
ServingBackend::Anyscale,
ServingBackend::Modal,
ServingBackend::Fireworks,
ServingBackend::Groq,
ServingBackend::OpenAI,
ServingBackend::Anthropic,
ServingBackend::AzureOpenAI,
ServingBackend::AwsBedrock,
ServingBackend::GoogleVertex,
ServingBackend::AwsLambda,
ServingBackend::CloudflareWorkers,
];
for backend in &all_backends {
assert!(
PrivacyTier::Standard.allows(*backend),
"Standard must allow {:?} but allows() returned false",
backend
);
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_PRIV_004_sovereign_recommend_all_local() {
let selector = BackendSelector::new().with_privacy(PrivacyTier::Sovereign);
let recommended = selector.recommend();
for backend in &recommended {
assert!(backend.is_local(), "Sovereign recommend() returned remote {:?}", backend);
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_BUDGET_001_over_budget_blocks() {
let cb = CostCircuitBreaker::new(CircuitBreakerConfig::with_budget(1.0));
cb.record(0.9);
let result = cb.check(0.2);
assert!(result.is_err(), "check(0.2) should fail after 0.9 recorded against $1.0 budget");
}
#[test]
#[allow(non_snake_case)]
fn falsify_BUDGET_002_monotonic_accumulation() {
let cb = CostCircuitBreaker::new(CircuitBreakerConfig::with_budget(100.0));
let mut prev = cb.accumulated_usd();
for i in 1..=20 {
let cost = (i as f64) * 0.1;
cb.record(cost);
let current = cb.accumulated_usd();
assert!(
current >= prev,
"accumulated went from {prev} to {current} after recording {cost}"
);
prev = current;
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_BUDGET_003_per_request_limit_first() {
let config = CircuitBreakerConfig {
daily_budget_usd: 100.0,
max_request_cost_usd: 1.0,
..Default::default()
};
let cb = CostCircuitBreaker::new(config);
let result = cb.check(5.0);
assert!(
matches!(
result,
Err(crate::serve::circuit_breaker::CircuitBreakerError::RequestTooExpensive { .. })
),
"Expected RequestTooExpensive, got {result:?}"
);
}
#[test]
#[allow(non_snake_case)]
fn falsify_BUDGET_004_open_blocks_during_cooldown() {
let config = CircuitBreakerConfig {
daily_budget_usd: 1.0,
max_request_cost_usd: 5.0,
cooldown_seconds: 3600,
..Default::default()
};
let cb = CostCircuitBreaker::new(config);
cb.record(1.0); assert_eq!(cb.state(), CircuitState::Open);
let result = cb.check(0.01);
assert!(result.is_err(), "Open circuit with active cooldown must block");
}
#[test]
#[allow(non_snake_case)]
fn falsify_ROUTE_001_empty_queue_local() {
let router = SpilloverRouter::with_defaults();
let decision = router.route();
assert!(
matches!(decision, RoutingDecision::Local(ServingBackend::Realizar)),
"Empty queue should route Local(Realizar), got {decision:?}"
);
}
#[test]
#[allow(non_snake_case)]
fn falsify_ROUTE_002_deterministic() {
let router = SpilloverRouter::with_defaults();
router.start_request(ServingBackend::Realizar);
router.start_request(ServingBackend::Realizar);
let d1 = router.route();
let d2 = router.route();
assert_eq!(d1, d2, "route() must be deterministic: {d1:?} != {d2:?}");
}
#[test]
#[allow(non_snake_case)]
fn falsify_ROUTE_003_sovereign_spillover_local() {
let router = SpilloverRouter::new(RouterConfig::sovereign());
for _ in 0..15 {
router.start_request(ServingBackend::Realizar);
}
let decision = router.route();
match decision {
RoutingDecision::Spillover(b) => {
assert!(b.is_local(), "Sovereign spillover to remote {:?}", b);
}
RoutingDecision::Local(_) | RoutingDecision::Reject(_) => {} }
}
#[test]
#[allow(non_snake_case)]
fn falsify_ROUTE_004_full_queue_rejects() {
let router = SpilloverRouter::new(RouterConfig {
spillover_threshold: 2,
max_queue_depth: 3,
spillover_enabled: false,
..Default::default()
});
for _ in 0..3 {
router.start_request(ServingBackend::Realizar);
}
let decision = router.route();
assert!(
matches!(decision, RoutingDecision::Reject(_)),
"Full queue without spillover should reject, got {decision:?}"
);
}
#[test]
#[allow(non_snake_case)]
fn falsify_CTX_001_truncated_fits() {
let mgr = ContextManager::new(ContextConfig {
window: ContextWindow::new(100, 20), strategy: TruncationStrategy::SlidingWindow,
preserve_system: true,
min_messages: 1,
});
let msgs: Vec<ChatMessage> = (0..50)
.map(|i| ChatMessage::user(format!("Message number {i} with some content padding")))
.collect();
assert!(!mgr.fits(&msgs), "Messages should exceed window");
let truncated = mgr.truncate(&msgs).expect("SlidingWindow should not error");
assert!(
mgr.fits(&truncated),
"Truncated messages must fit: {} tokens > {} available",
mgr.estimate_tokens(&truncated),
mgr.available_tokens()
);
}
#[test]
#[allow(non_snake_case)]
fn falsify_CTX_002_error_strategy_rejects() {
let mgr = ContextManager::new(ContextConfig {
window: ContextWindow::new(50, 10),
strategy: TruncationStrategy::Error,
preserve_system: true,
min_messages: 1,
});
let msgs: Vec<ChatMessage> =
(0..20).map(|i| ChatMessage::user(format!("Msg {i} padded content here"))).collect();
let result = mgr.truncate(&msgs);
assert!(result.is_err(), "Error strategy must reject oversized input");
}
#[test]
#[allow(non_snake_case)]
fn falsify_CTX_003_token_monotonicity() {
let mgr = ContextManager::default();
let mut msgs = vec![ChatMessage::user("Hello")];
let mut prev = mgr.estimate_tokens(&msgs);
for i in 0..20 {
msgs.push(ChatMessage::user(format!("Additional message {i}")));
let current = mgr.estimate_tokens(&msgs);
assert!(current >= prev, "Token count decreased: {prev} → {current}");
prev = current;
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_CTX_004_passthrough_when_fits() {
let mgr = ContextManager::default(); let msgs = vec![ChatMessage::user("Short message")];
assert!(mgr.fits(&msgs));
let result = mgr.truncate(&msgs).expect("should not error");
assert_eq!(result.len(), msgs.len());
assert_eq!(result[0].content, msgs[0].content);
}
#[test]
#[allow(non_snake_case)]
fn falsify_TPL_001_content_preserved() {
let formats = [
TemplateFormat::Llama2,
TemplateFormat::Mistral,
TemplateFormat::ChatML,
TemplateFormat::Alpaca,
TemplateFormat::Vicuna,
TemplateFormat::Raw,
];
let msgs = vec![
ChatMessage::system("System prompt here"),
ChatMessage::user("User query here"),
ChatMessage::assistant("Assistant response here"),
];
for fmt in &formats {
let engine = ChatTemplateEngine::new(*fmt);
let output = engine.apply(&msgs);
for msg in &msgs {
assert!(
output.contains(&msg.content),
"Format {:?} lost content {:?} in output {:?}",
fmt,
msg.content,
output
);
}
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_TPL_002_raw_identity() {
let engine = ChatTemplateEngine::new(TemplateFormat::Raw);
let output = engine.apply(&[ChatMessage::user("hello")]);
assert_eq!(output, "hello", "Raw format must be identity");
}
#[test]
#[allow(non_snake_case)]
fn falsify_TPL_003_nonempty_output() {
let formats = [
TemplateFormat::Llama2,
TemplateFormat::Mistral,
TemplateFormat::ChatML,
TemplateFormat::Alpaca,
TemplateFormat::Vicuna,
TemplateFormat::Raw,
];
let msgs = vec![ChatMessage::user("x")];
for fmt in &formats {
let engine = ChatTemplateEngine::new(*fmt);
let output = engine.apply(&msgs);
assert!(!output.is_empty(), "Format {:?} produced empty output", fmt);
}
}
#[test]
#[allow(non_snake_case)]
fn falsify_TPL_004_unknown_defaults_raw() {
assert_eq!(TemplateFormat::from_model_name("totally-fake-model-v99"), TemplateFormat::Raw);
assert_eq!(TemplateFormat::from_model_name(""), TemplateFormat::Raw);
assert_eq!(TemplateFormat::from_model_name("my-custom-7b"), TemplateFormat::Raw);
}