rastrillo / fiesta Public

Raster the 1.0 photographs on one thread, so a pixel is painted the same way every time

Under load, the 1.0 photographs sometimes painted one antialiased
pixel one level apart on two loads of one page under one stylesheet:
the corner of api-tokens' callout, beside the reserved scrollbar
gutter, which failed the fleet at 8d58daa and c9473c4. Photographing
inside a viewport as tall as the page only moved the pixel to the
viewport's bottom edge and made it five times as frequent, so the
capture was not the cause; the raster was.

The 1.0 photographs' browsers (oneOhRig and parityRig) now launch with
harness.WithDeterministicRaster: one raster thread, no GPU and no GPU
rasterization, no partial raster, no LCD text, an sRGB colour profile.
Measured on docs-t1 with that leg (api-tokens'
just-created-the-secret-shown-once, 390px, left to right) photographed
old against new 200 times, a fresh browser every ten pairs, eight
gallery browser slices running alongside (load average up to 25 on
16 cores), twice: the default raster differed in 3 and then 1 pairs
of 200, always pixel 372,18 by one level; the deterministic raster in
0 and 0. The photographs take the same time as before.

So a leg is one pair again, at zero tolerance: the three-in-a-row
rule hid nothing the raster now produces, and an intermittent
difference is one more thing it could have hidden. The base [rst-ftok]
rule deleted still fails dropdown/menu-idiom in all four legs, by 13
and 53 levels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev de4107e88aef37d49e2a2571004c1b63eebea3ff parent 4c8fdef
3 files changed, +32 −29
  • check/oneoh_browser_test.go +9 −28
  • check/parity_browser_test.go +1 −1
  • internal/harness/rig.go +22 −0

CI failed — run details

CI log
=== gofmt ===
=== no-rastrillo ===
go test -run '^(TestFiestaNeverImportsRastrillo|TestThePublicPackagesLinkNoBrowser)$' -count=1 .
ok  	amadan.net/rastrillo/fiesta	0.207s
=== size ===
go test ./internal/build -run '^TestTheOneLinkIsUnder25KiBGzipped$' -count=1 -v
=== RUN   TestTheOneLinkIsUnder25KiBGzipped
    build_test.go:138: fiesta-plain.css: 152856 bytes, 22303 bytes gzipped (21.8 KiB of the 25.0 KiB limit)
    build_test.go:138: fiesta-signal.css: 152951 bytes, 22414 bytes gzipped (21.9 KiB of the 25.0 KiB limit)
    build_test.go:138: fiesta.css: 155770 bytes, 23018 bytes gzipped (22.5 KiB of the 25.0 KiB limit)
--- PASS: TestTheOneLinkIsUnder25KiBGzipped (0.02s)
PASS
ok  	amadan.net/rastrillo/fiesta/internal/build	0.024s
=== history ===
history: 15 commits; release tags: v1.0.0
=== suite ===
--- shard 0 of 48 ---
==> shard 0 of 48: make root
go build ./...
go vet ./...
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh root 'internal/gallery@3 cmd/fiesta@2 internal/www@2'
ok  	amadan.net/rastrillo/fiesta	4.146s
ok  	amadan.net/rastrillo/fiesta/check	8.285s
ok  	amadan.net/rastrillo/fiesta/example	0.281s
?   	amadan.net/rastrillo/fiesta/hack/seed/english	[no test files]
ok  	amadan.net/rastrillo/fiesta/internal/axe	0.240s
ok  	amadan.net/rastrillo/fiesta/internal/build	2.474s
ok  	amadan.net/rastrillo/fiesta/internal/codeview	0.003s
?   	amadan.net/rastrillo/fiesta/internal/harness	[no test files]
ok  	amadan.net/rastrillo/fiesta/internal/markup	0.005s
ok  	amadan.net/rastrillo/fiesta/internal/nodetest	0.514s
ok  	amadan.net/rastrillo/fiesta/internal/site	4.332s
ok  	amadan.net/rastrillo/fiesta/internal/tokens	0.051s
suite: root took 13s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m8.820000s 0m1.640000s
--- shard 1 of 48 ---
==> shard 1 of 48: make test.internal.gallery~1of3
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.gallery~1of3'
gotest: slice 1 of 3 of ./internal/gallery/ runs 35 of 105 test tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	66.307s
suite: test.internal.gallery~1of3 took 68s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m46.940000s 0m1.150000s
--- shard 2 of 48 ---
==> shard 2 of 48: make test.internal.gallery~2of3
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.gallery~2of3'
gotest: slice 2 of 3 of ./internal/gallery/ runs 35 of 105 test tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	64.815s
suite: test.internal.gallery~2of3 took 66s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m44.990000s 0m1.080000s
--- shard 3 of 48 ---
==> shard 3 of 48: make test.internal.gallery~3of3
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.gallery~3of3'
gotest: slice 3 of 3 of ./internal/gallery/ runs 35 of 105 test tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	60.779s
suite: test.internal.gallery~3of3 took 62s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m42.450000s 0m1.220000s
--- shard 4 of 48 ---
==> shard 4 of 48: make test.cmd.fiesta~1of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'cmd.fiesta~1of2'
gotest: slice 1 of 2 of ./cmd/fiesta/ runs 7 of 12 test tests
ok  	amadan.net/rastrillo/fiesta/cmd/fiesta	50.782s
suite: test.cmd.fiesta~1of2 took 52s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m31.610000s 0m1.950000s
--- shard 5 of 48 ---
==> shard 5 of 48: make test.cmd.fiesta~2of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'cmd.fiesta~2of2'
gotest: slice 2 of 2 of ./cmd/fiesta/ runs 5 of 12 test tests
ok  	amadan.net/rastrillo/fiesta/cmd/fiesta	52.789s
suite: test.cmd.fiesta~2of2 took 54s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m34.070000s 0m2.200000s
--- shard 6 of 48 ---
==> shard 6 of 48: make test.internal.www~1of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.www~1of2'
gotest: slice 1 of 2 of ./internal/www/ runs 11 of 25 test tests
ok  	amadan.net/rastrillo/fiesta/internal/www	62.055s
suite: test.internal.www~1of2 took 67s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m45.610000s 0m1.480000s
--- shard 7 of 48 ---
==> shard 7 of 48: make test.internal.www~2of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.www~2of2'
gotest: slice 2 of 2 of ./internal/www/ runs 14 of 25 test tests
ok  	amadan.net/rastrillo/fiesta/internal/www	60.418s
suite: test.internal.www~2of2 took 66s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m43.910000s 0m1.510000s
--- shard 8 of 48 ---
==> shard 8 of 48: make staticcheck
go run honnef.co/go/tools/cmd/staticcheck@v0.8.2 -tags browser ./...
suite: staticcheck took 11s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.220000s 0m0.900000s
--- shard 9 of 48 ---
==> shard 9 of 48: make govulncheck
go run golang.org/x/vuln/cmd/govulncheck@v1.8.0 ./...
=== Symbol Results ===

No vulnerabilities found.

Your code is affected by 0 vulnerabilities.
This scan also found 2 vulnerabilities in packages you import and 5
vulnerabilities in modules you require, but your code doesn't appear to call
these vulnerabilities.
Use '-show verbose' for more details.
suite: govulncheck took 8s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m3.100000s 0m0.370000s
--- shard 10 of 48 ---
==> shard 10 of 48: make gitleaks
go run github.com/zricethezav/gitleaks/v8@v8.30.1 git --no-banner --redact --log-opts='--full-history --diff-filter=tuxdb HEAD' .
1:30AM INF Unknown SCM platform. Use --platform to include links in findings. host=amadan.net
1:30AM INF 15 commits scanned.
1:30AM INF scanned ~8191951 bytes (8.19 MB) in 6.28s
1:30AM INF no leaks found
suite: gitleaks took 8s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m6.990000s 0m0.230000s
--- shard 11 of 48 ---
==> shard 11 of 48: make browser.internal.harness
./hack/gotest.sh browser 'internal.harness'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: ./internal/harness/ runs its 10 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/harness	5.293s
suite: browser.internal.harness took 11s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m1.980000s 0m1.320000s
--- shard 12 of 48 ---
==> shard 12 of 48: make browser.check~1of13
./hack/gotest.sh browser 'check~1of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 1 of 13 of ./check/ runs 16 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	89.211s
suite: browser.check~1of13 took 99s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m48.220000s 0m14.160000s
--- shard 13 of 48 ---
==> shard 13 of 48: make browser.check~2of13
./hack/gotest.sh browser 'check~2of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 2 of 13 of ./check/ runs 16 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	88.011s
suite: browser.check~2of13 took 98s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.650000s 0m11.650000s
--- shard 14 of 48 ---
==> shard 14 of 48: make browser.check~3of13
./hack/gotest.sh browser 'check~3of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 3 of 13 of ./check/ runs 15 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	86.539s
suite: browser.check~3of13 took 96s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m41.940000s 0m12.400000s
--- shard 15 of 48 ---
==> shard 15 of 48: make browser.check~4of13
./hack/gotest.sh browser 'check~4of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 4 of 13 of ./check/ runs 15 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	87.730s
suite: browser.check~4of13 took 97s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m53.760000s 0m16.620000s
--- shard 16 of 48 ---
==> shard 16 of 48: make browser.check~5of13
./hack/gotest.sh browser 'check~5of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 5 of 13 of ./check/ runs 17 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	77.128s
suite: browser.check~5of13 took 87s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m36.770000s 0m12.290000s
--- shard 17 of 48 ---
==> shard 17 of 48: make browser.check~6of13
./hack/gotest.sh browser 'check~6of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 6 of 13 of ./check/ runs 17 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	78.783s
suite: browser.check~6of13 took 89s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m44.410000s 0m15.760000s
--- shard 18 of 48 ---
==> shard 18 of 48: make browser.check~7of13
./hack/gotest.sh browser 'check~7of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 7 of 13 of ./check/ runs 17 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	85.378s
suite: browser.check~7of13 took 95s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m44.160000s 0m14.170000s
--- shard 19 of 48 ---
==> shard 19 of 48: make browser.check~8of13
./hack/gotest.sh browser 'check~8of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 8 of 13 of ./check/ runs 16 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	85.463s
suite: browser.check~8of13 took 95s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m41.920000s 0m13.660000s
--- shard 20 of 48 ---
==> shard 20 of 48: make browser.check~9of13
./hack/gotest.sh browser 'check~9of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 9 of 13 of ./check/ runs 16 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	74.784s
suite: browser.check~9of13 took 84s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m29.560000s 0m9.520000s
--- shard 21 of 48 ---
==> shard 21 of 48: make browser.check~10of13
./hack/gotest.sh browser 'check~10of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 10 of 13 of ./check/ runs 16 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	84.313s
suite: browser.check~10of13 took 94s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m38.780000s 0m12.080000s
--- shard 22 of 48 ---
==> shard 22 of 48: make browser.check~11of13
./hack/gotest.sh browser 'check~11of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 11 of 13 of ./check/ runs 16 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	80.721s
suite: browser.check~11of13 took 90s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m41.700000s 0m14.090000s
--- shard 23 of 48 ---
==> shard 23 of 48: make browser.check~12of13
./hack/gotest.sh browser 'check~12of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 12 of 13 of ./check/ runs 17 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	81.503s
suite: browser.check~12of13 took 91s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m42.530000s 0m14.170000s
--- shard 24 of 48 ---
==> shard 24 of 48: make browser.check~13of13
./hack/gotest.sh browser 'check~13of13'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 13 of 13 of ./check/ runs 17 of 211 browser tests
ok  	amadan.net/rastrillo/fiesta/check	76.064s
suite: browser.check~13of13 took 86s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m36.860000s 0m10.670000s
--- shard 25 of 48 ---
==> shard 25 of 48: make browser.internal.gallery~1of18
./hack/gotest.sh browser 'internal.gallery~1of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 1 of 18 of ./internal/gallery/ runs 6 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	32.654s
suite: browser.internal.gallery~1of18 took 42s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.470000s 0m3.100000s
--- shard 26 of 48 ---
==> shard 26 of 48: make browser.internal.gallery~2of18
./hack/gotest.sh browser 'internal.gallery~2of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 2 of 18 of ./internal/gallery/ runs 6 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	48.929s
suite: browser.internal.gallery~2of18 took 58s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.690000s 0m3.690000s
--- shard 27 of 48 ---
==> shard 27 of 48: make browser.internal.gallery~3of18
./hack/gotest.sh browser 'internal.gallery~3of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 3 of 18 of ./internal/gallery/ runs 6 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	59.517s
suite: browser.internal.gallery~3of18 took 69s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.500000s 0m4.160000s
--- shard 28 of 48 ---
==> shard 28 of 48: make browser.internal.gallery~4of18
./hack/gotest.sh browser 'internal.gallery~4of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 4 of 18 of ./internal/gallery/ runs 6 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	59.220s
suite: browser.internal.gallery~4of18 took 68s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.190000s 0m5.510000s
--- shard 29 of 48 ---
==> shard 29 of 48: make browser.internal.gallery~5of18
./hack/gotest.sh browser 'internal.gallery~5of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 5 of 18 of ./internal/gallery/ runs 6 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	60.615s
suite: browser.internal.gallery~5of18 took 70s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m17.290000s 0m4.590000s
--- shard 30 of 48 ---
==> shard 30 of 48: make browser.internal.gallery~6of18
./hack/gotest.sh browser 'internal.gallery~6of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 6 of 18 of ./internal/gallery/ runs 6 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	55.285s
suite: browser.internal.gallery~6of18 took 64s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.780000s 0m3.970000s
--- shard 31 of 48 ---
==> shard 31 of 48: make browser.internal.gallery~7of18
./hack/gotest.sh browser 'internal.gallery~7of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 7 of 18 of ./internal/gallery/ runs 5 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	53.630s
suite: browser.internal.gallery~7of18 took 63s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.140000s 0m2.720000s
--- shard 32 of 48 ---
==> shard 32 of 48: make browser.internal.gallery~8of18
./hack/gotest.sh browser 'internal.gallery~8of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 8 of 18 of ./internal/gallery/ runs 5 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	58.067s
suite: browser.internal.gallery~8of18 took 67s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m18.150000s 0m5.230000s
--- shard 33 of 48 ---
==> shard 33 of 48: make browser.internal.gallery~9of18
./hack/gotest.sh browser 'internal.gallery~9of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 9 of 18 of ./internal/gallery/ runs 5 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	64.192s
suite: browser.internal.gallery~9of18 took 73s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m22.480000s 0m6.970000s
--- shard 34 of 48 ---
==> shard 34 of 48: make browser.internal.gallery~10of18
./hack/gotest.sh browser 'internal.gallery~10of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 10 of 18 of ./internal/gallery/ runs 2 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	60.409s
suite: browser.internal.gallery~10of18 took 70s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.970000s 0m2.760000s
--- shard 35 of 48 ---
==> shard 35 of 48: make browser.internal.gallery~11of18
./hack/gotest.sh browser 'internal.gallery~11of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 11 of 18 of ./internal/gallery/ runs 2 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	60.305s
suite: browser.internal.gallery~11of18 took 69s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.030000s 0m2.730000s
--- shard 36 of 48 ---
==> shard 36 of 48: make browser.internal.gallery~12of18
./hack/gotest.sh browser 'internal.gallery~12of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 12 of 18 of ./internal/gallery/ runs 2 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	64.339s
suite: browser.internal.gallery~12of18 took 73s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m18.690000s 0m4.830000s
--- shard 37 of 48 ---
==> shard 37 of 48: make browser.internal.gallery~13of18
./hack/gotest.sh browser 'internal.gallery~13of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 13 of 18 of ./internal/gallery/ runs 3 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	65.337s
suite: browser.internal.gallery~13of18 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.150000s 0m5.260000s
--- shard 38 of 48 ---
==> shard 38 of 48: make browser.internal.gallery~14of18
./hack/gotest.sh browser 'internal.gallery~14of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 14 of 18 of ./internal/gallery/ runs 4 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	67.646s
suite: browser.internal.gallery~14of18 took 76s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.860000s 0m5.270000s
--- shard 39 of 48 ---
==> shard 39 of 48: make browser.internal.gallery~15of18
./hack/gotest.sh browser 'internal.gallery~15of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 15 of 18 of ./internal/gallery/ runs 4 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	65.845s
suite: browser.internal.gallery~15of18 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.670000s 0m5.640000s
--- shard 40 of 48 ---
==> shard 40 of 48: make browser.internal.gallery~16of18
./hack/gotest.sh browser 'internal.gallery~16of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 16 of 18 of ./internal/gallery/ runs 5 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	63.784s
suite: browser.internal.gallery~16of18 took 72s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.250000s 0m4.120000s
--- shard 41 of 48 ---
==> shard 41 of 48: make browser.internal.gallery~17of18
./hack/gotest.sh browser 'internal.gallery~17of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 17 of 18 of ./internal/gallery/ runs 5 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	67.186s
suite: browser.internal.gallery~17of18 took 76s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m20.030000s 0m5.800000s
--- shard 42 of 48 ---
==> shard 42 of 48: make browser.internal.gallery~18of18
./hack/gotest.sh browser 'internal.gallery~18of18'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 18 of 18 of ./internal/gallery/ runs 5 of 83 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	66.911s
suite: browser.internal.gallery~18of18 took 76s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.080000s 0m5.440000s
--- shard 43 of 48 ---
==> shard 43 of 48: make browser.internal.gallery.history
./hack/gotest.sh browser 'internal.gallery.history'
gotest: on ip-172-31-20-88, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: ./internal/gallery/history/ runs its 3 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery/history	31.823s
suite: browser.internal.gallery.history took 38s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m20.630000s 0m2.100000s
--- shard 44 of 48 ---
==> shard 44 of 48: make browser.internal.www~1of4
./hack/gotest.sh browser 'internal.www~1of4'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 1 of 4 of ./internal/www/ runs 4 of 22 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/www	69.432s
suite: browser.internal.www~1of4 took 77s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m30.940000s 0m2.100000s
--- shard 45 of 48 ---
==> shard 45 of 48: make browser.internal.www~2of4
./hack/gotest.sh browser 'internal.www~2of4'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 2 of 4 of ./internal/www/ runs 6 of 22 browser tests
--- FAIL: TestTheLandingReadsWithNoScript (9.35s)
    landing_browser_test.go:442: Inspected target navigated or closed (-32000)
FAIL
FAIL	amadan.net/rastrillo/fiesta/internal/www	66.793s
FAIL
make[1]: *** [Makefile:234: browser.internal.www~2of4] Error 1
suite: browser.internal.www~2of4 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m44.850000s 0m2.710000s
make: *** [Makefile:76: suite] Error 2

amadan: step suite shard 45 of 48 failed: exit status 2
--- shard 46 of 48 ---
==> shard 46 of 48: make browser.internal.www~3of4
./hack/gotest.sh browser 'internal.www~3of4'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 3 of 4 of ./internal/www/ runs 6 of 22 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/www	81.378s
suite: browser.internal.www~3of4 took 89s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m51.250000s 0m2.890000s
--- shard 47 of 48 ---
==> shard 47 of 48: make browser.internal.www~4of4
./hack/gotest.sh browser 'internal.www~4of4'
gotest: on ip-172-31-20-88, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 4 of 4 of ./internal/www/ runs 6 of 22 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/www	77.477s
suite: browser.internal.www~4of4 took 85s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m45.270000s 0m2.960000s

amadan: job failed at step suite shard 45 of 48 — its output is above, not at the tail of this log
diff --git a/check/oneoh_browser_test.go b/check/oneoh_browser_test.go
index beedd82..0cb3d9e 100644
--- a/check/oneoh_browser_test.go
+++ b/check/oneoh_browser_test.go
@@ -124,7 +124,7 @@ func oneOhRig(t *testing.T, theme string, media *emulation.SetEmulatedMediaParam
mux.Handle("/"+side+"/", oneOhTree(t, side, theme))
}
return mux
- }, harness.WithHover())
+ }, harness.WithHover(), harness.WithDeterministicRaster())
ctx, cancel := context.WithTimeout(rig.Context(), 300*time.Second)
t.Cleanup(cancel)
if media != nil {
@@ -198,37 +198,18 @@ func oneOhShot(t *testing.T, rig *harness.Rig, ctx context.Context, side, doc st
})
}
-// oneOhTries is how many pairs a leg may take before a difference is
-// believed. One frozen state (api-tokens' secret, with its autofocused
-// callout) photographs a rounded corner one level apart on two loads
-// of the same page under the same stylesheet: 1 pair in 60 on docs-t1,
-// and once on the fleet. A difference the CSS makes is there in every
-// pair; one that comes and goes is the renderer's, so the leg fails
-// only when every pair differs, still at zero tolerance.
-const oneOhTries = 3
-
// sameOneOh photographs doc on both sides in each leg and fails each
-// leg whose pictures differ by a single pixel in every one of
-// oneOhTries pairs.
+// leg whose pictures differ by a single pixel. One pair is enough:
+// the rig rasters deterministically (WithDeterministicRaster), and
+// without it one state's callout corner came out one level apart in
+// about 1 pair in 100 under load, on two loads of one stylesheet.
func sameOneOh(t *testing.T, rig *harness.Rig, ctx context.Context, doc string, legs []oneOhLeg) {
t.Helper()
- name := strings.TrimSuffix(doc, ".html")
for _, leg := range legs {
- var whys []string
- for len(whys) < oneOhTries {
- was := oneOhShot(t, rig, ctx, "old", doc, leg)
- is := oneOhShot(t, rig, ctx, "new", doc, leg)
- ok, why := samePixelsWithin(t, was, is, 0)
- if ok {
- break
- }
- whys = append(whys, why)
- }
- switch {
- case len(whys) == oneOhTries:
- t.Errorf("1.0.0's %s at %s renders differently under the tree's CSS: %s", name, leg, strings.Join(whys, "; "))
- case len(whys) > 0:
- t.Logf("1.0.0's %s at %s differed (%s), then agreed: the renderer, not the CSS", name, leg, strings.Join(whys, "; "))
+ was := oneOhShot(t, rig, ctx, "old", doc, leg)
+ is := oneOhShot(t, rig, ctx, "new", doc, leg)
+ if ok, why := samePixelsWithin(t, was, is, 0); !ok {
+ t.Errorf("1.0.0's %s at %s renders differently under the tree's CSS: %s", strings.TrimSuffix(doc, ".html"), leg, why)
}
}
}
diff --git a/check/parity_browser_test.go b/check/parity_browser_test.go
index 1583086..5ea6fff 100644
--- a/check/parity_browser_test.go
+++ b/check/parity_browser_test.go
@@ -69,7 +69,7 @@ func parityRig(t *testing.T, docs map[string]string, oldAssets, newAssets map[st
})
}
return mux
- }, harness.WithHover())
+ }, harness.WithHover(), harness.WithDeterministicRaster())
}
// parityAssets is one side's asset set: the three stylesheets under the
diff --git a/internal/harness/rig.go b/internal/harness/rig.go
index 83240da..3962db5 100644
--- a/internal/harness/rig.go
+++ b/internal/harness/rig.go
@@ -52,6 +52,7 @@ type config struct {
withScrollbars bool
coarsePointer bool
hover bool
+ oneRaster bool
}
// Option adjusts what New builds.
@@ -84,6 +85,17 @@ func WithCoarsePointer() Option {
return func(c *config) { c.coarsePointer = true }
}
+// WithDeterministicRaster launches Chromium painting every pixel the
+// same way on every load: one raster thread, no GPU and no GPU
+// rasterization, no partial raster, grayscale antialiasing and an sRGB
+// colour profile. A drive that compares two photographs at zero
+// tolerance needs it: under load, with several raster threads, one
+// antialiased pixel at the edge of a painted surface came out one
+// level apart on two loads of one page under one stylesheet.
+func WithDeterministicRaster() Option {
+ return func(c *config) { c.oneRaster = true }
+}
+
// WithHover launches Chromium with a mouse that can hover, so
// (hover: hover) matches. Headless Chromium's default is (hover: none)
// even on a desktop, measured here: a drive that read a rule inside
@@ -143,6 +155,16 @@ func New(t *testing.T, build func(origin string) http.Handler, opts ...Option) *
allocOpts = append(allocOpts, chromedp.Flag("blink-settings",
"primaryPointerType=2,availablePointerTypes=2,primaryHoverType=1,availableHoverTypes=1"))
}
+ if cfg.oneRaster {
+ allocOpts = append(allocOpts,
+ chromedp.Flag("num-raster-threads", "1"),
+ chromedp.Flag("disable-gpu", true),
+ chromedp.Flag("disable-gpu-rasterization", true),
+ chromedp.Flag("disable-partial-raster", true),
+ chromedp.Flag("disable-lcd-text", true),
+ chromedp.Flag("force-color-profile", "srgb"),
+ )
+ }
allocCtx, cancelAlloc := chromedp.NewExecAllocator(context.Background(), allocOpts...)
ctx, cancelCtx := chromedp.NewContext(allocCtx)