114 lines
4.2 KiB
Rust
114 lines
4.2 KiB
Rust
// file: crates/ksp-job-backfill-lib/tests/release_completeness.rs
|
|
// version: 9
|
|
|
|
//! Completeness canaries through the `pre.010` hardening and external-canary tranche.
|
|
|
|
#[test]
|
|
fn pre_010_production_module_inventory_is_exact() -> std::io::Result<()> {
|
|
let source_root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src");
|
|
let entries = match std::fs::read_dir(source_root) {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
|
};
|
|
let mut names = std::vec::Vec::new();
|
|
for entry in entries {
|
|
let entry = match entry {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
|
};
|
|
let file_type = match entry.file_type() {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
|
};
|
|
if !file_type.is_file() {
|
|
continue;
|
|
}
|
|
let name = match entry.file_name().into_string() {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => continue,
|
|
};
|
|
if name.ends_with(".rs") {
|
|
names.push(name);
|
|
}
|
|
}
|
|
names.sort_unstable();
|
|
assert_eq!(
|
|
names,
|
|
std::vec![
|
|
"checkpoint.rs",
|
|
"constants.rs",
|
|
"conversion.rs",
|
|
"discovery.rs",
|
|
"error.rs",
|
|
"execution.rs",
|
|
"lib.rs",
|
|
"persistence.rs",
|
|
"request.rs",
|
|
"runtime.rs",
|
|
]
|
|
);
|
|
return std::result::Result::Ok(());
|
|
}
|
|
|
|
#[test]
|
|
fn pre_010_surface_closes_concrete_cancellation_and_latest_value_runtime() {
|
|
let root = include_str!("../src/lib.rs");
|
|
for required in [
|
|
"BackfillCandidate",
|
|
"BackfillCandidateIdentity",
|
|
"BackfillCommitment",
|
|
"BackfillDiscovery",
|
|
"BackfillDiscoveryBoundary",
|
|
"BackfillRequest",
|
|
"BackfillScope",
|
|
"BackfillScopeFingerprint",
|
|
"BackfillSignature",
|
|
"discover_backfill_candidates",
|
|
"BackfillRawAcquisition",
|
|
"BackfillHydrationOutcome",
|
|
"hydrate_backfill_candidate",
|
|
"BackfillPersistenceOutcome",
|
|
"BackfillEntityPersistence",
|
|
"BackfillObservationPersistence",
|
|
"persist_backfill_hydration",
|
|
"BackfillCheckpoint",
|
|
"BackfillExecutionBatch",
|
|
"execute_backfill_discovery",
|
|
"ERROR_CODE_BACKFILL_CHECKPOINT_INVALID",
|
|
"ERROR_CODE_BACKFILL_EXECUTION_INVALID",
|
|
"BackfillJobHandle",
|
|
"BackfillJobPhase",
|
|
"BackfillJobRuntime",
|
|
"BackfillJobSnapshot",
|
|
"BackfillSnapshotSource",
|
|
"BACKFILL_JOB_KIND_CODE",
|
|
"ERROR_CODE_BACKFILL_RUNTIME_INVALID",
|
|
] {
|
|
assert!(root.contains(required), "required pre.010 public contract missing: {required}");
|
|
}
|
|
for forbidden in ["tokio::", "FuturesUnordered", "watch::Receiver", "watch::Sender"] {
|
|
assert!(!root.contains(forbidden), "runtime implementation detail leaked into public root: {forbidden}");
|
|
}
|
|
assert!(!root.contains("pub mod "));
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn pre_010_external_hardening_suite_is_present_and_scoped() {
|
|
let hardening = include_str!("hardening.rs");
|
|
for required in [
|
|
"pre_010_external_error_codes_are_stable_unique_and_domain_scoped",
|
|
"pre_010_external_request_adversarial_bounds_return_stable_codes",
|
|
"pre_010_scope_fingerprint_is_network_sensitive_and_transport_source_independent",
|
|
"pre_010_debug_surfaces_redact_signature_fingerprint_and_runtime_snapshot_payloads",
|
|
"pre_010_external_runtime_handle_starts_created_and_cancellation_is_idempotent",
|
|
"pre_010_manifest_dependency_surface_is_exact_and_backend_neutral",
|
|
"pre_010_source_visibility_contract_uses_crate_root_for_shared_items",
|
|
"pre_010_lower_layers_have_no_dependency_return_to_job",
|
|
"pre_010_public_root_exposes_no_runtime_or_backend_implementation_types",
|
|
] {
|
|
assert!(hardening.contains(required), "required pre.010 hardening canary missing: {required}");
|
|
}
|
|
return;
|
|
}
|