#![cfg(all(target_arch = "x86_64", not(feature = "blas")))]
use std::sync::{Arc, Mutex};
use tracing_subscriber::layer::SubscriberExt;
#[derive(Clone, Default)]
struct WarnCapture(Arc<Mutex<Vec<String>>>);
impl<S: tracing::Subscriber> tracing_subscriber::Layer<S> for WarnCapture {
fn on_event(
&self,
event: &tracing::Event<'_>,
_ctx: tracing_subscriber::layer::Context<'_, S>,
) {
if *event.metadata().level() != tracing::Level::WARN {
return;
}
struct Msg<'a>(&'a mut String);
impl tracing::field::Visit for Msg<'_> {
fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) {
if field.name() == "message" {
self.0.push_str(&format!("{value:?}"));
}
}
}
let mut msg = String::new();
event.record(&mut Msg(&mut msg));
if !msg.is_empty() {
self.0.lock().unwrap_or_else(|p| p.into_inner()).push(msg);
}
}
}
#[test]
#[ignore = "needs a GGUF fixture; run with --ignored"]
fn per_token_fallback_emits_a_warning() {
unsafe {
std::env::set_var("CERA_CPU_TIER", "avx512");
}
let tier = cera::backend::cpu_features::cpu_features().tier;
assert!(
tier < cera::backend::cpu_features::CpuTier::Avx512Vnni,
"CERA_CPU_TIER=avx512 did not downgrade the tier (got {tier:?}); without \
the downgrade the batched path would still run and this test would be \
asserting nothing"
);
assert!(
!cera::backend::cpu::int8_gemm_available(),
"int8 GEMM still reports available at tier {tier:?} — the fallback this \
test needs would not trigger"
);
let capture = WarnCapture::default();
let subscriber = tracing_subscriber::registry().with(capture.clone());
let _guard = tracing::subscriber::set_default(subscriber);
let Some(path) = find_fixture("target/oracle/models/SmolLM-135M.Q4_0.gguf") else {
assert!(
std::env::var("CERA_REQUIRE_MODEL").is_err(),
"CERA_REQUIRE_MODEL is set but the fixture is absent: \
target/oracle/models/SmolLM-135M.Q4_0.gguf (run \
scripts/fetch_test_models.sh, or set CERA_MODEL_ROOT)"
);
eprintln!("[warn-test] SKIP: fixture absent (scripts/fetch_test_models.sh)");
return;
};
let gguf = cera::gguf::GgufFile::open(&path).expect("open fixture");
let model = cera::model::load_model(gguf, None, 2048).expect("load fixture");
let mut state =
cera::kv_cache::InferenceState::from_config(model.config()).expect("inference state");
let _ = model.forward_prefill(&[1, 415, 2323, 302, 4843, 349, 264, 2818], 0, &mut state);
let warnings = capture.0.lock().unwrap_or_else(|p| p.into_inner()).clone();
assert!(
warnings
.iter()
.any(|w| w.contains("fell back to the per-token path")),
"prefill fell back but emitted no warning — a silent ~4x regression. \
Captured warnings: {warnings:?}"
);
}
fn find_fixture(rel: &str) -> Option<std::path::PathBuf> {
let mut roots: Vec<std::path::PathBuf> = Vec::new();
if let Ok(manifest) = std::env::var("CARGO_MANIFEST_DIR") {
if let Some(parent) = std::path::PathBuf::from(&manifest).parent() {
roots.push(parent.to_path_buf());
}
}
if let Ok(cwd) = std::env::current_dir() {
roots.push(cwd);
}
if let Ok(root) = std::env::var("CERA_MODEL_ROOT") {
roots.push(std::path::PathBuf::from(root));
}
roots.into_iter().map(|r| r.join(rel)).find(|p| p.exists())
}