You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bn...@apache.org on 2022/03/24 20:44:24 UTC

[trafficserver-ci] branch main updated: redo cache-tests so that it publishes

This is an automated email from the ASF dual-hosted git repository.

bnolsen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/trafficserver-ci.git


The following commit(s) were added to refs/heads/main by this push:
     new bec7cd0  redo cache-tests so that it publishes
     new edbf108  Merge pull request #89 from traeak/cache_tests
bec7cd0 is described below

commit bec7cd0245d83147be0f29eb1217934b3673feef
Author: Brian Olsen <br...@comcast.com>
AuthorDate: Thu Mar 24 20:41:36 2022 +0000

    redo cache-tests so that it publishes
---
 docker/cache-tests-build/Dockerfile           |  18 -
 docker/cache-tests-build/docker-compose.yml   |  10 -
 docker/cache-tests/Dockerfile                 |  17 +-
 docker/cache-tests/README.md                  |  55 ++
 docker/cache-tests/docker-compose.yml         |  20 +-
 docker/cache-tests/results/apache.json        | 646 ------------------
 docker/cache-tests/results/ats-master.json    | 655 ------------------
 docker/cache-tests/results/chrome.json        | 587 ----------------
 docker/cache-tests/results/fastly.json        | 835 -----------------------
 docker/cache-tests/results/firefox.json       | 584 ----------------
 docker/cache-tests/results/index.mjs          |  78 ---
 docker/cache-tests/results/nginx.json         | 826 -----------------------
 docker/cache-tests/results/nuster.json        | 922 --------------------------
 docker/cache-tests/results/safari.json        | 614 -----------------
 docker/cache-tests/results/squid.json         | 652 ------------------
 docker/cache-tests/results/trafficserver.json | 670 -------------------
 docker/cache-tests/results/varnish.json       | 790 ----------------------
 jenkins/branch/cache-tests.pipeline           | 111 ++--
 jenkins/branch/coverage.pipeline              |   2 +-
 jenkins/branch/docs.pipeline                  |   2 +-
 jenkins/branch/in_tree.pipeline               |   2 +-
 jenkins/branch/os_build.pipeline              |   2 +-
 jenkins/branch/rat.pipeline                   |   2 +-
 23 files changed, 152 insertions(+), 7948 deletions(-)

diff --git a/docker/cache-tests-build/Dockerfile b/docker/cache-tests-build/Dockerfile
deleted file mode 100644
index 92bb06a..0000000
--- a/docker/cache-tests-build/Dockerfile
+++ /dev/null
@@ -1,18 +0,0 @@
-FROM node:16
-EXPOSE 8000
-
-RUN apt-get update; \
-    DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential llvm ccache \
-    make pkgconf bison flex g++ clang gettext libc++-dev autoconf automake \
-    libtool autotools-dev git distcc file wget openssl hwloc intltool-debian clang-tools-10 clang-10; \
-
-    DEBIAN_FRONTEND=noninteractive apt-get -y install libssl-dev libexpat1-dev \
-    libpcre3-dev libcap-dev libhwloc-dev libunwind8 libunwind-dev zlib1g-dev \
-    tcl-dev tcl8.6-dev libjemalloc-dev libluajit-5.1-dev liblzma-dev \
-    libhiredis-dev libbrotli-dev libncurses-dev libgeoip-dev libmagick++-dev \
-    libmaxminddb-dev libcjose-dev libcjose0 libjansson-dev; \
-    
-    DEBIAN_FRONTEND=noninteractive apt-get autoremove; apt-get clean;
-
-RUN git clone https://github.com/http-tests/cache-tests.git
-RUN cd cache-tests && npm i
diff --git a/docker/cache-tests-build/docker-compose.yml b/docker/cache-tests-build/docker-compose.yml
deleted file mode 100644
index d310a31..0000000
--- a/docker/cache-tests-build/docker-compose.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-version: "3.4"
-services:
-  cache-tests-build:
-    build:
-      context: .
-      dockerfile: Dockerfile
-      network: host
-#    ports:
-#      - "127.0.0.1:8000:8000"
-    network_mode: host
diff --git a/docker/cache-tests/Dockerfile b/docker/cache-tests/Dockerfile
index c797be9..67fbcfb 100644
--- a/docker/cache-tests/Dockerfile
+++ b/docker/cache-tests/Dockerfile
@@ -1,6 +1,15 @@
-FROM node:16
+FROM controller.trafficserver.org/ats/debian:11
+
 EXPOSE 8000
 
-RUN git clone https://github.com/http-tests/cache-tests.git
-RUN cd cache-tests && npm i
-CMD cd cache-tests && npm run server
+ENV DEBIAN_FRONTEND=noninteractive
+RUN apt-get update ; \
+  apt-get -y install npm curl ; \
+        apt-get autoremove ; \
+        apt-get clean ;
+
+RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
+RUN apt install -y nodejs
+COPY cache-tests /cache-tests
+RUN mkdir -p /opt/ && chmod 777 /opt/
+RUN cd /cache-tests && npm i
diff --git a/docker/cache-tests/README.md b/docker/cache-tests/README.md
new file mode 100644
index 0000000..cc37373
--- /dev/null
+++ b/docker/cache-tests/README.md
@@ -0,0 +1,55 @@
+Instructions on building and configuring cache-tests.
+
+There are 2 parts for cache-tests.
+* ATS test run on any docker jenkins build agent.
+* Publishing server that runs on the `controller`.
+
+These instructions and docker utilities exist on the `controller` in
+`/opt/cache-tests/'.  There is this README, a Dockerfile and
+ docker-compose.yml files.
+
+For this to work a desired clone of the cache-tests git repo
+`https://github.com/http-tests/cache-tests.git`
+needs to reside in /opt/cache-tests/cache-tests on the `controller`.
+
+Periodically this git repo should be updated which will require rebuilding
+the cache-tests image: `controller.trafficserver.org/ats/cache-tests`
+and restarting the Publishing server.
+
+Currently the `debian:11` image from the ats docker repo is used
+as the base.  On top of it is installed the npm utility which
+is used to both run the tests and also publish the results on
+port 8000 of the `controller`.  The above cache-tests git repo is added
+into the docker image.  Building this image *MUST* be
+done from `/opt/cache-tests` on the `controller`.
+
+The Publishing server mounts this `/opt/cache-tests/cache-tests/results`
+directory into its own copy of the cache-tests git repo and serves
+that up.
+
+In order to add or remove test run results the file
+`/opt/cache-tests/cache-tests/results/index.mjs` should be edited
+directly.  When upgrading the cache-tests git repo this file
+will need to be rebased onto the updated pull.
+
+An example update run:
+
+```
+cd /opt/cache-tests
+docker-compose down server
+cd /opt/cache-tests/cache-tests
+
+# update the repo, merge the results/index.mjs changes
+git stash ; git fetch ; git pull ; git stash apply
+
+# rebuild and push cache-tests image
+cd /opt/cache-tests
+docker-compose build builder
+docker tag <hash> controller.trafficserver.org:5000/ats/cache-tests
+docker push controller.trafficserver.org:5000/ats/cache-tests
+
+docker-compose up -d server
+```
+
+Also remember to clear/repull the cache-test images on the docker jenkins
+agents.
diff --git a/docker/cache-tests/docker-compose.yml b/docker/cache-tests/docker-compose.yml
index 3f33790..63cc047 100644
--- a/docker/cache-tests/docker-compose.yml
+++ b/docker/cache-tests/docker-compose.yml
@@ -1,11 +1,25 @@
 version: "3.4"
 services:
-  cache-tests:
-    container_name: cache-tests
+  builder:
     build:
       context: .
       dockerfile: Dockerfile
       network: host
+    image: cache-tests
+    working_dir: /home/jenkins/workspace
     network_mode: host
+    cap_add: [ SYS_PTRACE ]
+    command: bash
+
+  server:
+    image: cache-tests
+    container_name: cache-tests-server
+    restart: unless-stopped
+    network_mode: host
+    expose:
+      - "8000"
     volumes:
-      - /location_of_cache_tests/results_dir:/cache-tests/results:rw
+      - ./cache-tests/results:/cache-tests/results:Z
+    working_dir: /cache-tests
+    cap_add: [ SYS_PTRACE ]
+    command: npm run server
diff --git a/docker/cache-tests/results/apache.json b/docker/cache-tests/results/apache.json
deleted file mode 100644
index a5059fe..0000000
--- a/docker/cache-tests/results/apache.json
+++ /dev/null
@@ -1,646 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": true,
-  "304-etag-update-response-Content-Encoding": [
-    "Setup",
-    "retry"
-  ],
-  "304-etag-update-response-Content-Foo": true,
-  "304-etag-update-response-Content-Length": [
-    "Setup",
-    "retry"
-  ],
-  "304-etag-update-response-Content-Location": [
-    "Setup",
-    "retry"
-  ],
-  "304-etag-update-response-Content-MD5": [
-    "Setup",
-    "retry"
-  ],
-  "304-etag-update-response-Content-Range": [
-    "Setup",
-    "retry"
-  ],
-  "304-etag-update-response-Content-Security-Policy": true,
-  "304-etag-update-response-Content-Type": [
-    "Setup",
-    "retry"
-  ],
-  "304-etag-update-response-ETag": [
-    "Setup",
-    "retry"
-  ],
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": true,
-  "304-etag-update-response-Set-Cookie2": true,
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": true,
-  "304-etag-update-response-X-Frame-Options": true,
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": true,
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": true,
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-suffix-twoline": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": true,
-  "cc-resp-no-cache-revalidate": true,
-  "cc-resp-no-cache-revalidate-fresh": true,
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-shared": true,
-  "ccreq-ma0": true,
-  "ccreq-ma1": true,
-  "ccreq-magreaterage": true,
-  "ccreq-max-stale": true,
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": true,
-  "ccreq-min-fresh-age": true,
-  "ccreq-no-cache": true,
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "ccreq-no-store": true,
-  "ccreq-oic": true,
-  "conditional-304-etag": true,
-  "conditional-etag-forward": true,
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": true,
-  "conditional-etag-quoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-respond": true,
-  "conditional-etag-strong-respond-multiple-first": true,
-  "conditional-etag-strong-respond-multiple-last": true,
-  "conditional-etag-strong-respond-multiple-second": true,
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-unquoted-respond-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-unquoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": true,
-  "conditional-etag-weak-respond": true,
-  "conditional-etag-weak-respond-backslash": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-weak-respond-lowercase": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-weak-respond-omit-slash": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": true,
-  "conditional-lm-fresh-no-lm": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-lm-fresh-rfc850": true,
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": true,
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": true,
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": true,
-  "freshness-expires-invalid-2-digit-year": true,
-  "freshness-expires-invalid-aest": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": true,
-  "freshness-expires-invalid-multiple-lines": true,
-  "freshness-expires-invalid-multiple-spaces": true,
-  "freshness-expires-invalid-no-comma": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-tz": true,
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": true,
-  "freshness-max-age-date": true,
-  "freshness-max-age-decimal-five": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-decimal-zero": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer": true,
-  "freshness-max-age-s-maxage-shared-longer-multiple": true,
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": true,
-  "freshness-max-age-s-maxage-shared-shorter-expires": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": true,
-  "freshness-max-age-space-before-equals": true,
-  "freshness-max-age-two-fresh-stale-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sameline": true,
-  "freshness-max-age-two-stale-fresh-sepline": true,
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": true,
-  "headers-omit-headers-listed-in-Connection": true,
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": true,
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": true,
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": true,
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": true,
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Setup",
-    "Response 2 status is 500, not 599"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": true,
-  "heuristic-delta-1800": true,
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": true,
-  "heuristic-delta-3600": true,
-  "heuristic-delta-43200": true,
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": true,
-  "heuristic-delta-600": true,
-  "heuristic-delta-86400": true,
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": true,
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": true,
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": true,
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": true,
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": true,
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": true,
-  "other-age-update-expires": true,
-  "other-age-update-max-age": true,
-  "other-authorization": true,
-  "other-authorization-must-revalidate": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-authorization-public": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-authorization-smaxage": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-cookie": true,
-  "other-date-update": [
-    "Assertion",
-    "Response 2 header Date is \"Tue, 06 Apr 2021 07:02:33 GMT\", not \"Tue, 06 Apr 2021 07:02:30 GMT\""
-  ],
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": true,
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": true,
-  "partial-store-complete-reuse-partial-no-last": true,
-  "partial-store-complete-reuse-partial-suffix": true,
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": true,
-  "partial-use-stored-headers": true,
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": true,
-  "stale-close": true,
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": true,
-  "stale-sie-close": true,
-  "stale-warning-become": true,
-  "stale-warning-stored": true,
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-204-stale": true,
-  "status-299-fresh": [
-    "Setup",
-    "Response 2 status is 500, not 299"
-  ],
-  "status-299-stale": true,
-  "status-301-fresh": true,
-  "status-301-stale": true,
-  "status-302-fresh": true,
-  "status-302-stale": true,
-  "status-303-fresh": true,
-  "status-303-stale": true,
-  "status-307-fresh": true,
-  "status-307-stale": true,
-  "status-308-fresh": true,
-  "status-308-stale": true,
-  "status-400-fresh": true,
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": [
-    "Setup",
-    "Response 2 status is 500, not 499"
-  ],
-  "status-499-stale": true,
-  "status-500-fresh": true,
-  "status-500-stale": true,
-  "status-502-fresh": true,
-  "status-502-stale": true,
-  "status-503-fresh": true,
-  "status-503-stale": true,
-  "status-504-fresh": true,
-  "status-504-stale": true,
-  "status-599-fresh": [
-    "Setup",
-    "Response 2 status is 500, not 599"
-  ],
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "surrogate-append-capabilities": [
-    "Assertion",
-    "Request 1 Surrogate-Capability header not present."
-  ],
-  "surrogate-fresh-cc-nostore": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-extension": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-long-cc-max-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-me-target": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-space-after-equals": true,
-  "surrogate-max-age-space-before-equals": true,
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-remove-header": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": true,
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": true,
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
diff --git a/docker/cache-tests/results/ats-master.json b/docker/cache-tests/results/ats-master.json
deleted file mode 100644
index b2545dc..0000000
--- a/docker/cache-tests/results/ats-master.json
+++ /dev/null
@@ -1,655 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": true,
-  "304-etag-update-response-Content-Encoding": true,
-  "304-etag-update-response-Content-Foo": true,
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": true,
-  "304-etag-update-response-Content-MD5": true,
-  "304-etag-update-response-Content-Range": true,
-  "304-etag-update-response-Content-Security-Policy": true,
-  "304-etag-update-response-Content-Type": [
-    "Assertion",
-    "Response 2 header Content-Type is \"text/plain\", not \"text/plain;charset=utf-8\""
-  ],
-  "304-etag-update-response-ETag": true,
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Set-Cookie2": true,
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": true,
-  "304-etag-update-response-X-Frame-Options": true,
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": true,
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": true,
-  "age-parse-parameter": true,
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": true,
-  "age-parse-suffix-twoline": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": true,
-  "cc-resp-no-cache-revalidate": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-cache-revalidate-fresh": true,
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-shared": true,
-  "ccreq-ma0": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-ma1": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": true,
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": true,
-  "ccreq-min-fresh-age": true,
-  "ccreq-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": true,
-  "conditional-304-etag": true,
-  "conditional-etag-forward": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": true,
-  "conditional-etag-quoted-respond-unquoted": true,
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-respond": true,
-  "conditional-etag-strong-respond-multiple-first": true,
-  "conditional-etag-strong-respond-multiple-last": true,
-  "conditional-etag-strong-respond-multiple-second": true,
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-quoted": true,
-  "conditional-etag-unquoted-respond-unquoted": true,
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "conditional-etag-weak-respond": true,
-  "conditional-etag-weak-respond-backslash": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-weak-respond-lowercase": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-weak-respond-omit-slash": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": true,
-  "conditional-lm-fresh-no-lm": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-rfc850": true,
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": true,
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": true,
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-2-digit-year": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-aest": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-spaces": true,
-  "freshness-expires-invalid-no-comma": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-tz": true,
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": true,
-  "freshness-max-age-a100": true,
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": true,
-  "freshness-max-age-date": true,
-  "freshness-max-age-decimal-five": true,
-  "freshness-max-age-decimal-zero": true,
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": true,
-  "freshness-max-age-s-maxage-shared-longer": true,
-  "freshness-max-age-s-maxage-shared-longer-multiple": true,
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": true,
-  "freshness-max-age-s-maxage-shared-shorter-expires": true,
-  "freshness-max-age-single-quoted": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sameline": true,
-  "freshness-max-age-two-stale-fresh-sepline": true,
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": [
-    "Setup",
-    "Response 1 status is 400, not 200"
-  ],
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": true,
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": true,
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": true,
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1800": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-3600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-43200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-86400": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": true,
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": true,
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": true,
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": true,
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": true,
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": true,
-  "other-age-update-expires": true,
-  "other-age-update-max-age": true,
-  "other-authorization": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "other-authorization-must-revalidate": true,
-  "other-authorization-public": true,
-  "other-authorization-smaxage": true,
-  "other-cookie": true,
-  "other-date-update": true,
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": true,
-  "partial-store-complete-reuse-partial-no-last": true,
-  "partial-store-complete-reuse-partial-suffix": true,
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": true,
-  "partial-use-stored-headers": true,
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": true,
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": true,
-  "stale-close": true,
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": true,
-  "stale-sie-close": true,
-  "stale-warning-become": true,
-  "stale-warning-stored": true,
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-204-stale": true,
-  "status-299-fresh": true,
-  "status-299-stale": true,
-  "status-301-fresh": true,
-  "status-301-stale": true,
-  "status-302-fresh": true,
-  "status-302-stale": true,
-  "status-303-fresh": true,
-  "status-303-stale": true,
-  "status-307-fresh": true,
-  "status-307-stale": true,
-  "status-308-fresh": true,
-  "status-308-stale": true,
-  "status-400-fresh": true,
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": true,
-  "status-499-stale": true,
-  "status-500-fresh": true,
-  "status-500-stale": true,
-  "status-502-fresh": true,
-  "status-502-stale": true,
-  "status-503-fresh": true,
-  "status-503-stale": true,
-  "status-504-fresh": true,
-  "status-504-stale": true,
-  "status-599-fresh": true,
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "surrogate-append-capabilities": [
-    "Assertion",
-    "Request 1 Surrogate-Capability header not present."
-  ],
-  "surrogate-fresh-cc-nostore": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-extension": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-long-cc-max-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-me-target": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-space-after-equals": true,
-  "surrogate-max-age-space-before-equals": true,
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-remove-header": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": true,
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": true,
-  "vary-normalise-lang-case": true,
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": true,
-  "vary-normalise-space": true,
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
diff --git a/docker/cache-tests/results/chrome.json b/docker/cache-tests/results/chrome.json
deleted file mode 100644
index 110495c..0000000
--- a/docker/cache-tests/results/chrome.json
+++ /dev/null
@@ -1,587 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": [
-    "Assertion",
-    "Response 2 header Clear-Site-Data is \"null\", not \"cookies\""
-  ],
-  "304-etag-update-response-Content-Encoding": [
-    "Assertion",
-    "Response 2 header Content-Encoding is \"ARIZQHYPGXOFWNE\", not \"ASKCUMEWOGYQIAS\""
-  ],
-  "304-etag-update-response-Content-Foo": true,
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": [
-    "Assertion",
-    "Response 2 header Content-Location is \"/foo\", not \"/bar\""
-  ],
-  "304-etag-update-response-Content-MD5": [
-    "Assertion",
-    "Response 2 header Content-MD5 is \"rL0Y20zC+Fzt72VPzMSk2A==\", not \"N7UdGUp1E+RbVvZSTy1R8g==\""
-  ],
-  "304-etag-update-response-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"APETIXMBQFUJYNC\", not \"AQGWMCSIYOEUKAQ\""
-  ],
-  "304-etag-update-response-Content-Security-Policy": true,
-  "304-etag-update-response-Content-Type": [
-    "Assertion",
-    "Response 2 header Content-Type is \"text/plain\", not \"text/plain;charset=utf-8\""
-  ],
-  "304-etag-update-response-ETag": [
-    "Assertion",
-    "Response 2 header ETag is \"\"abcdef\"\", not \"\"ghijkl\"\""
-  ],
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Set-Cookie2": [
-    "Assertion",
-    "Response 2 header Set-Cookie2 is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": [
-    "Assertion",
-    "Response 2 header X-Content-Foo is \"AZYXWVUTSRQPONM\", not \"AAAAAAAAAAAAAAA\""
-  ],
-  "304-etag-update-response-X-Frame-Options": [
-    "Assertion",
-    "Response 2 header X-Frame-Options is \"deny\", not \"sameorigin\""
-  ],
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": [
-    "Assertion",
-    "Response 2 header X-XSS-Protection is \"1\", not \"1; mode=block\""
-  ],
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": true,
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": true,
-  "age-parse-suffix-twoline": true,
-  "cc-resp-immutable-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "cc-resp-immutable-stale": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": true,
-  "cc-resp-no-cache-revalidate": true,
-  "cc-resp-no-cache-revalidate-fresh": true,
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-private": true,
-  "ccreq-ma0": true,
-  "ccreq-ma1": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-max-stale-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-min-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-min-fresh-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache": true,
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": [
-    "Assertion",
-    "Response 1 status is 200, not 504"
-  ],
-  "conditional-etag-forward": true,
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"\"abcdef\"\""
-  ],
-  "conditional-etag-weak-generate-weak": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": true,
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": true,
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-2-digit-year": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-aest": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-spaces": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-no-comma": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-time-periods": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-utc": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": true,
-  "freshness-expires-wrong-case-tz": true,
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": true,
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": true,
-  "freshness-max-age-date": true,
-  "freshness-max-age-decimal-five": true,
-  "freshness-max-age-decimal-zero": true,
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-private": true,
-  "freshness-max-age-s-maxage-private-multiple": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": true,
-  "freshness-max-age-two-fresh-stale-sameline": true,
-  "freshness-max-age-two-fresh-stale-sepline": true,
-  "freshness-max-age-two-stale-fresh-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-none": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": true,
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": [
-    "Assertion",
-    "Response 2 header Clear-Site-Data is \"null\", not \"cookies\""
-  ],
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "headers-store-Set-Cookie2": [
-    "Assertion",
-    "Response 2 header Set-Cookie2 is \"null\", not \"a=c\""
-  ],
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": true,
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": true,
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": true,
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": true,
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": true,
-  "heuristic-delta-1800": true,
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": true,
-  "heuristic-delta-3600": true,
-  "heuristic-delta-43200": true,
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": true,
-  "heuristic-delta-600": true,
-  "heuristic-delta-86400": true,
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": true,
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": true,
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": true,
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": true,
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": true,
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": [
-    "Assertion",
-    "Response 2 Age header not present."
-  ],
-  "other-age-update-expires": [
-    "Assertion",
-    "Response 2 header Age is 30, should be bigger than 32"
-  ],
-  "other-age-update-max-age": [
-    "Assertion",
-    "Response 2 header Age is 30, should be bigger than 32"
-  ],
-  "other-cookie": true,
-  "other-date-update": true,
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": true,
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": true,
-  "partial-store-complete-reuse-partial-no-last": true,
-  "partial-store-complete-reuse-partial-suffix": true,
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": true,
-  "partial-use-stored-headers": true,
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-close-must-revalidate": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-close-no-cache": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-close-proxy-revalidate": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-close-s-maxage=2": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-sie-503": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-sie-close": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-warning-become": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "stale-warning-stored": [
-    "TypeError",
-    "Failed to fetch"
-  ],
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": true,
-  "status-204-stale": true,
-  "status-299-fresh": true,
-  "status-299-stale": true,
-  "status-400-fresh": true,
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": true,
-  "status-499-stale": true,
-  "status-500-fresh": true,
-  "status-500-stale": true,
-  "status-502-fresh": true,
-  "status-502-stale": true,
-  "status-503-fresh": true,
-  "status-503-stale": true,
-  "status-504-fresh": true,
-  "status-504-stale": true,
-  "status-599-fresh": true,
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": true,
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": true,
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
\ No newline at end of file
diff --git a/docker/cache-tests/results/fastly.json b/docker/cache-tests/results/fastly.json
deleted file mode 100644
index 59bcac8..0000000
--- a/docker/cache-tests/results/fastly.json
+++ /dev/null
@@ -1,835 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": [
-    "Assertion",
-    "Response 2 header Cache-Control is \"max-age=1\", not \"max-age=3600\""
-  ],
-  "304-etag-update-response-Clear-Site-Data": [
-    "Assertion",
-    "Response 2 header Clear-Site-Data is \"cache\", not \"cookies\""
-  ],
-  "304-etag-update-response-Content-Encoding": [
-    "Assertion",
-    "Response 2 header Content-Encoding is \"ARIZQHYPGXOFWNE\", not \"ASKCUMEWOGYQIAS\""
-  ],
-  "304-etag-update-response-Content-Foo": [
-    "Assertion",
-    "Response 2 header Content-Foo is \"AWSOKGCYUQMIEAW\", not \"AXUROLIFCZWTQNK\""
-  ],
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": [
-    "Assertion",
-    "Response 2 header Content-Location is \"/foo\", not \"/bar\""
-  ],
-  "304-etag-update-response-Content-MD5": [
-    "Assertion",
-    "Response 2 header Content-MD5 is \"rL0Y20zC+Fzt72VPzMSk2A==\", not \"N7UdGUp1E+RbVvZSTy1R8g==\""
-  ],
-  "304-etag-update-response-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"null\", not \"AQGWMCSIYOEUKAQ\""
-  ],
-  "304-etag-update-response-Content-Security-Policy": [
-    "Assertion",
-    "Response 2 header Content-Security-Policy is \"default-src 'self'\", not \"default-src 'self' cdn.example.com\""
-  ],
-  "304-etag-update-response-Content-Type": [
-    "Assertion",
-    "Response 2 header Content-Type is \"text/plain\", not \"text/plain;charset=utf-8\""
-  ],
-  "304-etag-update-response-ETag": [
-    "Assertion",
-    "Response 2 header ETag is \"\"abcdef\"\", not \"\"ghijkl\"\""
-  ],
-  "304-etag-update-response-Expires": [
-    "Assertion",
-    "Response 2 header Expires is \"Fri, 01 Jan 2038 01:01:01 GMT\", not \"Mon, 11 Jan 2038 11:11:11 GMT\""
-  ],
-  "304-etag-update-response-Public-Key-Pins": [
-    "Assertion",
-    "Response 2 header Public-Key-Pins is \"AUOICWQKEYSMGAU\", not \"AVQLGBWRMHCXSNI\""
-  ],
-  "304-etag-update-response-Set-Cookie": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Set-Cookie2": [
-    "Assertion",
-    "Response 2 header Set-Cookie2 is \"a=b\", not \"a=c\""
-  ],
-  "304-etag-update-response-Test-Header": [
-    "Assertion",
-    "Response 2 header Test-Header is \"AAAAAAAAAAAAAAA\", not \"ABCDEFGHIJKLMNO\""
-  ],
-  "304-etag-update-response-X-Content-Foo": [
-    "Assertion",
-    "Response 2 header X-Content-Foo is \"AZYXWVUTSRQPONM\", not \"AAAAAAAAAAAAAAA\""
-  ],
-  "304-etag-update-response-X-Frame-Options": [
-    "Assertion",
-    "Response 2 header X-Frame-Options is \"deny\", not \"sameorigin\""
-  ],
-  "304-etag-update-response-X-Test-Header": [
-    "Assertion",
-    "Response 2 header X-Test-Header is \"ADGJMPSVYBEHKNQ\", not \"AEIMQUYCGKOSWAE\""
-  ],
-  "304-etag-update-response-X-XSS-Protection": [
-    "Assertion",
-    "Response 2 header X-XSS-Protection is \"1\", not \"1; mode=block\""
-  ],
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": true,
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": true,
-  "age-parse-parameter": true,
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": true,
-  "age-parse-suffix-twoline": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-no-cache-case-insensitive": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-no-cache-revalidate": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-cache-revalidate-fresh": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-private-shared": true,
-  "ccreq-ma0": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-ma1": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-max-stale-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-min-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-min-fresh-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": [
-    "Assertion",
-    "Response 1 status is 200, not 504"
-  ],
-  "conditional-304-etag": true,
-  "conditional-etag-forward": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": true,
-  "conditional-etag-quoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-respond": true,
-  "conditional-etag-strong-respond-multiple-first": true,
-  "conditional-etag-strong-respond-multiple-last": true,
-  "conditional-etag-strong-respond-multiple-second": true,
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-quoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-unquoted": true,
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": true,
-  "conditional-etag-weak-respond": true,
-  "conditional-etag-weak-respond-backslash": true,
-  "conditional-etag-weak-respond-lowercase": true,
-  "conditional-etag-weak-respond-omit-slash": true,
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": true,
-  "conditional-lm-fresh-no-lm": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-rfc850": true,
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-age-slow-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": true,
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-2-digit-year": true,
-  "freshness-expires-invalid-aest": true,
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": true,
-  "freshness-expires-invalid-multiple-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-spaces": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-no-comma": true,
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": true,
-  "freshness-expires-old-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": true,
-  "freshness-expires-wrong-case-tz": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": true,
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-decimal-five": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-decimal-zero": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer": true,
-  "freshness-max-age-s-maxage-shared-longer-multiple": true,
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": true,
-  "freshness-max-age-s-maxage-shared-shorter-expires": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sameline": true,
-  "freshness-max-age-two-fresh-stale-sepline": true,
-  "freshness-max-age-two-stale-fresh-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 status is 410, not 200"
-  ],
-  "head-writethrough": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"null\", not \"ANANANANANANANA\""
-  ],
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": [
-    "Setup",
-    "Response 1 status is 503, not 200"
-  ],
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": [
-    "Setup",
-    "retry"
-  ],
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1800": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-3600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-43200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-86400": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "invalidate-DELETE": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": true,
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": true,
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": true,
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": true,
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": true,
-  "other-age-update-expires": [
-    "Assertion",
-    "Response 2 header Age is 3, should be bigger than 32"
-  ],
-  "other-age-update-max-age": true,
-  "other-authorization": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "other-authorization-must-revalidate": true,
-  "other-authorization-public": true,
-  "other-authorization-smaxage": true,
-  "other-cookie": true,
-  "other-date-update": [
-    "Assertion",
-    "Response 2 header Date is \"Mon, 17 May 2021 05:28:55 GMT\", not \"Mon, 17 May 2021 05:28:52 GMT\""
-  ],
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-set-cookie": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-complete-reuse-partial": true,
-  "partial-store-complete-reuse-partial-no-last": true,
-  "partial-store-complete-reuse-partial-suffix": true,
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": true,
-  "partial-use-stored-headers": true,
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": true,
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": true,
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": [
-    "Setup",
-    "retry"
-  ],
-  "stale-close": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-sie-close": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-warning-become": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "stale-warning-stored": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-fresh": true,
-  "status-200-must-understand": true,
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-204-stale": true,
-  "status-299-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-299-stale": true,
-  "status-301-fresh": true,
-  "status-301-stale": true,
-  "status-302-fresh": true,
-  "status-302-stale": true,
-  "status-303-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-303-stale": true,
-  "status-307-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-307-stale": true,
-  "status-308-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-308-stale": true,
-  "status-400-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-499-stale": true,
-  "status-500-fresh": [
-    "Setup",
-    "retry"
-  ],
-  "status-500-stale": [
-    "Setup",
-    "retry"
-  ],
-  "status-502-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-502-stale": true,
-  "status-503-fresh": [
-    "Setup",
-    "retry"
-  ],
-  "status-503-stale": [
-    "Setup",
-    "retry"
-  ],
-  "status-504-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-504-stale": true,
-  "status-599-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "surrogate-append-capabilities": [
-    "Assertion",
-    "Request 1 Surrogate-Capability header not present."
-  ],
-  "surrogate-fresh-cc-nostore": true,
-  "surrogate-max-age": true,
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": true,
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": true,
-  "surrogate-max-age-expires": true,
-  "surrogate-max-age-extension": true,
-  "surrogate-max-age-long-cc-max-age": true,
-  "surrogate-max-age-max": true,
-  "surrogate-max-age-max-plus": true,
-  "surrogate-max-age-me-target": true,
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": true,
-  "surrogate-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-space-before-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-remove-header": [
-    "Assertion",
-    "Response 1 header Surrogate-Control is \"null\", not \"foo\""
-  ],
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": true,
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-empty-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-empty-star-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-foo-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star-foo": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star-star-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ]
-}
diff --git a/docker/cache-tests/results/firefox.json b/docker/cache-tests/results/firefox.json
deleted file mode 100644
index ffa570d..0000000
--- a/docker/cache-tests/results/firefox.json
+++ /dev/null
@@ -1,584 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": true,
-  "304-etag-update-response-Content-Encoding": [
-    "Assertion",
-    "Response 2 header Content-Encoding is \"ARIZQHYPGXOFWNE\", not \"ASKCUMEWOGYQIAS\""
-  ],
-  "304-etag-update-response-Content-Foo": true,
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": [
-    "Assertion",
-    "Response 2 header Content-Location is \"/foo\", not \"/bar\""
-  ],
-  "304-etag-update-response-Content-MD5": [
-    "Assertion",
-    "Response 2 header Content-MD5 is \"rL0Y20zC+Fzt72VPzMSk2A==\", not \"N7UdGUp1E+RbVvZSTy1R8g==\""
-  ],
-  "304-etag-update-response-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"APETIXMBQFUJYNC\", not \"AQGWMCSIYOEUKAQ\""
-  ],
-  "304-etag-update-response-Content-Security-Policy": true,
-  "304-etag-update-response-Content-Type": [
-    "Assertion",
-    "Response 2 header Content-Type is \"text/plain\", not \"text/plain;charset=utf-8\""
-  ],
-  "304-etag-update-response-ETag": [
-    "Assertion",
-    "Response 2 header ETag is \"\"abcdef\"\", not \"\"ghijkl\"\""
-  ],
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Set-Cookie2": [
-    "Assertion",
-    "Response 2 header Set-Cookie2 is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": true,
-  "304-etag-update-response-X-Frame-Options": true,
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": true,
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": true,
-  "age-parse-parameter": true,
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": true,
-  "age-parse-suffix-twoline": true,
-  "cc-resp-immutable-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "cc-resp-immutable-stale": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-no-cache-revalidate": true,
-  "cc-resp-no-cache-revalidate-fresh": true,
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-private": true,
-  "ccreq-ma0": true,
-  "ccreq-ma1": true,
-  "ccreq-magreaterage": true,
-  "ccreq-max-stale": true,
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": true,
-  "ccreq-min-fresh-age": true,
-  "ccreq-no-cache": true,
-  "ccreq-no-cache-etag": true,
-  "ccreq-no-cache-lm": true,
-  "ccreq-no-store": true,
-  "ccreq-oic": [
-    "Assertion",
-    "Response 1 status is 200, not 504"
-  ],
-  "conditional-etag-forward": true,
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"\"abcdef\"\""
-  ],
-  "conditional-etag-weak-generate-weak": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": true,
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-2-digit-year": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-aest": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-spaces": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-no-comma": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-time-periods": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-utc": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": true,
-  "freshness-expires-wrong-case-tz": true,
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": true,
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-date": true,
-  "freshness-max-age-decimal-five": true,
-  "freshness-max-age-decimal-zero": true,
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-private": true,
-  "freshness-max-age-s-maxage-private-multiple": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sameline": true,
-  "freshness-max-age-two-stale-fresh-sepline": true,
-  "freshness-none": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "headers-store-Set-Cookie2": [
-    "Assertion",
-    "Response 2 header Set-Cookie2 is \"null\", not \"a=c\""
-  ],
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": true,
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": true,
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": true,
-  "heuristic-204-cached": true,
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": true,
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": true,
-  "heuristic-delta-1800": true,
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": true,
-  "heuristic-delta-3600": true,
-  "heuristic-delta-43200": true,
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": true,
-  "heuristic-delta-600": true,
-  "heuristic-delta-86400": true,
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": true,
-  "invalidate-DELETE-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-DELETE-location": true,
-  "invalidate-M-SEARCH": true,
-  "invalidate-M-SEARCH-cl": true,
-  "invalidate-M-SEARCH-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-M-SEARCH-location": true,
-  "invalidate-POST": true,
-  "invalidate-POST-cl": true,
-  "invalidate-POST-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-POST-location": true,
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": true,
-  "invalidate-PUT-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-PUT-location": true,
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": [
-    "Assertion",
-    "Response 2 Age header not present."
-  ],
-  "other-age-update-expires": [
-    "Assertion",
-    "Response 2 header Age is 30, should be bigger than 32"
-  ],
-  "other-age-update-max-age": [
-    "Assertion",
-    "Response 2 header Age is 30, should be bigger than 32"
-  ],
-  "other-cookie": true,
-  "other-date-update": true,
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": true,
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-complete-reuse-partial-no-last": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-complete-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-stored-headers": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": true,
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": true,
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-close-must-revalidate": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-close-no-cache": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-close-proxy-revalidate": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-close-s-maxage=2": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-sie-503": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-sie-close": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-warning-become": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "stale-warning-stored": [
-    "TypeError",
-    "NetworkError when attempting to fetch resource."
-  ],
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": true,
-  "status-204-stale": true,
-  "status-299-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-299-stale": true,
-  "status-400-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-400-stale": true,
-  "status-404-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-499-stale": true,
-  "status-500-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-500-stale": true,
-  "status-502-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-502-stale": true,
-  "status-503-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-503-stale": true,
-  "status-504-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-504-stale": true,
-  "status-599-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": true,
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": true,
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
\ No newline at end of file
diff --git a/docker/cache-tests/results/index.mjs b/docker/cache-tests/results/index.mjs
deleted file mode 100644
index 20eed09..0000000
--- a/docker/cache-tests/results/index.mjs
+++ /dev/null
@@ -1,78 +0,0 @@
-
-export default [
-  {
-    file: 'chrome.json',
-    name: 'Chrome',
-    type: 'browser',
-    version: '79.0.3945.130'
-  },
-  {
-    file: 'firefox.json',
-    name: 'Firefox',
-    type: 'browser',
-    version: '85.0.2',
-    link: 'https://github.com/http-tests/cache-tests/wiki/Firefox'
-  },
-  {
-    file: 'safari.json',
-    name: 'Safari',
-    type: 'browser',
-    version: '14.0.3 (16610.4.3.1.4)'
-  },
-  {
-    file: 'nginx.json',
-    name: 'nginx',
-    type: 'rev-proxy',
-    version: '1.18.0-6ubuntu4',
-    link: 'https://github.com/http-tests/cache-tests/wiki/nginx'
-  },
-  {
-    file: 'squid.json',
-    name: 'Squid',
-    type: 'rev-proxy',
-    version: '4.13-1ubuntu2',
-    link: 'https://github.com/http-tests/cache-tests/wiki/Squid'
-  },
-  {
-    file: 'trafficserver.json',
-    name: 'ATS',
-    type: 'rev-proxy',
-    version: '8.1.1+ds-1',
-    link: 'https://github.com/http-tests/cache-tests/wiki/Traffic-Server'
-  },
-  {
-    file: 'ats-master.json',
-    name: 'ATS-Master',
-    type: 'rev-proxy',
-    version: 'master',
-    link: 'https://test.com'
-  },
-  {
-    file: 'apache.json',
-    name: 'httpd',
-    type: 'rev-proxy',
-    version: '2.4.46-2ubuntu1',
-    link: 'https://github.com/http-tests/cache-tests/wiki/Apache-httpd'
-  },
-  {
-    file: 'varnish.json',
-    name: 'Varnish',
-    type: 'rev-proxy',
-    version: '6.5.1-1',
-    link: 'https://github.com/http-tests/cache-tests/wiki/Varnish'
-  },
-  {
-    file: 'nuster.json',
-    name: 'nuster',
-    type: 'rev-proxy',
-    version: 'master',
-    link: 'https://github.com/http-tests/cache-tests/wiki/nuster'
-  },
-  {
-    file: 'fastly.json',
-    name: 'Fastly',
-    type: 'cdn',
-    version: '06-05-2019',
-    link: 'https://github.com/http-tests/cache-tests/wiki/Fastly'
-  }
-]
diff --git a/docker/cache-tests/results/nginx.json b/docker/cache-tests/results/nginx.json
deleted file mode 100644
index 209da00..0000000
--- a/docker/cache-tests/results/nginx.json
+++ /dev/null
@@ -1,826 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": [
-    "Assertion",
-    "Response 2 header Cache-Control is \"max-age=1\", not \"max-age=3600\""
-  ],
-  "304-etag-update-response-Clear-Site-Data": [
-    "Assertion",
-    "Response 2 header Clear-Site-Data is \"cache\", not \"cookies\""
-  ],
-  "304-etag-update-response-Content-Encoding": [
-    "Assertion",
-    "Response 2 header Content-Encoding is \"ARIZQHYPGXOFWNE\", not \"ASKCUMEWOGYQIAS\""
-  ],
-  "304-etag-update-response-Content-Foo": [
-    "Assertion",
-    "Response 2 header Content-Foo is \"AWSOKGCYUQMIEAW\", not \"AXUROLIFCZWTQNK\""
-  ],
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": [
-    "Assertion",
-    "Response 2 header Content-Location is \"/foo\", not \"/bar\""
-  ],
-  "304-etag-update-response-Content-MD5": [
-    "Assertion",
-    "Response 2 header Content-MD5 is \"rL0Y20zC+Fzt72VPzMSk2A==\", not \"N7UdGUp1E+RbVvZSTy1R8g==\""
-  ],
-  "304-etag-update-response-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"APETIXMBQFUJYNC\", not \"AQGWMCSIYOEUKAQ\""
-  ],
-  "304-etag-update-response-Content-Security-Policy": [
-    "Assertion",
-    "Response 2 header Content-Security-Policy is \"default-src 'self'\", not \"default-src 'self' cdn.example.com\""
-  ],
-  "304-etag-update-response-Content-Type": [
-    "Assertion",
-    "Response 2 header Content-Type is \"text/plain\", not \"text/plain;charset=utf-8\""
-  ],
-  "304-etag-update-response-ETag": [
-    "Assertion",
-    "Response 2 header ETag is \"\"abcdef\"\", not \"\"ghijkl\"\""
-  ],
-  "304-etag-update-response-Expires": [
-    "Assertion",
-    "Response 2 header Expires is \"Fri, 01 Jan 2038 01:01:01 GMT\", not \"Mon, 11 Jan 2038 11:11:11 GMT\""
-  ],
-  "304-etag-update-response-Public-Key-Pins": [
-    "Assertion",
-    "Response 2 header Public-Key-Pins is \"AUOICWQKEYSMGAU\", not \"AVQLGBWRMHCXSNI\""
-  ],
-  "304-etag-update-response-Set-Cookie": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Set-Cookie2": [
-    "Assertion",
-    "Response 2 header Set-Cookie2 is \"a=b\", not \"a=c\""
-  ],
-  "304-etag-update-response-Test-Header": [
-    "Assertion",
-    "Response 2 header Test-Header is \"AAAAAAAAAAAAAAA\", not \"ABCDEFGHIJKLMNO\""
-  ],
-  "304-etag-update-response-X-Content-Foo": [
-    "Assertion",
-    "Response 2 header X-Content-Foo is \"AZYXWVUTSRQPONM\", not \"AAAAAAAAAAAAAAA\""
-  ],
-  "304-etag-update-response-X-Frame-Options": [
-    "Assertion",
-    "Response 2 header X-Frame-Options is \"deny\", not \"sameorigin\""
-  ],
-  "304-etag-update-response-X-Test-Header": [
-    "Assertion",
-    "Response 2 header X-Test-Header is \"ADGJMPSVYBEHKNQ\", not \"AEIMQUYCGKOSWAE\""
-  ],
-  "304-etag-update-response-X-XSS-Protection": [
-    "Assertion",
-    "Response 2 header X-XSS-Protection is \"1\", not \"1; mode=block\""
-  ],
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": true,
-  "age-parse-large": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-large-minus-one": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-larger": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-suffix-twoline": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": true,
-  "cc-resp-no-cache-revalidate": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-cache-revalidate-fresh": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-shared": true,
-  "ccreq-ma0": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-ma1": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-min-fresh-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": [
-    "Assertion",
-    "Response 1 status is 200, not 504"
-  ],
-  "conditional-304-etag": true,
-  "conditional-etag-forward": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-quoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-respond": true,
-  "conditional-etag-strong-respond-multiple-first": true,
-  "conditional-etag-strong-respond-multiple-last": true,
-  "conditional-etag-strong-respond-multiple-second": true,
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-quoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-unquoted": true,
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": true,
-  "conditional-etag-weak-respond": true,
-  "conditional-etag-weak-respond-backslash": true,
-  "conditional-etag-weak-respond-lowercase": true,
-  "conditional-etag-weak-respond-omit-slash": true,
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-no-lm": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-rfc850": true,
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-age-fast-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-age-slow-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": true,
-  "freshness-expires-invalid-2-digit-year": true,
-  "freshness-expires-invalid-aest": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": true,
-  "freshness-expires-invalid-multiple-lines": true,
-  "freshness-expires-invalid-multiple-spaces": true,
-  "freshness-expires-invalid-no-comma": true,
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-old-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-past": true,
-  "freshness-expires-present": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": true,
-  "freshness-expires-wrong-case-tz": true,
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-case-insenstive": true,
-  "freshness-max-age-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-decimal-five": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-decimal-zero": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer": true,
-  "freshness-max-age-s-maxage-shared-longer-multiple": true,
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": true,
-  "freshness-max-age-s-maxage-shared-shorter-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": true,
-  "freshness-max-age-space-before-equals": true,
-  "freshness-max-age-two-fresh-stale-sameline": true,
-  "freshness-max-age-two-fresh-stale-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sepline": true,
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 status is 410, not 200"
-  ],
-  "head-writethrough": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": true,
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1800": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-3600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-43200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-86400": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "invalidate-DELETE": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": true,
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": true,
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": true,
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": true,
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": [
-    "Assertion",
-    "Response 2 Age header not present."
-  ],
-  "other-age-update-expires": [
-    "Assertion",
-    "Response 2 header Age is 30, should be bigger than 32"
-  ],
-  "other-age-update-max-age": [
-    "Assertion",
-    "Response 2 header Age is 30, should be bigger than 32"
-  ],
-  "other-authorization": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "other-authorization-must-revalidate": true,
-  "other-authorization-public": true,
-  "other-authorization-smaxage": true,
-  "other-cookie": true,
-  "other-date-update": [
-    "Assertion",
-    "Response 2 header Date is \"Tue, 06 Apr 2021 07:02:04 GMT\", not \"Tue, 06 Apr 2021 07:02:01 GMT\""
-  ],
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-set-cookie": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-complete-reuse-partial": [
-    "Assertion",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-store-complete-reuse-partial-no-last": [
-    "Assertion",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-store-complete-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-store-partial-complete": [
-    "Setup",
-    "Response 2 status is 206, not 200"
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Setup",
-    "Request 1 header Range is \"undefined\", not \"bytes=-5\""
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response body is \"01234\", not \"234\""
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response body is \"01234\", not \"234\""
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response body is \"01234\", not \"4\""
-  ],
-  "partial-use-headers": [
-    "Setup",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-use-stored-headers": [
-    "Setup",
-    "Response 2 status is 200, not 206"
-  ],
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": true,
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": true,
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": true,
-  "stale-sie-close": true,
-  "stale-warning-become": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "stale-warning-stored": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": true,
-  "status-204-stale": true,
-  "status-299-fresh": true,
-  "status-299-stale": true,
-  "status-301-fresh": true,
-  "status-301-stale": true,
-  "status-302-fresh": true,
-  "status-302-stale": true,
-  "status-303-fresh": true,
-  "status-303-stale": true,
-  "status-307-fresh": true,
-  "status-307-stale": true,
-  "status-308-fresh": true,
-  "status-308-stale": true,
-  "status-400-fresh": true,
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": true,
-  "status-499-stale": true,
-  "status-500-fresh": true,
-  "status-500-stale": true,
-  "status-502-fresh": true,
-  "status-502-stale": true,
-  "status-503-fresh": true,
-  "status-503-stale": true,
-  "status-504-fresh": true,
-  "status-504-stale": true,
-  "status-599-fresh": true,
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "surrogate-append-capabilities": [
-    "Assertion",
-    "Request 1 Surrogate-Capability header not present."
-  ],
-  "surrogate-fresh-cc-nostore": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-extension": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-long-cc-max-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-me-target": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-space-after-equals": true,
-  "surrogate-max-age-space-before-equals": true,
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-remove-header": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": true,
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": true,
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-empty-star-lines": true,
-  "vary-syntax-foo-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star-star-lines": true
-}
diff --git a/docker/cache-tests/results/nuster.json b/docker/cache-tests/results/nuster.json
deleted file mode 100644
index 397add9..0000000
--- a/docker/cache-tests/results/nuster.json
+++ /dev/null
@@ -1,922 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Clear-Site-Data": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-Encoding": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-Foo": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-Length": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-Location": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-MD5": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-Range": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-Security-Policy": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Content-Type": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-ETag": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Expires": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Public-Key-Pins": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Set-Cookie": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Set-Cookie2": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Test-Header": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-X-Content-Foo": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-X-Frame-Options": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-X-Test-Header": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-X-XSS-Protection": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-lm-use-stored-Test-Header": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": true,
-  "age-parse-large": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-large-minus-one": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-larger": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-suffix-twoline": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": [
-    "Assertion",
-    "Request 3 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-no-cache-case-insensitive": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-no-cache-revalidate": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-cache-revalidate-fresh": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-private-shared": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-ma0": true,
-  "ccreq-ma1": true,
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-min-fresh-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": [
-    "Assertion",
-    "Response 1 status is 200, not 504"
-  ],
-  "conditional-304-etag": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-forward": true,
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-quoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-strong-generate": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "conditional-etag-strong-respond": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-strong-respond-multiple-first": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-strong-respond-multiple-last": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-strong-respond-multiple-second": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-unquoted-respond-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-unquoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-vary-headers": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "conditional-etag-weak-respond": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-weak-respond-backslash": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-weak-respond-lowercase": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-etag-weak-respond-omit-slash": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-no-lm": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-rfc850": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-age-fast-date": true,
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-far-future": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-future": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": true,
-  "freshness-expires-invalid-2-digit-year": true,
-  "freshness-expires-invalid-aest": true,
-  "freshness-expires-invalid-date": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-invalid-date-dashes": true,
-  "freshness-expires-invalid-multiple-lines": true,
-  "freshness-expires-invalid-multiple-spaces": true,
-  "freshness-expires-invalid-no-comma": true,
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": true,
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-month": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-tz": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-weekday": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-case-insenstive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-decimal-five": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-decimal-zero": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer-multiple": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-shorter-expires": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": true,
-  "freshness-max-age-space-before-equals": true,
-  "freshness-max-age-two-fresh-stale-sameline": true,
-  "freshness-max-age-two-fresh-stale-sepline": true,
-  "freshness-max-age-two-stale-fresh-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": true,
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": true,
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1800": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-3600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-43200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-86400": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": true,
-  "invalidate-DELETE-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-DELETE-location": true,
-  "invalidate-M-SEARCH": true,
-  "invalidate-M-SEARCH-cl": true,
-  "invalidate-M-SEARCH-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-M-SEARCH-location": true,
-  "invalidate-POST": true,
-  "invalidate-POST-cl": true,
-  "invalidate-POST-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-POST-location": true,
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": true,
-  "invalidate-PUT-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-PUT-location": true,
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-update-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-update-max-age": [
-    "Assertion",
-    "Response 2 header Age is 30, should be bigger than 32"
-  ],
-  "other-authorization": true,
-  "other-authorization-must-revalidate": true,
-  "other-authorization-public": true,
-  "other-authorization-smaxage": true,
-  "other-cookie": true,
-  "other-date-update": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": [
-    "Assertion",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-store-complete-reuse-partial-no-last": [
-    "Assertion",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-store-complete-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-store-partial-complete": [
-    "Setup",
-    "Response 2 status is 206, not 200"
-  ],
-  "partial-store-partial-reuse-partial": true,
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response body is \"01234\", not \"234\""
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response body is \"01234\", not \"234\""
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response body is \"01234\", not \"4\""
-  ],
-  "partial-use-headers": [
-    "Setup",
-    "Response 2 status is 200, not 206"
-  ],
-  "partial-use-stored-headers": [
-    "Setup",
-    "Response 2 status is 200, not 206"
-  ],
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": true,
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": true,
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-sie-close": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-warning-become": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "stale-warning-stored": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-must-understand": true,
-  "status-200-stale": true,
-  "status-203-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-203-stale": true,
-  "status-204-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-204-stale": true,
-  "status-299-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-299-stale": true,
-  "status-301-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-301-stale": true,
-  "status-302-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-302-stale": true,
-  "status-303-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-303-stale": true,
-  "status-307-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-307-stale": true,
-  "status-308-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-308-stale": true,
-  "status-400-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-400-stale": true,
-  "status-404-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-404-stale": true,
-  "status-410-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-410-stale": true,
-  "status-499-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-499-stale": true,
-  "status-500-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-500-stale": true,
-  "status-502-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-502-stale": true,
-  "status-503-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-503-stale": true,
-  "status-504-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-504-stale": true,
-  "status-599-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-599-must-understand": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "status-599-stale": true,
-  "surrogate-append-capabilities": [
-    "Assertion",
-    "Request 1 Surrogate-Capability header not present."
-  ],
-  "surrogate-fresh-cc-nostore": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": true,
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-extension": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-long-cc-max-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-me-target": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-space-after-equals": true,
-  "surrogate-max-age-space-before-equals": true,
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-remove-header": true,
-  "vary-2-match": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-3-no-match": true,
-  "vary-3-omit": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-3-order": true,
-  "vary-cache-key": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-invalidate": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "vary-match": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-no-match": true,
-  "vary-normalise-combine": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": true,
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
diff --git a/docker/cache-tests/results/safari.json b/docker/cache-tests/results/safari.json
deleted file mode 100644
index 7f3180e..0000000
--- a/docker/cache-tests/results/safari.json
+++ /dev/null
@@ -1,614 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": true,
-  "304-etag-update-response-Content-Encoding": [
-    "Assertion",
-    "Response 2 header Content-Encoding is \"ARIZQHYPGXOFWNE\", not \"ASKCUMEWOGYQIAS\""
-  ],
-  "304-etag-update-response-Content-Foo": [
-    "Assertion",
-    "Response 2 header Content-Foo is \"AWSOKGCYUQMIEAW\", not \"AXUROLIFCZWTQNK\""
-  ],
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": [
-    "Assertion",
-    "Response 2 header Content-Location is \"/foo\", not \"/bar\""
-  ],
-  "304-etag-update-response-Content-MD5": [
-    "Assertion",
-    "Response 2 header Content-MD5 is \"rL0Y20zC+Fzt72VPzMSk2A==\", not \"N7UdGUp1E+RbVvZSTy1R8g==\""
-  ],
-  "304-etag-update-response-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"APETIXMBQFUJYNC\", not \"AQGWMCSIYOEUKAQ\""
-  ],
-  "304-etag-update-response-Content-Security-Policy": [
-    "Assertion",
-    "Response 2 header Content-Security-Policy is \"default-src 'self'\", not \"default-src 'self' cdn.example.com\""
-  ],
-  "304-etag-update-response-Content-Type": [
-    "Assertion",
-    "Response 2 header Content-Type is \"text/plain\", not \"text/plain;charset=utf-8\""
-  ],
-  "304-etag-update-response-ETag": [
-    "Assertion",
-    "Response 2 header ETag is \"\"abcdef\"\", not \"\"ghijkl\"\""
-  ],
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Set-Cookie2": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": [
-    "Assertion",
-    "Response 2 header X-Content-Foo is \"AZYXWVUTSRQPONM\", not \"AAAAAAAAAAAAAAA\""
-  ],
-  "304-etag-update-response-X-Frame-Options": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-suffix-twoline": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-immutable-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "cc-resp-immutable-stale": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": true,
-  "cc-resp-no-cache-revalidate": true,
-  "cc-resp-no-cache-revalidate-fresh": true,
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-private": true,
-  "ccreq-ma0": true,
-  "ccreq-ma1": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": true,
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-min-fresh-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache": true,
-  "ccreq-no-cache-etag": true,
-  "ccreq-no-cache-lm": true,
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": [
-    "TypeError",
-    "can’t load from network"
-  ],
-  "conditional-etag-forward": true,
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": true,
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": true,
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-2-digit-year": true,
-  "freshness-expires-invalid-aest": true,
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-lines": true,
-  "freshness-expires-invalid-multiple-spaces": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-no-comma": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-month": true,
-  "freshness-expires-wrong-case-tz": true,
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": true,
-  "freshness-max-age-date": true,
-  "freshness-max-age-decimal-five": true,
-  "freshness-max-age-decimal-zero": true,
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": true,
-  "freshness-max-age-s-maxage-private": true,
-  "freshness-max-age-s-maxage-private-multiple": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sameline": true,
-  "freshness-max-age-two-fresh-stale-sepline": true,
-  "freshness-max-age-two-stale-fresh-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-none": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "headers-store-Set-Cookie2": [
-    "Assertion",
-    "Response 2 header Set-Cookie2 is \"null\", not \"a=c\""
-  ],
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": true,
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": true,
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": true,
-  "heuristic-204-cached": true,
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": true,
-  "heuristic-405-cached": true,
-  "heuristic-410-cached": true,
-  "heuristic-414-cached": true,
-  "heuristic-501-cached": true,
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": true,
-  "heuristic-delta-1800": true,
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": true,
-  "heuristic-delta-3600": true,
-  "heuristic-delta-43200": true,
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": true,
-  "heuristic-delta-600": true,
-  "heuristic-delta-86400": true,
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": true,
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": true,
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-update-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-update-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-cookie": true,
-  "other-date-update": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": true,
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-complete-reuse-partial-no-last": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-complete-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": true,
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-stored-headers": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-close-must-revalidate": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-close-no-cache": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-close-proxy-revalidate": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-close-s-maxage=2": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-sie-503": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-sie-close": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-warning-become": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "stale-warning-stored": [
-    "TypeError",
-    "The network connection was lost."
-  ],
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": true,
-  "status-204-stale": true,
-  "status-299-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-299-stale": true,
-  "status-400-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-499-stale": true,
-  "status-500-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-500-stale": true,
-  "status-502-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-502-stale": true,
-  "status-503-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-503-stale": true,
-  "status-504-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-504-stale": true,
-  "status-599-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": true,
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": true,
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
\ No newline at end of file
diff --git a/docker/cache-tests/results/squid.json b/docker/cache-tests/results/squid.json
deleted file mode 100644
index b56939b..0000000
--- a/docker/cache-tests/results/squid.json
+++ /dev/null
@@ -1,652 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": true,
-  "304-etag-update-response-Content-Encoding": true,
-  "304-etag-update-response-Content-Foo": true,
-  "304-etag-update-response-Content-Length": [
-    "Assertion",
-    "Response 2 header Content-Length is \"10\", not \"36\""
-  ],
-  "304-etag-update-response-Content-Location": true,
-  "304-etag-update-response-Content-MD5": true,
-  "304-etag-update-response-Content-Range": true,
-  "304-etag-update-response-Content-Security-Policy": true,
-  "304-etag-update-response-Content-Type": true,
-  "304-etag-update-response-ETag": true,
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Set-Cookie2": true,
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": true,
-  "304-etag-update-response-X-Frame-Options": true,
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": true,
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "age-parse-large": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-large-minus-one": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-larger": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": true,
-  "age-parse-parameter": true,
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": true,
-  "age-parse-suffix-twoline": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "cc-resp-no-cache-revalidate": true,
-  "cc-resp-no-cache-revalidate-fresh": true,
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-shared": true,
-  "ccreq-ma0": true,
-  "ccreq-ma1": true,
-  "ccreq-magreaterage": true,
-  "ccreq-max-stale": true,
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-min-fresh-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache": true,
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": true,
-  "conditional-304-etag": [
-    "Assertion",
-    "Response 2 header ETag is \"null\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-forward": true,
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": true,
-  "conditional-etag-quoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "request 2 doesn't have if-none-match header"
-  ],
-  "conditional-etag-strong-respond": true,
-  "conditional-etag-strong-respond-multiple-first": true,
-  "conditional-etag-strong-respond-multiple-last": true,
-  "conditional-etag-strong-respond-multiple-second": true,
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-quoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": [
-    "Assertion",
-    "request 2 doesn't have if-none-match header"
-  ],
-  "conditional-etag-weak-respond": true,
-  "conditional-etag-weak-respond-backslash": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-weak-respond-lowercase": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-weak-respond-omit-slash": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": true,
-  "conditional-lm-fresh-no-lm": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-rfc850": true,
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": true,
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": true,
-  "freshness-expires-invalid-2-digit-year": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-aest": true,
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-lines": true,
-  "freshness-expires-invalid-multiple-spaces": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-no-comma": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": true,
-  "freshness-expires-old-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": true,
-  "freshness-expires-wrong-case-tz": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": true,
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-date": true,
-  "freshness-max-age-decimal-five": true,
-  "freshness-max-age-decimal-zero": true,
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer": true,
-  "freshness-max-age-s-maxage-shared-longer-multiple": true,
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": true,
-  "freshness-max-age-s-maxage-shared-shorter-expires": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": true,
-  "freshness-max-age-two-fresh-stale-sameline": true,
-  "freshness-max-age-two-fresh-stale-sepline": true,
-  "freshness-max-age-two-stale-fresh-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Connection": true,
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": [
-    "Setup",
-    "Response 1 status is 502, not 200"
-  ],
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": true,
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": true,
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": true,
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": true,
-  "heuristic-delta-1800": true,
-  "heuristic-delta-30": true,
-  "heuristic-delta-300": true,
-  "heuristic-delta-3600": true,
-  "heuristic-delta-43200": true,
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": true,
-  "heuristic-delta-600": true,
-  "heuristic-delta-86400": true,
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": true,
-  "invalidate-DELETE-failed": true,
-  "invalidate-DELETE-location": true,
-  "invalidate-M-SEARCH": true,
-  "invalidate-M-SEARCH-cl": true,
-  "invalidate-M-SEARCH-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-M-SEARCH-location": true,
-  "invalidate-POST": true,
-  "invalidate-POST-cl": true,
-  "invalidate-POST-failed": true,
-  "invalidate-POST-location": true,
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": true,
-  "invalidate-PUT-failed": true,
-  "invalidate-PUT-location": true,
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": true,
-  "other-age-update-expires": true,
-  "other-age-update-max-age": true,
-  "other-authorization": [
-    "Setup",
-    "Request 1 header Authorization is \"undefined\", not \"FOO\""
-  ],
-  "other-authorization-must-revalidate": [
-    "Setup",
-    "Request 1 header Authorization is \"undefined\", not \"FOO\""
-  ],
-  "other-authorization-public": [
-    "Setup",
-    "Request 1 header Authorization is \"undefined\", not \"FOO\""
-  ],
-  "other-authorization-smaxage": [
-    "Setup",
-    "Request 1 header Authorization is \"undefined\", not \"FOO\""
-  ],
-  "other-cookie": true,
-  "other-date-update": true,
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": true,
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": true,
-  "partial-store-complete-reuse-partial-no-last": true,
-  "partial-store-complete-reuse-partial-suffix": true,
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": true,
-  "partial-use-stored-headers": true,
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": true,
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": true,
-  "stale-close": true,
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": true,
-  "stale-sie-close": true,
-  "stale-warning-become": true,
-  "stale-warning-stored": true,
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-204-stale": true,
-  "status-299-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-299-stale": true,
-  "status-301-fresh": true,
-  "status-301-stale": true,
-  "status-302-fresh": true,
-  "status-302-stale": true,
-  "status-303-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-303-stale": true,
-  "status-307-fresh": true,
-  "status-307-stale": true,
-  "status-308-fresh": true,
-  "status-308-stale": true,
-  "status-400-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-400-stale": true,
-  "status-404-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-499-stale": true,
-  "status-500-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-500-stale": true,
-  "status-502-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-502-stale": true,
-  "status-503-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-503-stale": true,
-  "status-504-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-504-stale": true,
-  "status-599-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "surrogate-append-capabilities": true,
-  "surrogate-fresh-cc-nostore": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": true,
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-extension": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-long-cc-max-age": true,
-  "surrogate-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-me-target": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-space-after-equals": true,
-  "surrogate-max-age-space-before-equals": true,
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": true,
-  "surrogate-remove-header": [
-    "Assertion",
-    "Response 1 header Surrogate-Control is \"null\", not \"foo\""
-  ],
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": true,
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": true,
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": true,
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
diff --git a/docker/cache-tests/results/trafficserver.json b/docker/cache-tests/results/trafficserver.json
deleted file mode 100644
index edd165e..0000000
--- a/docker/cache-tests/results/trafficserver.json
+++ /dev/null
@@ -1,670 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": true,
-  "304-etag-update-response-Content-Encoding": true,
-  "304-etag-update-response-Content-Foo": true,
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": true,
-  "304-etag-update-response-Content-MD5": true,
-  "304-etag-update-response-Content-Range": true,
-  "304-etag-update-response-Content-Security-Policy": true,
-  "304-etag-update-response-Content-Type": [
-    "Assertion",
-    "Response 2 header Content-Type is \"text/plain\", not \"text/plain;charset=utf-8\""
-  ],
-  "304-etag-update-response-ETag": true,
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "304-etag-update-response-Set-Cookie2": true,
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": true,
-  "304-etag-update-response-X-Frame-Options": true,
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": true,
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": true,
-  "age-parse-parameter": true,
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": true,
-  "age-parse-suffix-twoline": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": true,
-  "cc-resp-no-cache-revalidate": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-cache-revalidate-fresh": true,
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-shared": true,
-  "ccreq-ma0": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-ma1": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": true,
-  "ccreq-max-stale-age": true,
-  "ccreq-min-fresh": true,
-  "ccreq-min-fresh-age": true,
-  "ccreq-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": true,
-  "conditional-304-etag": true,
-  "conditional-etag-forward": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": true,
-  "conditional-etag-quoted-respond-unquoted": true,
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-respond": true,
-  "conditional-etag-strong-respond-multiple-first": true,
-  "conditional-etag-strong-respond-multiple-last": true,
-  "conditional-etag-strong-respond-multiple-second": true,
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-quoted": true,
-  "conditional-etag-unquoted-respond-unquoted": true,
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "conditional-etag-weak-respond": true,
-  "conditional-etag-weak-respond-backslash": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-weak-respond-lowercase": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-weak-respond-omit-slash": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": true,
-  "conditional-lm-fresh-no-lm": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-rfc850": true,
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": true,
-  "freshness-expires-age-fast-date": true,
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": true,
-  "freshness-expires-far-future": true,
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-2-digit-year": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-aest": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-multiple-spaces": true,
-  "freshness-expires-invalid-no-comma": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-tz": true,
-  "freshness-expires-wrong-case-weekday": true,
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": true,
-  "freshness-max-age-a100": true,
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": true,
-  "freshness-max-age-date": true,
-  "freshness-max-age-decimal-five": true,
-  "freshness-max-age-decimal-zero": true,
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": true,
-  "freshness-max-age-s-maxage-shared-longer": true,
-  "freshness-max-age-s-maxage-shared-longer-multiple": true,
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": true,
-  "freshness-max-age-s-maxage-shared-shorter-expires": true,
-  "freshness-max-age-single-quoted": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sameline": true,
-  "freshness-max-age-two-stale-fresh-sepline": true,
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 does not come from cache"
-  ],
-  "head-writethrough": true,
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Connection": [
-    "Assertion",
-    "Response 2 includes unexpected header a: \"1\""
-  ],
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": true,
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Assertion",
-    "Response 2 header Set-Cookie is \"null\", not \"a=c\""
-  ],
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": [
-    "FetchError",
-    "request to http://localhost:8003/test/78db4995-b2bf-4481-b433-c3f3ff310777 failed, reason: Parse Error: Content-Length can't be present with Transfer-Encoding"
-  ],
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": true,
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": true,
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": true,
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1800": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-3600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-43200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-86400": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "invalidate-DELETE": true,
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": true,
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": true,
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": true,
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": [
-    "Assertion",
-    "Response 3 does not come from cache"
-  ],
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": true,
-  "other-age-update-expires": true,
-  "other-age-update-max-age": true,
-  "other-authorization": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "other-authorization-must-revalidate": true,
-  "other-authorization-public": true,
-  "other-authorization-smaxage": true,
-  "other-cookie": true,
-  "other-date-update": true,
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-set-cookie": true,
-  "partial-store-complete-reuse-partial": true,
-  "partial-store-complete-reuse-partial-no-last": true,
-  "partial-store-complete-reuse-partial-suffix": true,
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": true,
-  "partial-use-stored-headers": true,
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": true,
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": true,
-  "stale-close": true,
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": true,
-  "stale-sie-close": true,
-  "stale-warning-become": true,
-  "stale-warning-stored": true,
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-204-stale": true,
-  "status-299-fresh": true,
-  "status-299-stale": true,
-  "status-301-fresh": true,
-  "status-301-stale": true,
-  "status-302-fresh": true,
-  "status-302-stale": true,
-  "status-303-fresh": true,
-  "status-303-stale": true,
-  "status-307-fresh": true,
-  "status-307-stale": true,
-  "status-308-fresh": true,
-  "status-308-stale": true,
-  "status-400-fresh": true,
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": true,
-  "status-499-stale": true,
-  "status-500-fresh": true,
-  "status-500-stale": true,
-  "status-502-fresh": true,
-  "status-502-stale": true,
-  "status-503-fresh": true,
-  "status-503-stale": true,
-  "status-504-fresh": true,
-  "status-504-stale": true,
-  "status-599-fresh": true,
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "surrogate-append-capabilities": [
-    "Assertion",
-    "Request 1 Surrogate-Capability header not present."
-  ],
-  "surrogate-fresh-cc-nostore": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-extension": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-long-cc-max-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-me-target": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-space-after-equals": true,
-  "surrogate-max-age-space-before-equals": true,
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-remove-header": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": true,
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": true,
-  "vary-normalise-lang-case": true,
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": true,
-  "vary-normalise-space": true,
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": true,
-  "vary-syntax-empty-star-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-foo-star": true,
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": true,
-  "vary-syntax-star-star": true,
-  "vary-syntax-star-star-lines": true
-}
diff --git a/docker/cache-tests/results/varnish.json b/docker/cache-tests/results/varnish.json
deleted file mode 100644
index 8b8458a..0000000
--- a/docker/cache-tests/results/varnish.json
+++ /dev/null
@@ -1,790 +0,0 @@
-{
-  "304-etag-update-response-Cache-Control": true,
-  "304-etag-update-response-Clear-Site-Data": true,
-  "304-etag-update-response-Content-Encoding": [
-    "Assertion",
-    "Response 2 header Content-Encoding is \"ARIZQHYPGXOFWNE\", not \"ASKCUMEWOGYQIAS\""
-  ],
-  "304-etag-update-response-Content-Foo": true,
-  "304-etag-update-response-Content-Length": true,
-  "304-etag-update-response-Content-Location": true,
-  "304-etag-update-response-Content-MD5": true,
-  "304-etag-update-response-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"null\", not \"AQGWMCSIYOEUKAQ\""
-  ],
-  "304-etag-update-response-Content-Security-Policy": true,
-  "304-etag-update-response-Content-Type": true,
-  "304-etag-update-response-ETag": true,
-  "304-etag-update-response-Expires": true,
-  "304-etag-update-response-Public-Key-Pins": true,
-  "304-etag-update-response-Set-Cookie": [
-    "Setup",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "304-etag-update-response-Set-Cookie2": true,
-  "304-etag-update-response-Test-Header": true,
-  "304-etag-update-response-X-Content-Foo": true,
-  "304-etag-update-response-X-Frame-Options": true,
-  "304-etag-update-response-X-Test-Header": true,
-  "304-etag-update-response-X-XSS-Protection": true,
-  "304-lm-use-stored-Test-Header": true,
-  "age-parse-dup-0": true,
-  "age-parse-dup-0-twoline": true,
-  "age-parse-dup-old": true,
-  "age-parse-float": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "age-parse-large": true,
-  "age-parse-large-minus-one": true,
-  "age-parse-larger": true,
-  "age-parse-negative": true,
-  "age-parse-nonnumeric": true,
-  "age-parse-numeric-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-parameter": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "age-parse-prefix": true,
-  "age-parse-prefix-twoline": true,
-  "age-parse-suffix": true,
-  "age-parse-suffix-twoline": true,
-  "cc-resp-must-revalidate-fresh": true,
-  "cc-resp-must-revalidate-stale": true,
-  "cc-resp-no-cache": true,
-  "cc-resp-no-cache-case-insensitive": true,
-  "cc-resp-no-cache-revalidate": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-cache-revalidate-fresh": [
-    "Assertion",
-    "Request 2 should have been conditional, but it was not."
-  ],
-  "cc-resp-no-store": true,
-  "cc-resp-no-store-case-insensitive": true,
-  "cc-resp-no-store-fresh": true,
-  "cc-resp-private-shared": true,
-  "ccreq-ma0": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-ma1": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-magreaterage": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-max-stale": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-max-stale-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "ccreq-min-fresh": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-min-fresh-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-no-cache-etag": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-cache-lm": [
-    "Assertion",
-    "request 2 wasn't sent to server"
-  ],
-  "ccreq-no-store": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "ccreq-oic": [
-    "Assertion",
-    "Response 1 status is 200, not 504"
-  ],
-  "conditional-304-etag": true,
-  "conditional-etag-forward": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-forward-unquoted": [
-    "Assertion",
-    "Request 1 header If-None-Match is \"undefined\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-precedence": true,
-  "conditional-etag-quoted-respond-unquoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-strong-generate": true,
-  "conditional-etag-strong-generate-unquoted": [
-    "Assertion",
-    "Request 2 header If-None-Match is \"abcdef\", not \"\"abcdef\"\""
-  ],
-  "conditional-etag-strong-respond": true,
-  "conditional-etag-strong-respond-multiple-first": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-strong-respond-multiple-last": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-strong-respond-multiple-second": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-strong-respond-obs-text": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-quoted": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-etag-unquoted-respond-unquoted": true,
-  "conditional-etag-vary-headers": true,
-  "conditional-etag-vary-headers-mismatch": true,
-  "conditional-etag-weak-generate-weak": true,
-  "conditional-etag-weak-respond": true,
-  "conditional-etag-weak-respond-backslash": true,
-  "conditional-etag-weak-respond-lowercase": true,
-  "conditional-etag-weak-respond-omit-slash": true,
-  "conditional-lm-fresh": true,
-  "conditional-lm-fresh-earlier": true,
-  "conditional-lm-fresh-no-lm": [
-    "Assertion",
-    "Response 2 status is 200, not 304"
-  ],
-  "conditional-lm-fresh-rfc850": true,
-  "conditional-lm-stale": true,
-  "freshness-expires-32bit": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-age-fast-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-expires-age-slow-date": true,
-  "freshness-expires-ansi-c": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-far-future": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-future": true,
-  "freshness-expires-invalid": true,
-  "freshness-expires-invalid-1-digit-hour": true,
-  "freshness-expires-invalid-2-digit-year": true,
-  "freshness-expires-invalid-aest": true,
-  "freshness-expires-invalid-date": true,
-  "freshness-expires-invalid-date-dashes": true,
-  "freshness-expires-invalid-multiple-lines": true,
-  "freshness-expires-invalid-multiple-spaces": true,
-  "freshness-expires-invalid-no-comma": true,
-  "freshness-expires-invalid-time-periods": true,
-  "freshness-expires-invalid-utc": true,
-  "freshness-expires-old-date": true,
-  "freshness-expires-past": true,
-  "freshness-expires-present": true,
-  "freshness-expires-rfc850": true,
-  "freshness-expires-wrong-case-month": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-tz": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-expires-wrong-case-weekday": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age": true,
-  "freshness-max-age-0": true,
-  "freshness-max-age-0-expires": true,
-  "freshness-max-age-100a": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-a100": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-age": true,
-  "freshness-max-age-case-insenstive": true,
-  "freshness-max-age-date": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-decimal-five": true,
-  "freshness-max-age-decimal-zero": true,
-  "freshness-max-age-expires": true,
-  "freshness-max-age-expires-invalid": true,
-  "freshness-max-age-extension": true,
-  "freshness-max-age-ignore-quoted": true,
-  "freshness-max-age-ignore-quoted-rev": true,
-  "freshness-max-age-leading-zero": true,
-  "freshness-max-age-max": true,
-  "freshness-max-age-max-minus-1": true,
-  "freshness-max-age-max-plus": true,
-  "freshness-max-age-max-plus-1": true,
-  "freshness-max-age-negative": true,
-  "freshness-max-age-quoted": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-s-maxage-shared-longer": true,
-  "freshness-max-age-s-maxage-shared-longer-multiple": true,
-  "freshness-max-age-s-maxage-shared-longer-reversed": true,
-  "freshness-max-age-s-maxage-shared-shorter": true,
-  "freshness-max-age-s-maxage-shared-shorter-expires": true,
-  "freshness-max-age-single-quoted": true,
-  "freshness-max-age-space-after-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-space-before-equals": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "freshness-max-age-two-fresh-stale-sameline": true,
-  "freshness-max-age-two-fresh-stale-sepline": true,
-  "freshness-max-age-two-stale-fresh-sameline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-max-age-two-stale-fresh-sepline": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "freshness-none": true,
-  "freshness-s-maxage-shared": true,
-  "head-200-freshness-update": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "head-200-retain": [
-    "Assertion",
-    "Response 2 header Template-A is \"null\", not \"1\""
-  ],
-  "head-200-update": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "head-410-update": [
-    "Setup",
-    "Response 3 status is 410, not 200"
-  ],
-  "head-writethrough": [
-    "Assertion",
-    "Request 2 had method GET, not HEAD"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Cache-Control-no-cache-single": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-omit-headers-listed-in-Connection": true,
-  "headers-store-Cache-Control": true,
-  "headers-store-Clear-Site-Data": true,
-  "headers-store-Connection": true,
-  "headers-store-Content-Encoding": true,
-  "headers-store-Content-Foo": true,
-  "headers-store-Content-Length": true,
-  "headers-store-Content-Location": true,
-  "headers-store-Content-MD5": true,
-  "headers-store-Content-Range": [
-    "Assertion",
-    "Response 2 header Content-Range is \"null\", not \"ANANANANANANANA\""
-  ],
-  "headers-store-Content-Security-Policy": true,
-  "headers-store-Content-Type": true,
-  "headers-store-ETag": true,
-  "headers-store-Expires": true,
-  "headers-store-Keep-Alive": true,
-  "headers-store-Proxy-Authenticate": true,
-  "headers-store-Proxy-Authentication-Info": true,
-  "headers-store-Proxy-Authorization": true,
-  "headers-store-Proxy-Connection": true,
-  "headers-store-Public-Key-Pins": true,
-  "headers-store-Set-Cookie": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "headers-store-Set-Cookie2": true,
-  "headers-store-TE": true,
-  "headers-store-Test-Header": true,
-  "headers-store-Transfer-Encoding": [
-    "Setup",
-    "Response 1 status is 503, not 200"
-  ],
-  "headers-store-Upgrade": true,
-  "headers-store-X-Content-Foo": true,
-  "headers-store-X-Frame-Options": true,
-  "headers-store-X-Test-Header": true,
-  "headers-store-X-XSS-Protection": true,
-  "heuristic-200-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-201-not_cached": true,
-  "heuristic-202-not_cached": true,
-  "heuristic-203-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-204-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-403-not_cached": true,
-  "heuristic-404-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-405-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-410-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-414-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-501-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-502-not_cached": true,
-  "heuristic-503-not_cached": true,
-  "heuristic-504-not_cached": true,
-  "heuristic-599-cached": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-599-not_cached": true,
-  "heuristic-delta-10": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-1800": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-30": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-300": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-3600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-43200": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-5": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-60": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-600": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "heuristic-delta-86400": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "invalidate-DELETE": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-DELETE-failed": true,
-  "invalidate-DELETE-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-M-SEARCH-failed": true,
-  "invalidate-M-SEARCH-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-POST-failed": true,
-  "invalidate-POST-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-cl": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "invalidate-PUT-failed": true,
-  "invalidate-PUT-location": [
-    "Assertion",
-    "Response 3 comes from cache"
-  ],
-  "method-POST": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-age-gen": true,
-  "other-age-update-expires": true,
-  "other-age-update-max-age": true,
-  "other-authorization": true,
-  "other-authorization-must-revalidate": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-authorization-public": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-authorization-smaxage": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-cookie": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-date-update": true,
-  "other-fresh-content-disposition-attachment": true,
-  "other-heuristic-content-disposition-attachment": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "other-set-cookie": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-complete-reuse-partial": true,
-  "partial-store-complete-reuse-partial-no-last": true,
-  "partial-store-complete-reuse-partial-suffix": true,
-  "partial-store-partial-complete": [
-    "Assertion",
-    "Request 2 header range is \"undefined\", not \"bytes=5-\""
-  ],
-  "partial-store-partial-reuse-partial": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-absent": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-byterange": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-store-partial-reuse-partial-suffix": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "partial-use-headers": true,
-  "partial-use-stored-headers": true,
-  "pragma-request-extension": true,
-  "pragma-request-no-cache": true,
-  "pragma-response-extension": true,
-  "pragma-response-no-cache": true,
-  "pragma-response-no-cache-heuristic": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "query-args-different": true,
-  "query-args-same": true,
-  "stale-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-close-must-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-no-cache": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-proxy-revalidate": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-close-s-maxage=2": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "stale-sie-503": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-sie-close": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "stale-warning-become": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "stale-warning-stored": [
-    "Setup",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-fresh": true,
-  "status-200-must-understand": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-200-stale": true,
-  "status-203-fresh": true,
-  "status-203-stale": true,
-  "status-204-fresh": true,
-  "status-204-stale": true,
-  "status-299-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-299-stale": true,
-  "status-301-fresh": true,
-  "status-301-stale": true,
-  "status-302-fresh": true,
-  "status-302-stale": true,
-  "status-303-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-303-stale": true,
-  "status-307-fresh": true,
-  "status-307-stale": true,
-  "status-308-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-308-stale": true,
-  "status-400-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-400-stale": true,
-  "status-404-fresh": true,
-  "status-404-stale": true,
-  "status-410-fresh": true,
-  "status-410-stale": true,
-  "status-499-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-499-stale": true,
-  "status-500-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-500-stale": true,
-  "status-502-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-502-stale": true,
-  "status-503-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-503-stale": true,
-  "status-504-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-504-stale": true,
-  "status-599-fresh": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "status-599-must-understand": true,
-  "status-599-stale": true,
-  "surrogate-append-capabilities": [
-    "Assertion",
-    "Request 1 Surrogate-Capability header not present."
-  ],
-  "surrogate-fresh-cc-nostore": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-0": true,
-  "surrogate-max-age-0-expires": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-age": true,
-  "surrogate-max-age-case-insensitive": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-cc-max-age-invalid-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-expires": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-extension": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-long-cc-max-age": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "surrogate-max-age-max": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-max-plus": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-me-target": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-other-target": true,
-  "surrogate-max-age-short-cc-max-age": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "surrogate-max-age-space-after-equals": true,
-  "surrogate-max-age-space-before-equals": true,
-  "surrogate-no-store": true,
-  "surrogate-no-store-cc-fresh": true,
-  "surrogate-remove-header": true,
-  "vary-2-match": true,
-  "vary-2-match-omit": true,
-  "vary-2-no-match": true,
-  "vary-3-match": true,
-  "vary-3-no-match": true,
-  "vary-3-omit": true,
-  "vary-3-order": true,
-  "vary-cache-key": true,
-  "vary-invalidate": true,
-  "vary-match": true,
-  "vary-no-match": true,
-  "vary-normalise-combine": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-case": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-order": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-select": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-lang-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-normalise-space": [
-    "Assertion",
-    "Response 2 does not come from cache"
-  ],
-  "vary-omit": true,
-  "vary-omit-stored": true,
-  "vary-star": true,
-  "vary-syntax-empty-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-empty-star-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-foo-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star": true,
-  "vary-syntax-star-foo": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star-star": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ],
-  "vary-syntax-star-star-lines": [
-    "Assertion",
-    "Response 2 comes from cache"
-  ]
-}
diff --git a/jenkins/branch/cache-tests.pipeline b/jenkins/branch/cache-tests.pipeline
index 3b0554c..524ef91 100644
--- a/jenkins/branch/cache-tests.pipeline
+++ b/jenkins/branch/cache-tests.pipeline
@@ -1,34 +1,40 @@
 pipeline {
-	agent {
-		docker {
-			registryUrl 'https://controller.trafficserver.org/'
-			image 'controller.trafficserver.org/ats/cache-tests-build:latest'
-			args '--user root --init --cap-add=SYS_PTRACE --network=host -v ${HOME}/ccache:/tmp/ccache:rw'
-			label 'branch'
-		}
-	}
+	agent none
+
 	environment {
 		CCACHE_DIR = "/tmp/ccache"
 	}
 
 	stages {
-		stage('Initialization') {
+		stage('Test') {
+
+			agent {
+				docker {
+					registryUrl 'https://controller.trafficserver.org/'
+					//image 'controller.trafficserver.org/ats/debian:11'
+					image 'controller.trafficserver.org/ats/cache-tests'
+					args '--user root --init --cap-add=SYS_PTRACE --network=host -v ${HOME}/ccache:/tmp/ccache:rw'
+					label 'branch'
+				}
+			}
+
 			steps {
 				script {
+					if (! env.GITHUB_BRANCH) {
+						def bparts = env.JOB_NAME.split('/')
+						if (1 != bparts.length) {
+							error("Invalid branch name from ${JOB_NAME}")
+						}
+						env.GITHUB_BRANCH = bparts[0]
+					}
 					currentBuild.displayName = "#${BUILD_NUMBER} ${GITHUB_BRANCH}"
 					if (env.SHA1) {
 						currentBuild.description = env.SHA1
 					}
+					sh 'printenv'
 				}
-			}
-		}
 
-		stage('Clone') {
-			steps {
-				dir('ci') {
-					git url: 'https://github.com/apache/trafficserver-ci',
-						branch: 'main'
-				}
+				echo "Checking out and building basic ATS"
 				dir('src') {
 					script {
 						String branch = env.SHA1
@@ -36,7 +42,7 @@ pipeline {
 							branch = '*/' + env.GITHUB_BRANCH
 						}
 
-            timeout(time: 1, unit: 'MINUTES') {
+						timeout(time: 1, unit: 'MINUTES') {
 							retry(3) {
 								checkout([$class: 'GitSCM',
 									branches: [[name: branch]],
@@ -45,50 +51,57 @@ pipeline {
 								])
 							}
 						}
+
+						sh '''
+							chmod -R o+r .
+							autoreconf -fiv
+							./configure --prefix=/opt/ats --enable-ccache
+							make -j4 install
+							echo 'map / https://jenkins.trafficserver.org/cache-tests/' >> \
+								/opt/ats/etc/trafficserver/remap.config
+						'''
 					}
 				}
 
-				echo 'Finished Cloning'
-			}
-		}
-		stage('Build') {
-			steps {
-				echo 'Starting build'
+				echo "Running npm test"
 				dir('src') {
-					sh '''
-					chmod -R o+r .
-					autoreconf -fiv
-					./configure --prefix=/opt/ats --enable-ccache
-					make -j4
-					make install
-                   			echo 'map / https://jenkins.trafficserver.org/cache-tests/' >> /opt/ats/etc/trafficserver/remap.config
-					'''
+					script {
+						sh '''
+							cd /cache-tests
+							mkdir -p ${WORKSPACE}/output
+							/opt/ats/bin/traffic_manager &
+							sleep 2
+							npm run --silent cli --base=http://localhost:8080/ > ${WORKSPACE}/output/ats-${GITHUB_BRANCH}.json
+							chmod 644 ${WORKSPACE}/output/ats-${GITHUB_BRANCH}.json
+							chown -R 1200:1200 ${WORKSPACE}/output
+						'''
+					}
+				}
+
+				echo "Stashing"
+				dir('output') {
+					stash includes: '*.json', name: "results"
 				}
 			}
 		}
 
-		stage('Cache-Tests') {
+		stage('Publish') {
+			agent { label 'controller' }
 			steps {
-				echo 'Starting Cache-Tests'
-				dir('src') {
+				echo "Installing"
+				script {
+					echo "Unstashing"
+					unstash 'results'
 					sh '''
-					cd /cache-tests
-                    			/opt/ats/bin/traffic_manager &
-					mkdir -p ${WORKSPACE}/output
-                    			sleep 2
-                    			npm run --silent cli --base=http://localhost:8080/ > ${WORKSPACE}/output/${GITHUB_BRANCH}.json
+						cp -avx ats-${GITHUB_BRANCH}.json /opt/cache-tests/cache-tests/results/
 					'''
 				}
 			}
-		}
-	}
-
-	post {
-		always {
-			archiveArtifacts artifacts: 'output/**/*', fingerprint: false, allowEmptyArchive: true
-		}
-		cleanup {
-			cleanWs()
+			post {
+				always {
+					cleanWs()
+				}
+			}
 		}
 	}
 }
diff --git a/jenkins/branch/coverage.pipeline b/jenkins/branch/coverage.pipeline
index 9d52a2c..55eced2 100644
--- a/jenkins/branch/coverage.pipeline
+++ b/jenkins/branch/coverage.pipeline
@@ -44,7 +44,7 @@ pipeline {
 							branch = '*/' + env.GITHUB_BRANCH
 						}
 
-            timeout(time: 1, unit: 'MINUTES') {
+						timeout(time: 1, unit: 'MINUTES') {
 							retry(3) {
 								checkout([$class: 'GitSCM',
 									branches: [[name: branch]],
diff --git a/jenkins/branch/docs.pipeline b/jenkins/branch/docs.pipeline
index 7efae8e..070af73 100644
--- a/jenkins/branch/docs.pipeline
+++ b/jenkins/branch/docs.pipeline
@@ -67,7 +67,7 @@ pipeline {
 					script {
 						if (env.PUBLISH_DOCS == "true") {
 							echo 'stashing docs'
-			  			stash includes: 'en/**,ja/**', name: "docs"
+							stash includes: 'en/**,ja/**', name: "docs"
 						}
 					}
 				}
diff --git a/jenkins/branch/in_tree.pipeline b/jenkins/branch/in_tree.pipeline
index 4b76e48..7ee1342 100644
--- a/jenkins/branch/in_tree.pipeline
+++ b/jenkins/branch/in_tree.pipeline
@@ -45,7 +45,7 @@ pipeline {
 							branch = '*/' + env.GITHUB_BRANCH
 						}
 
-            timeout(time: 1, unit: 'MINUTES') {
+						timeout(time: 1, unit: 'MINUTES') {
 							retry(3) {
 								checkout([$class: 'GitSCM',
 									branches: [[name: branch]],
diff --git a/jenkins/branch/os_build.pipeline b/jenkins/branch/os_build.pipeline
index d8f9ae8..fce93da 100644
--- a/jenkins/branch/os_build.pipeline
+++ b/jenkins/branch/os_build.pipeline
@@ -37,7 +37,7 @@ pipeline {
 							branch = '*/' + env.GITHUB_BRANCH
 						}
 
-            timeout(time: 1, unit: 'MINUTES') {
+						timeout(time: 1, unit: 'MINUTES') {
 							retry(3) {
 								checkout([$class: 'GitSCM',
 									branches: [[name: branch]],
diff --git a/jenkins/branch/rat.pipeline b/jenkins/branch/rat.pipeline
index cf3fcd3..dca8bb8 100644
--- a/jenkins/branch/rat.pipeline
+++ b/jenkins/branch/rat.pipeline
@@ -42,7 +42,7 @@ pipeline {
 							branch = '*/' + env.GITHUB_BRANCH
 						}
 
-            timeout(time: 1, unit: 'MINUTES') {
+						timeout(time: 1, unit: 'MINUTES') {
 							retry(3) {
 								checkout([$class: 'GitSCM',
 									branches: [[name: branch]],