use super::*;
use crate::report::CheckStatus;
fn status(report: &ConformanceReport, name: &str) -> CheckStatus {
report
.checks
.iter()
.find(|check| check.name == name)
.unwrap_or_else(|| panic!("check `{name}` missing from report"))
.status
}
fn evidence(report: &ConformanceReport, name: &str) -> String {
report
.checks
.iter()
.find(|check| check.name == name)
.map(|check| check.evidence.clone())
.unwrap_or_default()
}
#[tokio::test]
async fn the_reference_composing_host_passes_every_check() {
let report = run_composition_conformance(&ReferenceComposingHost, "reference").await;
assert!(
report.passed(),
"the reference composition layer must satisfy the suite it defines; failures: {:?}",
report
.failures()
.map(|check| format!("{}: {}", check.name, check.evidence))
.collect::<Vec<_>>()
);
assert_eq!(report.checks.len(), 4, "all four checks ran");
assert_eq!(report.target, "reference");
}
struct AdmitsEverything;
#[async_trait]
impl ComposingHost for AdmitsEverything {
async fn compose(
&self,
providers: Vec<Box<dyn ContextProvider>>,
query: &ContextQuery,
) -> Composition {
let mut host = Host::new();
for provider in providers {
host.register(provider);
}
let fanout = host.query_all(query).await;
let admitted = fanout
.outcomes
.iter()
.filter_map(|outcome| match &outcome.result {
ProviderResult::Frames(result) => Some(
result
.frames
.iter()
.map(|frame| (outcome.provider_id.clone(), frame.clone())),
),
_ => None,
})
.flatten()
.collect();
Composition {
admitted,
dropped: vec![],
}
}
}
#[tokio::test]
async fn admitting_every_frame_fails_the_cross_provider_budget_bound() {
let report = run_composition_conformance(&AdmitsEverything, "admits-everything").await;
assert_eq!(
status(&report, CCHECK_BUDGET_BOUND),
CheckStatus::Fail,
"three honest 400-token providers against a 1000-token budget sum to 1200 — a host \
that admits them all is over budget: {}",
evidence(&report, CCHECK_BUDGET_BOUND)
);
assert_eq!(status(&report, CCHECK_QUARANTINE), CheckStatus::Pass);
assert_eq!(status(&report, CCHECK_DETERMINISM), CheckStatus::Pass);
}
struct SilentlyTruncates;
#[async_trait]
impl ComposingHost for SilentlyTruncates {
async fn compose(
&self,
providers: Vec<Box<dyn ContextProvider>>,
query: &ContextQuery,
) -> Composition {
let mut host = Host::new();
for provider in providers {
host.register(provider);
}
let fanout = host.query_all(query).await;
let mut admitted = Vec::new();
let mut spent = 0u32;
for outcome in &fanout.outcomes {
if let ProviderResult::Frames(result) = &outcome.result {
for frame in &result.frames {
if spent.saturating_add(frame.token_cost) > query.max_tokens {
break;
}
spent += frame.token_cost;
admitted.push((outcome.provider_id.clone(), frame.clone()));
}
}
}
Composition {
admitted,
dropped: vec![],
}
}
}
#[tokio::test]
async fn silent_truncation_fails_the_total_partition() {
let report = run_composition_conformance(&SilentlyTruncates, "silently-truncates").await;
assert_eq!(
status(&report, CCHECK_TOTAL_PARTITION),
CheckStatus::Fail,
"a frame that is neither admitted nor reported has vanished unaccounted: {}",
evidence(&report, CCHECK_TOTAL_PARTITION)
);
assert_eq!(status(&report, CCHECK_BUDGET_BOUND), CheckStatus::Fail);
assert!(
evidence(&report, CCHECK_BUDGET_BOUND).contains("report a drop=false"),
"budget-bound fails on the missing drop report, not on the bound itself: {}",
evidence(&report, CCHECK_BUDGET_BOUND)
);
}
struct IgnoresTheAudit;
#[async_trait]
impl ComposingHost for IgnoresTheAudit {
async fn compose(
&self,
providers: Vec<Box<dyn ContextProvider>>,
query: &ContextQuery,
) -> Composition {
let mut admitted = Vec::new();
let mut dropped = Vec::new();
let mut spent = 0u32;
for provider in &providers {
let Ok(result) = provider.query(query).await else {
continue;
};
for frame in result.frames {
if spent.saturating_add(frame.token_cost) > query.max_tokens {
dropped.push(ExcludedFrame {
provider_id: provider.id().to_string(),
frame_id: frame.id.clone(),
});
continue;
}
spent += frame.token_cost;
admitted.push((provider.id().to_string(), frame));
}
}
Composition { admitted, dropped }
}
}
#[tokio::test]
async fn composing_from_raw_provider_results_fails_quarantine() {
let report = run_composition_conformance(&IgnoresTheAudit, "ignores-the-audit").await;
assert_eq!(
status(&report, CCHECK_QUARANTINE),
CheckStatus::Fail,
"a host that skips the audit re-admits exactly what B4 rejected: {}",
evidence(&report, CCHECK_QUARANTINE)
);
assert_eq!(status(&report, CCHECK_BUDGET_BOUND), CheckStatus::Pass);
assert_eq!(status(&report, CCHECK_TOTAL_PARTITION), CheckStatus::Pass);
}
struct UnstableOrder {
calls: std::sync::atomic::AtomicUsize,
}
#[async_trait]
impl ComposingHost for UnstableOrder {
async fn compose(
&self,
providers: Vec<Box<dyn ContextProvider>>,
query: &ContextQuery,
) -> Composition {
let inner = ReferenceComposingHost.compose(providers, query).await;
let n = self.calls.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
let mut admitted = inner.admitted;
if n % 2 == 1 {
admitted.reverse();
}
Composition {
admitted,
dropped: inner.dropped,
}
}
}
#[tokio::test]
async fn an_order_that_varies_between_identical_calls_fails_determinism() {
let host = UnstableOrder {
calls: std::sync::atomic::AtomicUsize::new(0),
};
let report = run_composition_conformance(&host, "unstable-order").await;
assert_eq!(
status(&report, CCHECK_DETERMINISM),
CheckStatus::Fail,
"an unchanged frame set that renders in a different order busts the prompt cache: {}",
evidence(&report, CCHECK_DETERMINISM)
);
}
struct AdmitsNothing;
#[async_trait]
impl ComposingHost for AdmitsNothing {
async fn compose(
&self,
providers: Vec<Box<dyn ContextProvider>>,
query: &ContextQuery,
) -> Composition {
let mut dropped = Vec::new();
for provider in &providers {
if let Ok(result) = provider.query(query).await {
for frame in result.frames {
dropped.push(ExcludedFrame {
provider_id: provider.id().to_string(),
frame_id: frame.id,
});
}
}
}
Composition {
admitted: vec![],
dropped,
}
}
}
#[tokio::test]
async fn a_host_that_admits_nothing_passes_no_check_vacuously() {
let report = run_composition_conformance(&AdmitsNothing, "admits-nothing").await;
for check in &report.checks {
assert_eq!(
check.status,
CheckStatus::Fail,
"`{}` must not pass vacuously for a host that serves no context: {}",
check.name,
check.evidence
);
}
}