Something went wrong. Try again.
atproto Thingiverse but good
Something went wrong. Try again.
19 kB · 550 lines
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551use crate::{ AuthorityClass, ExpectedOutcome, ExpectedRecord, FixtureCase, Profile, Provenance, SCHEMA_VERSION, hex_digest, parse_expected, validate_expected_evidence,};use serde::Deserialize;use std::collections::BTreeSet;
#[derive(Debug, Deserialize)]#[serde(deny_unknown_fields)]struct ArtifactManifest { schema_version: String, artifacts: Vec<ArtifactEntry>, ldparse_acquisition: Acquisition,}
#[derive(Debug, Deserialize)]#[serde(deny_unknown_fields)]struct Acquisition { status: String, source_url: String, master_revision: String, modernization_revision: String,}
#[derive(Debug, Deserialize)]#[serde(deny_unknown_fields)]struct ArtifactEntry { id: String, path: String, source_url: Option<String>, source_revision: String, sha256: String, license: String, original_test: String, modifications: String, authority: AuthorityClass,}
const ARTIFACT_PROVENANCE: &str = include_str!("../corpus/artifact-provenance.json");
fn fixture_provenance(id: &str, file: &str, bytes: &[u8]) -> Provenance { let manifest: ArtifactManifest = serde_json::from_str(ARTIFACT_PROVENANCE) .expect("artifact-provenance.json must be valid JSON"); assert_eq!(manifest.schema_version, SCHEMA_VERSION); assert_eq!( manifest.ldparse_acquisition.status, "nix-built differential oracle" ); assert_eq!( manifest.ldparse_acquisition.source_url, "https://github.com/elfprince13/LDParse" ); assert_eq!( manifest.ldparse_acquisition.master_revision, "877667417d6cab57c04aed9cb3d5bfe7efa0589c" ); assert_eq!( manifest.ldparse_acquisition.modernization_revision, "0fe78dcee22982f26cceced1b483340faa4d04e9" ); let path = format!("corpus/{file}"); let entry = manifest .artifacts .into_iter() .find(|entry| entry.id == id) .unwrap_or_else(|| panic!("missing provenance entry for {id}")); assert_eq!(entry.path, path, "provenance path mismatch for {id}"); assert_eq!( entry.sha256, hex_digest(bytes), "provenance digest mismatch for {id}" ); Provenance { id: format!("pm77-{id}"), source_url: entry.source_url, source_revision: entry.source_revision, sha256: entry.sha256, license: entry.license, original_test: entry.original_test, modifications: entry.modifications, authority: entry.authority, }}
fn load_expected(id: &str) -> ExpectedRecord { let json = match id { "syntax-types" => include_str!("../corpus/expected/syntax-types.expected.json"), "profile-matrix" => include_str!("../corpus/expected/profile-matrix.expected.json"), "mpd-data" => include_str!("../corpus/expected/mpd-data.expected.json"), "path-policy" => include_str!("../corpus/expected/path-policy.expected.json"), "bfc-invertnext" => include_str!("../corpus/expected/bfc-invertnext.expected.json"), "colours-ldconfig" => include_str!("../corpus/expected/colours-ldconfig.expected.json"), "graph-instances" => include_str!("../corpus/expected/graph-instances.expected.json"), "steps-transforms" => include_str!("../corpus/expected/steps-transforms.expected.json"), "bfc-directives" => include_str!("../corpus/expected/bfc-directives.expected.json"), "bfc-state-machine" => include_str!("../corpus/expected/bfc-state-machine.expected.json"), "colour-definitions" => include_str!("../corpus/expected/colour-definitions.expected.json"), "texmap-events" => include_str!("../corpus/expected/texmap-events.expected.json"), "syntax-all-types" => include_str!("../corpus/expected/syntax-all-types.expected.json"), "numeric-finiteness" => include_str!("../corpus/expected/numeric-finiteness.expected.json"), "semantic-limits" => include_str!("../corpus/expected/semantic-limits.expected.json"), "path-contexts" => include_str!("../corpus/expected/path-contexts.expected.json"), "conditional-lines" => include_str!("../corpus/expected/conditional-lines.expected.json"), "adversarial-regressions" => { include_str!("../corpus/expected/adversarial-regressions.expected.json") } "fuzz-regressions" => include_str!("../corpus/expected/fuzz-regressions.expected.json"), "external-thomas" => include_str!("../corpus/expected/external-thomas.expected.json"), "external-weldr" => include_str!("../corpus/expected/external-weldr.expected.json"), "external-ldr-tools" => include_str!("../corpus/expected/external-ldr-tools.expected.json"), "omr-10030-1" => include_str!("../corpus/expected/omr-10030-1.expected.json"), "h-conditional-visible" => { include_str!("../corpus/expected/h-conditional-visible.expected.json") } "h-conditional-interior" => { include_str!("../corpus/expected/h-conditional-interior.expected.json") } "h-conditional-offscreen" => { include_str!("../corpus/expected/h-conditional-offscreen.expected.json") } "h-conditional-ambiguous" => { include_str!("../corpus/expected/h-conditional-ambiguous.expected.json") } "h-conditional-degenerate" => { include_str!("../corpus/expected/h-conditional-degenerate.expected.json") } "h-conditional-invalid" => { include_str!("../corpus/expected/h-conditional-invalid.expected.json") } other => panic!("unknown fixture {other}"), }; let expected = parse_expected(json) .unwrap_or_else(|error| panic!("invalid expected record for {id}: {error}")); assert_eq!(expected.canonical.provenance_id, id); expected}
macro_rules! fixture { ($id:literal, $tag:literal, $file:literal, $authority:expr, $outcome:expr, $profile:expr) => {{ let bytes = include_bytes!(concat!("../corpus/", $file)); let provenance = fixture_provenance($id, $file, bytes); let expected = load_expected($id); assert_eq!( provenance.authority, $authority, "provenance authority mismatch for {}", $id ); FixtureCase { id: $id, relative_path: concat!("corpus/", $file), bytes, tags: &[$tag], profiles: &[$profile], profile: $profile, outcome: $outcome, authority: $authority, provenance, expected, } }};}
pub fn inventory() -> Vec<FixtureCase> { vec![ fixture!( "syntax-types", "syntax_types_0_to_5", "syntax-types.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "profile-matrix", "profile_acceptance_and_diagnostics", "profile-matrix.ldr", AuthorityClass::PolymodelSafety, ExpectedOutcome::Preserved, Profile::Compatibility ), fixture!( "mpd-data", "mpd_and_data_boundaries", "mpd-data.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "path-policy", "path_and_resolution_independence", "path-policy.ldr", AuthorityClass::PolymodelSafety, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "bfc-invertnext", "bfc_state_and_invertnext", "bfc-invertnext.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "colours-ldconfig", "colours_and_ldconfig", "colours-ldconfig.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "graph-instances", "graph_identity_and_instances", "graph-instances.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "steps-transforms", "steps_and_transforms", "steps-transforms.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "bfc-directives", "bfc_state_and_invertnext", "bfc-directives.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "bfc-state-machine", "bfc_state_and_invertnext", "bfc-state-machine.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Rejected, Profile::Strict ), fixture!( "colour-definitions", "colours_and_ldconfig", "colour-definitions.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "texmap-events", "texmap_projection_v1", "texmap-events.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "syntax-all-types", "syntax_types_0_to_5", "syntax-all-types.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "numeric-finiteness", "numeric_finiteness_and_raw_preservation", "numeric-finiteness.ldr", AuthorityClass::RatifiedSpec, ExpectedOutcome::Limited, Profile::Lossless ), fixture!( "semantic-limits", "semantic_limits_and_cancellation", "semantic-limits.ldr", AuthorityClass::PolymodelSafety, ExpectedOutcome::Accepted, Profile::Compatibility ), fixture!( "path-contexts", "path_and_resolution_independence", "path-contexts.ldr", AuthorityClass::PolymodelSafety, ExpectedOutcome::Accepted, Profile::Compatibility ), fixture!( "conditional-lines", "conditional_line_projection", "h-conditional-lines.ldr", AuthorityClass::HOwned, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "adversarial-regressions", "semantic_limits_and_cancellation", "adversarial-regressions.ldr", AuthorityClass::PolymodelSafety, ExpectedOutcome::Cancelled, Profile::Lossless ), fixture!( "fuzz-regressions", "semantic_limits_and_cancellation", "fuzz-regressions.ldr", AuthorityClass::PolymodelSafety, ExpectedOutcome::Rejected, Profile::Lossless ), fixture!( "external-thomas", "graph_identity_and_instances", "external-thomas.ldr", AuthorityClass::Observation, ExpectedOutcome::Accepted, Profile::Compatibility ), fixture!( "external-weldr", "syntax_types_0_to_5", "external-weldr.ldr", AuthorityClass::Observation, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "external-ldr-tools", "syntax_types_0_to_5", "external-ldr-tools.ldr", AuthorityClass::Observation, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "omr-10030-1", "graph_identity_and_instances", "omr-10030-1.mpd", AuthorityClass::Observation, ExpectedOutcome::Accepted, Profile::Compatibility ), fixture!( "h-conditional-visible", "conditional_line_projection", "h-conditional-visible.ldr", AuthorityClass::HOwned, ExpectedOutcome::Preserved, Profile::Strict ), fixture!( "h-conditional-interior", "conditional_line_projection", "h-conditional-interior.ldr", AuthorityClass::HOwned, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "h-conditional-offscreen", "conditional_line_projection", "h-conditional-offscreen.ldr", AuthorityClass::HOwned, ExpectedOutcome::Rejected, Profile::Strict ), fixture!( "h-conditional-ambiguous", "conditional_line_projection", "h-conditional-ambiguous.ldr", AuthorityClass::HOwned, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "h-conditional-degenerate", "conditional_line_projection", "h-conditional-degenerate.ldr", AuthorityClass::HOwned, ExpectedOutcome::Accepted, Profile::Strict ), fixture!( "h-conditional-invalid", "conditional_line_projection", "h-conditional-invalid.ldr", AuthorityClass::HOwned, ExpectedOutcome::Rejected, Profile::Strict ), ]}
pub fn validate_inventory(fixtures: &[FixtureCase]) -> Result<(), String> { const AUTHORITATIVE_FIXTURE_COUNT: usize = 29; const REQUIRED_BASELINE_IDS: &[&str] = &[ "syntax-types", "profile-matrix", "mpd-data", "path-policy", "bfc-invertnext", "colours-ldconfig", "graph-instances", "steps-transforms", "bfc-directives", "bfc-state-machine", "colour-definitions", "texmap-events", "syntax-all-types", "numeric-finiteness", "semantic-limits", "path-contexts", "conditional-lines", "adversarial-regressions", "fuzz-regressions", "external-thomas", "external-weldr", "external-ldr-tools", "omr-10030-1", ]; if fixtures.len() != AUTHORITATIVE_FIXTURE_COUNT { return Err(format!( "authoritative corpus inventory must contain exactly {AUTHORITATIVE_FIXTURE_COUNT} fixtures, found {}", fixtures.len() )); } const EXPECTED_FILE_IDS: &[&str] = &[ "adversarial-regressions", "bfc-directives", "bfc-invertnext", "bfc-state-machine", "colour-definitions", "colours-ldconfig", "conditional-lines", "external-ldr-tools", "external-thomas", "external-weldr", "fuzz-regressions", "graph-instances", "h-conditional-ambiguous", "h-conditional-degenerate", "h-conditional-interior", "h-conditional-invalid", "h-conditional-offscreen", "h-conditional-visible", "mpd-data", "numeric-finiteness", "omr-10030-1", "path-contexts", "path-policy", "profile-matrix", "semantic-limits", "steps-transforms", "syntax-all-types", "syntax-types", "texmap-events", ]; let present_ids = fixtures .iter() .map(|fixture| fixture.id) .collect::<BTreeSet<_>>(); let expected_ids = EXPECTED_FILE_IDS.iter().copied().collect::<BTreeSet<_>>(); if present_ids != expected_ids { return Err(format!( "fixture inventory and expected-file IDs differ: inventory={present_ids:?}, expected={expected_ids:?}" )); } let manifest: ArtifactManifest = serde_json::from_str(ARTIFACT_PROVENANCE) .map_err(|error| format!("invalid artifact provenance manifest: {error}"))?; let mut manifest_ids = BTreeSet::new(); let mut manifest_paths = BTreeSet::new(); for entry in &manifest.artifacts { if !manifest_ids.insert(entry.id.as_str()) { return Err(format!("duplicate provenance artifact id {}", entry.id)); } if !manifest_paths.insert(entry.path.as_str()) { return Err(format!("duplicate provenance artifact path {}", entry.path)); } } if manifest_ids != present_ids { return Err(format!( "provenance and fixture IDs differ: manifest={manifest_ids:?}, fixtures={present_ids:?}" )); } let fixture_paths = fixtures .iter() .map(|fixture| fixture.relative_path) .collect::<BTreeSet<_>>(); if manifest_paths != fixture_paths { return Err(format!( "provenance and fixture paths differ: manifest={manifest_paths:?}, fixtures={fixture_paths:?}" )); } for required in REQUIRED_BASELINE_IDS { if !present_ids.contains(required) { return Err(format!("missing required baseline fixture {required}")); } } let mut ids = BTreeSet::new(); let mut paths = BTreeSet::new(); for fixture in fixtures { if !ids.insert(fixture.id) { return Err(format!("duplicate fixture id {}", fixture.id)); } if !paths.insert(fixture.relative_path) { return Err(format!("duplicate fixture path {}", fixture.relative_path)); } if fixture.provenance.sha256 != fixture.sha256() { return Err(format!("hash mismatch {}", fixture.id)); } if fixture .provenance .source_url .as_ref() .is_some_and(String::is_empty) || fixture.provenance.source_revision.is_empty() || fixture.provenance.license.is_empty() || fixture.provenance.original_test.is_empty() || fixture.provenance.modifications.is_empty() { return Err(format!("incomplete provenance {}", fixture.id)); } if fixture.expected.canonical.provenance_id != fixture.id { return Err(format!("canonical provenance link mismatch {}", fixture.id)); } if fixture.expected.profile != fixture.profile { return Err(format!( "profile metadata mismatch {}: inventory={:?}, expected={:?}", fixture.id, fixture.profile, fixture.expected.profile )); } if fixture.expected.outcome != fixture.outcome { return Err(format!( "outcome metadata mismatch {}: inventory={:?}, expected={:?}", fixture.id, fixture.outcome, fixture.expected.outcome )); } if fixture.provenance.id != format!("pm77-{}", fixture.id) { return Err(format!("provenance id mismatch {}", fixture.id)); } validate_expected_evidence(&fixture.expected, fixture.id)?; } Ok(())}