use contextgraph_conformance::{
CHECK_ANCHOR_RELEVANCE, CHECK_AS_OF, CHECK_ATTESTATION, CHECK_BUDGET_HONESTY,
CHECK_CONSENT_SCOPE, CHECK_CORRELATION, CHECK_EMBEDDING_FINGERPRINT, CHECK_FRAME_VALIDITY,
CHECK_HANDSHAKE, CHECK_KINDS_FILTER, CHECK_MALFORMED, CHECK_PROVENANCE_FIXTURE_CONSISTENCY,
CHECK_SHUTDOWN, CHECK_VERIFY_HONESTY, CheckStatus, ProviderTarget, run_conformance,
};
fn fixture() -> String {
env!("CARGO_BIN_EXE_contextgraph-example-docs").to_string()
}
fn target(args: &[&str]) -> ProviderTarget {
ProviderTarget::Stdio {
program: fixture(),
args: args.iter().map(|s| s.to_string()).collect(),
}
}
fn status_of(report: &contextgraph_conformance::ConformanceReport, name: &str) -> CheckStatus {
report
.checks
.iter()
.find(|check| check.name == name)
.unwrap_or_else(|| panic!("report is missing the `{name}` check"))
.status
}
#[tokio::test]
async fn a_well_behaved_provider_is_fully_conformant() {
let report = run_conformance(target(&[])).await;
assert!(
report.passed(),
"expected conformant; failures: {:?}",
report.failures().collect::<Vec<_>>()
);
assert_eq!(report.checks.len(), 14);
for name in [
CHECK_HANDSHAKE,
CHECK_CONSENT_SCOPE,
CHECK_FRAME_VALIDITY,
CHECK_VERIFY_HONESTY,
CHECK_BUDGET_HONESTY,
CHECK_AS_OF,
CHECK_KINDS_FILTER,
CHECK_ANCHOR_RELEVANCE,
CHECK_PROVENANCE_FIXTURE_CONSISTENCY,
CHECK_SHUTDOWN,
CHECK_MALFORMED,
CHECK_EMBEDDING_FINGERPRINT,
CHECK_CORRELATION,
CHECK_ATTESTATION,
] {
assert_eq!(status_of(&report, name), CheckStatus::Pass, "{name}");
}
}
#[tokio::test]
async fn a_stale_provenance_digest_fails_provenance_fixture_consistency() {
let report = run_conformance(target(&["--misbehave", "stale-digest"])).await;
assert!(!report.passed());
assert_eq!(
status_of(&report, CHECK_PROVENANCE_FIXTURE_CONSISTENCY),
CheckStatus::Fail
);
for name in [
CHECK_HANDSHAKE,
CHECK_FRAME_VALIDITY,
CHECK_VERIFY_HONESTY,
CHECK_BUDGET_HONESTY,
] {
assert_eq!(status_of(&report, name), CheckStatus::Pass, "{name}");
}
}
#[tokio::test]
async fn dropping_the_correlation_id_fails_the_correlation_check() {
let report = run_conformance(target(&["--misbehave", "drop-correlation-id"])).await;
assert_eq!(status_of(&report, CHECK_CORRELATION), CheckStatus::Fail);
}
#[tokio::test]
async fn ignoring_a_narrowed_kinds_filter_fails_the_kinds_check() {
let report = run_conformance(target(&["--misbehave", "ignore-kinds"])).await;
assert_eq!(status_of(&report, CHECK_KINDS_FILTER), CheckStatus::Fail);
}
#[tokio::test]
async fn an_off_machine_scope_declared_with_egress_false_fails_consent_scope() {
let report = run_conformance(target(&["--misbehave", "scope-lie"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_CONSENT_SCOPE), CheckStatus::Fail);
assert_eq!(status_of(&report, CHECK_HANDSHAKE), CheckStatus::Pass);
}
#[tokio::test]
async fn lying_about_token_cost_fails_budget_honesty() {
let report = run_conformance(target(&["--misbehave", "lying-costs"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_BUDGET_HONESTY), CheckStatus::Fail);
assert_eq!(status_of(&report, CHECK_HANDSHAKE), CheckStatus::Pass);
}
#[tokio::test]
async fn an_out_of_range_score_fails_frame_validity() {
let report = run_conformance(target(&["--misbehave", "bad-score"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_FRAME_VALIDITY), CheckStatus::Fail);
}
#[tokio::test]
async fn an_empty_citation_label_fails_frame_validity() {
let report = run_conformance(target(&["--misbehave", "empty-citation"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_FRAME_VALIDITY), CheckStatus::Fail);
}
#[tokio::test]
async fn crashing_on_a_query_fails_the_frame_checks_but_not_the_handshake() {
let report = run_conformance(target(&["--misbehave", "crash-on-query"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_HANDSHAKE), CheckStatus::Pass);
assert_eq!(status_of(&report, CHECK_FRAME_VALIDITY), CheckStatus::Fail);
assert_eq!(status_of(&report, CHECK_BUDGET_HONESTY), CheckStatus::Fail);
}
#[tokio::test]
async fn crashing_on_garbage_fails_malformed_input_tolerance() {
let report = run_conformance(target(&["--misbehave", "crash-on-garbage"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_MALFORMED), CheckStatus::Fail);
}
#[tokio::test]
async fn mislabeling_malformed_input_fails_malformed_input_tolerance() {
let report = run_conformance(target(&["--misbehave", "mislabel-malformed"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_MALFORMED), CheckStatus::Fail);
assert_eq!(status_of(&report, CHECK_HANDSHAKE), CheckStatus::Pass);
}
#[tokio::test]
async fn an_incompatible_protocol_version_fails_the_handshake() {
let report = run_conformance(target(&["--misbehave", "bad-version"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_HANDSHAKE), CheckStatus::Fail);
assert_eq!(
status_of(&report, CHECK_FRAME_VALIDITY),
CheckStatus::Skipped
);
}
#[tokio::test]
async fn rubber_stamping_every_verify_as_valid_fails_verify_honesty() {
let report = run_conformance(target(&["--misbehave", "rubber-stamp-verify"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_VERIFY_HONESTY), CheckStatus::Fail);
for name in [CHECK_HANDSHAKE, CHECK_FRAME_VALIDITY, CHECK_BUDGET_HONESTY] {
assert_eq!(status_of(&report, name), CheckStatus::Pass, "{name}");
}
}
#[tokio::test]
async fn advertising_verify_while_vouching_for_nothing_fails_verify_honesty() {
let report = run_conformance(target(&["--misbehave", "hollow-verify"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_VERIFY_HONESTY), CheckStatus::Fail);
assert_eq!(status_of(&report, CHECK_HANDSHAKE), CheckStatus::Pass);
}
#[tokio::test]
async fn a_frame_that_lies_about_its_representation_fails_frame_validity() {
let report = run_conformance(target(&["--misbehave", "lying-representation"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_FRAME_VALIDITY), CheckStatus::Fail);
for name in [CHECK_HANDSHAKE, CHECK_BUDGET_HONESTY, CHECK_AS_OF] {
assert_eq!(status_of(&report, name), CheckStatus::Pass, "{name}");
}
}
#[tokio::test]
async fn returning_not_yet_valid_content_fails_as_of_temporal() {
let report = run_conformance(target(&["--misbehave", "ignore-as-of"])).await;
assert!(!report.passed());
assert_eq!(status_of(&report, CHECK_AS_OF), CheckStatus::Fail);
for name in [CHECK_HANDSHAKE, CHECK_FRAME_VALIDITY, CHECK_BUDGET_HONESTY] {
assert_eq!(status_of(&report, name), CheckStatus::Pass, "{name}");
}
}
#[tokio::test]
async fn scoring_a_dimension_mismatched_embedding_fails_embedding_fingerprint() {
let report = run_conformance(target(&["--misbehave", "accept-bad-embedding"])).await;
assert!(!report.passed());
assert_eq!(
status_of(&report, CHECK_EMBEDDING_FINGERPRINT),
CheckStatus::Fail
);
for name in [CHECK_HANDSHAKE, CHECK_FRAME_VALIDITY, CHECK_BUDGET_HONESTY] {
assert_eq!(status_of(&report, name), CheckStatus::Pass, "{name}");
}
}
#[tokio::test]
async fn ignoring_anchors_fails_the_anchor_relevance_check() {
let report = run_conformance(target(&["--misbehave", "ignore-anchors"])).await;
assert_eq!(
status_of(&report, CHECK_ANCHOR_RELEVANCE),
CheckStatus::Fail
);
}
fn evidence_of(report: &contextgraph_conformance::ConformanceReport, name: &str) -> String {
report
.checks
.iter()
.find(|check| check.name == name)
.unwrap_or_else(|| panic!("report is missing the `{name}` check"))
.evidence
.clone()
}
async fn attestation_mode_is_caught(mode: &str, expected_verdict: &str) -> String {
let report = run_conformance(target(&["--misbehave", mode])).await;
assert_eq!(
status_of(&report, CHECK_ATTESTATION),
CheckStatus::Fail,
"`{mode}` must trip `attestation`"
);
let others: Vec<&str> = report
.failures()
.map(|check| check.name.as_str())
.filter(|name| *name != CHECK_ATTESTATION)
.collect();
assert!(
others.is_empty(),
"`{mode}` should trip `attestation` alone, also tripped: {others:?}"
);
let evidence = evidence_of(&report, CHECK_ATTESTATION);
assert!(
evidence.contains(expected_verdict),
"`{mode}` should report `{expected_verdict}`, got: {evidence}"
);
evidence
}
#[tokio::test]
async fn signing_with_an_undeclared_key_is_a_bad_signature() {
attestation_mode_is_caught("forge-signature", "BadSignature").await;
}
#[tokio::test]
async fn a_lifted_signature_does_not_validate_the_frame_it_was_stapled_to() {
let evidence = attestation_mode_is_caught("lift-signature", "CommitmentMismatch").await;
assert!(
evidence.contains("frm_configuration"),
"the mismatch must name the frame the signature was lifted ONTO: {evidence}"
);
assert!(
!evidence.contains("frm_getting_started"),
"the frame the signature genuinely covers must still verify: {evidence}"
);
}
#[tokio::test]
async fn truncating_the_provenance_chain_is_a_commitment_mismatch() {
attestation_mode_is_caught("truncate-chain", "CommitmentMismatch").await;
}
#[tokio::test]
async fn re_serving_different_bytes_under_a_signed_frame_id_is_caught() {
attestation_mode_is_caught("swap-content", "CommitmentMismatch").await;
}
#[tokio::test]
async fn a_garbage_attestation_leaves_the_frame_served_but_unattested() {
let evidence = attestation_mode_is_caught("malformed-attestation", "MalformedCommitment").await;
assert!(
!evidence.contains("F9"),
"the frame must survive as unattested, not be dropped: {evidence}"
);
let report = run_conformance(target(&["--misbehave", "malformed-attestation"])).await;
for name in [
CHECK_FRAME_VALIDITY,
CHECK_BUDGET_HONESTY,
CHECK_VERIFY_HONESTY,
CHECK_PROVENANCE_FIXTURE_CONSISTENCY,
] {
assert_eq!(status_of(&report, name), CheckStatus::Pass, "{name}");
}
assert!(
evidence_of(&report, CHECK_FRAME_VALIDITY).starts_with("2 frame(s)"),
"both frames must still be served: {}",
evidence_of(&report, CHECK_FRAME_VALIDITY)
);
}