open-standards/wai/cache-conformance/tests.json
Transaction Science b6dffcff83
Some checks failed
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 10s
wai-audit collector and player integration / does this change touch it (push) Successful in 43s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 1m0s
wai-fleet service / does this change touch it (push) Successful in 1m0s
wai-app and Create / wai-app · does this change touch it (push) Successful in 1m1s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 1m3s
WAI operation catalogue / does this change touch it (push) Successful in 1m2s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 1m8s
wai-ledger service / does this change touch it (push) Successful in 1m2s
wai-fleet service / service · macos (push) Successful in 45s
wai-quantum for JavaScript / does this change touch it (push) Successful in 1m2s
wai-sink-android native sink library / does this change touch it (push) Successful in 48s
wai-sink-swift native sink package / does this change touch it (push) Successful in 46s
WAI Studio / does this change touch it (push) Successful in 46s
wai-quantum studio and desktop / does this change touch it (push) Successful in 49s
wai-audit collector and player integration / collector · linux (push) Successful in 1m20s
wai-ledger service / service · macos (push) Successful in 1m2s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 1m2s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 1m26s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 1m21s
wai-ledger service / service · linux (push) Failing after 1m50s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Successful in 3m15s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 2m9s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m54s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 3m44s
wai-fleet service / service · linux (push) Successful in 3m1s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 3m12s
wai-quantum studio and desktop / studio · browser (push) Successful in 4m9s
wai-quantum for JavaScript / javascript · linux (push) Successful in 4m29s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 4m28s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 5m26s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 6m10s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 5m45s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 8m3s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 7m22s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 7m23s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 9m59s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 10m52s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 13m34s
WAI Studio / Studio in WebKit · linux (push) Successful in 12m47s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 15m58s
cache-conformance tests what a cache answers from its store, and says how much it answered
Every MUST test could pass on a first GET, which a cache relays from the origin, so a cache that
broke §9 rule 3 only on what it stored passed the suite. C14 asks again, a second after the first
GET, for an object, a head proof, an alias, a live-edge part, a receipt file, a playlist receipt,
a key log and a parameter set, and holds each answer to the origin's bytes, ETag, Content-Type,
Cache-Control and Content-Length, with no Vary. Every 206 is held to the origin's headers too.

Three negative controls show the driver catches those faults: stored changes the headers of every
answer after a path's first, ranged those of every 206, and reflip a byte of every answer after a
path's first. S3 says how many of C14's repeats the
cache answered without reaching the origin and S4 how many of the run's requests reached it; the
summary marks a labelled cache whose store answered none as a relay.

A WAI_CACHE_DIR whose labels file is empty fails the run as an absent one does, and a labelled
cache that does not start has a row in the summary. wai http origin sends no Date while its
clock reads before the epoch (RFC 9110 §6.6.1).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 12:07:00 -05:00

28 lines
4.6 KiB
JSON

{
"note": "The tests driver.py runs against an HTTP cache that fronts an origin serving wai/http-conformance's objects (extensions/http-delivery.md §9). A MUST test failing means the cache, as configured, does not meet §9; an informative test reports what the cache did.",
"tests": [
{ "id": "C1", "name": "whole_identity", "level": "MUST", "rule": "§9 rule 1", "what": "a GET of an object, cold and then again, returns exactly the object's bytes" },
{ "id": "C2", "name": "headers_kept", "level": "MUST", "rule": "§9 rule 3", "what": "a 200 keeps the origin's ETag, Content-Type and Cache-Control, and a Content-Length of the object's length" },
{ "id": "C3", "name": "range_from_stored", "level": "MUST", "rule": "§9 rule 2", "what": "after a whole GET, a single range is answered 206 with exactly those bytes and Content-Range bytes a-b/n" },
{ "id": "C4", "name": "range_cold", "level": "MUST", "rule": "§9 rule 2, §5.3", "what": "a single range on an object not yet fetched is answered 206 with exactly those bytes, or 200 with the whole object" },
{ "id": "C5", "name": "suffix_and_open_ranges", "level": "MUST", "rule": "§9 rule 2", "what": "bytes=-N and bytes=A- are answered with exactly those bytes" },
{ "id": "C6", "name": "unsatisfiable", "level": "MUST", "rule": "§9 rule 2", "what": "a range starting at the object's length is answered 416 with Content-Range bytes */n" },
{ "id": "C7", "name": "no_coding", "level": "MUST", "rule": "§9 rule 1", "what": "with Accept-Encoding offering codings, the object comes back with no Content-Encoding and its exact bytes" },
{ "id": "C8", "name": "if_range_strong", "level": "MUST", "rule": "§9 rule 5", "what": "If-Range with the object's ETag gets 206; with a weak form of it, or another ETag, the whole object" },
{ "id": "C9", "name": "no_vary_by_header", "level": "MUST", "rule": "§9 rule 4", "what": "requests that differ in User-Agent, Accept-Language and Accept get the same bytes, with no Vary" },
{ "id": "C10", "name": "head_proof_kept", "level": "MUST", "rule": "§9 rule 6, §6.2", "what": "a head proof is returned byte for byte with its immutable Cache-Control" },
{ "id": "C11", "name": "alias", "level": "MUST", "rule": "§5.2, §9 rule 1", "what": "an alias returns the object's exact bytes and its ETag" },
{ "id": "C12", "name": "live_edge_max_age", "level": "MUST", "rule": "§5.3, §9 rule 3", "what": "an object listed at a live edge keeps its shorter max-age and its bytes, whole and by range" },
{ "id": "C13", "name": "no_vary_cors", "level": "MUST", "rule": "§5.3, §9 rule 4", "what": "a request with Origin gets Access-Control-Allow-Origin: * and no Vary: Origin" },
{ "id": "C14", "name": "stored_answer_kept", "level": "MUST", "rule": "§9 rules 1, 2, 3, 4 and 6", "what": "asked again after a pause, an object, a head proof, an alias, a live-edge part, a receipt file, a playlist receipt, a key log and a parameter set each keep the origin's bytes, ETag, Content-Type, Cache-Control and Content-Length, with no Vary; a range of a stored object keeps all but Content-Length" },
{ "id": "R1", "name": "index_revalidated", "level": "MUST", "rule": "§9 rule 6, §8.2", "what": "a receipt index changed at the origin is returned changed on the next request" },
{ "id": "R2", "name": "receipt_file_kept", "level": "MUST", "rule": "§9 rule 6, §8.1", "what": "a receipt file is returned byte for byte with its immutable Cache-Control" },
{ "id": "R3", "name": "playlist_receipt_kept", "level": "MUST", "rule": "§9 rule 6, §8.6", "what": "a playlist receipt is returned byte for byte" },
{ "id": "R4", "name": "key_log_max_age", "level": "MUST", "rule": "§9 rule 6, §8.4", "what": "the key log is returned byte for byte with its Cache-Control" },
{ "id": "R5", "name": "parameter_set_kept", "level": "MUST", "rule": "§9 rule 6, §8.5", "what": "a parameter set named by its digest is returned byte for byte and hashes to its name" },
{ "id": "S1", "name": "stored", "level": "informative", "rule": "§9", "what": "a second GET of an object is answered without reaching the origin" },
{ "id": "S2", "name": "range_stored", "level": "informative", "rule": "§9 rule 2", "what": "a range after a whole GET is answered without reaching the origin" },
{ "id": "S3", "name": "stored_after_pause", "level": "informative", "rule": "§9", "what": "how many of C14's repeat GETs were answered without reaching the origin" },
{ "id": "S4", "name": "origin_share", "level": "informative", "rule": "§9", "what": "how many of the run's requests to the cache reached the origin" }
]
}