#![cfg(feature = "remote")]
mod common;
use std::time::SystemTime;
use cera::bundle::BundleRepo;
use cera::engine::{BackendPreference, CeraEngine, EngineConfig, ModelFiles};
const MODEL_URL: &str = "https://huggingface.co/LiquidAI/LFM2-350M-Extract-GGUF/resolve/main/LFM2-350M-Extract-Q4_0.gguf";
const MODEL_FILE: &str = "LFM2-350M-Extract-Q4_0.gguf";
#[test]
#[ignore = "downloads ~210 MB; set CERA_TEST_DOWNLOAD=1 and pass --ignored"]
fn bundle_repo_resolves_and_loads_from_hf() {
if std::env::var("CERA_TEST_DOWNLOAD").is_err() {
eprintln!("skipping: CERA_TEST_DOWNLOAD not set");
return;
}
let path = common::download::ensure_cached(MODEL_URL, MODEL_FILE);
assert!(
path.exists(),
"BundleRepo.resolve_url did not produce an existing file at {}",
path.display()
);
let size = std::fs::metadata(&path)
.expect("stat downloaded file")
.len();
assert!(
size > 150 * 1024 * 1024,
"downloaded file only {size} bytes — HF returned an error page?"
);
let engine = CeraEngine::from_files(
ModelFiles::text(&path),
EngineConfig {
context_size: 128,
backend: BackendPreference::Cpu,
..Default::default()
},
)
.expect("load engine from resolved bundle file");
let meta = engine.metadata();
assert!(
meta.max_seq_len > 0,
"engine metadata missing max_seq_len — model parse failed silently"
);
}
#[test]
#[ignore = "downloads ~210 MB; set CERA_TEST_DOWNLOAD=1 and pass --ignored"]
fn bundle_repo_cache_hit_does_not_redownload() {
if std::env::var("CERA_TEST_DOWNLOAD").is_err() {
eprintln!("skipping: CERA_TEST_DOWNLOAD not set");
return;
}
let first = common::download::ensure_cached(MODEL_URL, MODEL_FILE);
let mtime_before = first
.metadata()
.and_then(|m| m.modified())
.unwrap_or(SystemTime::UNIX_EPOCH);
let repo = BundleRepo::new(common::download::cache_dir());
let second = repo
.resolve_url(MODEL_URL, None)
.expect("resolve on cache hit");
assert_eq!(first, second, "cache-hit path should match the first call");
let mtime_after = second
.metadata()
.and_then(|m| m.modified())
.unwrap_or(SystemTime::UNIX_EPOCH);
assert_eq!(
mtime_before, mtime_after,
"cache hit should not rewrite the file (mtime changed)"
);
}