Read both spellings only once the page has settled
TestBothSpellingsComputeTheSameStyles read each spelling's computed styles as soon as #fixture was visible. On a busy box that read could land while the page was still changing: on a fleet run, and twice in 90 runs here under load, element 405 at 390px (rst-shell__tail) read differently in the two spellings, and a second read of the same element found no property that differed. Every read now waits for the document to load, its fonts, every animation and transition that has an end, and two frames. A difference is then read twice before it is reported: both spellings again, each on a freshly loaded and settled page, compared exactly as before, and what still differs is reported with the properties that moved. The comparison itself is unchanged. Under the same load (sixteen gallery browser slices alongside, load average 47 to 70), the settled version passed 90 runs out of 90 and never needed the second read.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 file changed,
+48
−4
check/markup_v3_browser_test.go+48 −4
CI cancelled — superseded by a newer push — run details
CI log
=== gofmt ===
=== no-rastrillo ===
go test -run '^(TestFiestaNeverImportsRastrillo|TestThePublicPackagesLinkNoBrowser)$' -count=1 .
ok amadan.net/rastrillo/fiesta 0.172s
=== 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.03s)
PASS
ok amadan.net/rastrillo/fiesta/internal/build 0.030s
=== history ===
history: 30 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 5.703s
ok amadan.net/rastrillo/fiesta/check 12.377s
ok amadan.net/rastrillo/fiesta/example 0.790s
? amadan.net/rastrillo/fiesta/hack/seed/english [no test files]
ok amadan.net/rastrillo/fiesta/internal/axe 0.268s
ok amadan.net/rastrillo/fiesta/internal/build 4.642s
ok amadan.net/rastrillo/fiesta/internal/codeview 0.010s
? amadan.net/rastrillo/fiesta/internal/harness [no test files]
ok amadan.net/rastrillo/fiesta/internal/markup 0.017s
ok amadan.net/rastrillo/fiesta/internal/nodetest 0.679s
ok amadan.net/rastrillo/fiesta/internal/site 8.290s
ok amadan.net/rastrillo/fiesta/internal/tokens 0.009s
suite: root took 17s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m7.750000s 0m1.470000s
--- 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 33 of 102 test tests
ok amadan.net/rastrillo/fiesta/internal/gallery 82.461s
suite: test.internal.gallery~1of3 took 85s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m49.730000s 0m1.370000s
--- 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 102 test tests
ok amadan.net/rastrillo/fiesta/internal/gallery 72.265s
suite: test.internal.gallery~2of3 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m40.960000s 0m1.030000s
--- 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 34 of 102 test tests
ok amadan.net/rastrillo/fiesta/internal/gallery 62.620s
suite: test.internal.gallery~3of3 took 65s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m31.490000s 0m0.960000s
--- 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 64.707s
suite: test.cmd.fiesta~1of2 took 68s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m31.640000s 0m2.030000s
--- 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 68.955s
suite: test.cmd.fiesta~2of2 took 73s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m34.000000s 0m2.350000s
--- 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 8 of 18 test tests
ok amadan.net/rastrillo/fiesta/internal/www 61.354s
suite: test.internal.www~1of2 took 65s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m32.140000s 0m1.210000s
--- 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 10 of 18 test tests
ok amadan.net/rastrillo/fiesta/internal/www 57.098s
suite: test.internal.www~2of2 took 60s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m27.860000s 0m0.990000s
--- 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 16s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m8.000000s 0m0.610000s
--- 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 11s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m3.120000s 0m0.390000s
--- 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' .
[90m8:30PM[0m [32mINF[0m [1mUnknown SCM platform. Use --platform to include links in findings.[0m [36mhost=[0mamadan.net
[90m8:30PM[0m [32mINF[0m [1m28 commits scanned.[0m
[90m8:30PM[0m [32mINF[0m [1mscanned ~7746586 bytes (7.75 MB) in 6.37s[0m
[90m8:30PM[0m [32mINF[0m [1mno leaks found[0m
suite: gitleaks took 7s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m6.770000s 0m0.160000s
--- shard 11 of 48 ---
==> shard 11 of 48: make browser.internal.harness
./hack/gotest.sh browser 'internal.harness'
gotest: on ip-172-31-23-110, 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 7.398s
suite: browser.internal.harness took 13s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m1.590000s 0m1.280000s
--- shard 12 of 48 ---
==> shard 12 of 48: make browser.check~1of13
./hack/gotest.sh browser 'check~1of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 1 of 13 of ./check/ runs 5 of 189 browser tests
amadan: job cancelled — a newer push superseded it
--- shard 13 of 48 ---
==> shard 13 of 48: make browser.check~2of13
./hack/gotest.sh browser 'check~2of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 2 of 13 of ./check/ runs 9 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 74.464s
suite: browser.check~2of13 took 88s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m26.820000s 0m7.580000s
--- shard 14 of 48 ---
==> shard 14 of 48: make browser.check~3of13
./hack/gotest.sh browser 'check~3of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 3 of 13 of ./check/ runs 10 of 189 browser tests
amadan: job cancelled — a newer push superseded it
--- shard 15 of 48 ---
==> shard 15 of 48: make browser.check~4of13
./hack/gotest.sh browser 'check~4of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 4 of 13 of ./check/ runs 11 of 189 browser tests
amadan: job cancelled — a newer push superseded it
--- shard 16 of 48 ---
==> shard 16 of 48: make browser.check~5of13
./hack/gotest.sh browser 'check~5of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 5 of 13 of ./check/ runs 16 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 56.442s
suite: browser.check~5of13 took 70s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m18.680000s 0m6.630000s
--- shard 17 of 48 ---
==> shard 17 of 48: make browser.check~6of13
./hack/gotest.sh browser 'check~6of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 6 of 13 of ./check/ runs 16 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 64.806s
suite: browser.check~6of13 took 79s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m26.110000s 0m8.960000s
--- shard 18 of 48 ---
==> shard 18 of 48: make browser.check~7of13
./hack/gotest.sh browser 'check~7of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 7 of 13 of ./check/ runs 16 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 59.523s
suite: browser.check~7of13 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m24.910000s 0m7.280000s
--- shard 19 of 48 ---
==> shard 19 of 48: make browser.check~8of13
./hack/gotest.sh browser 'check~8of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 8 of 13 of ./check/ runs 17 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 59.977s
suite: browser.check~8of13 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m23.110000s 0m8.550000s
--- shard 20 of 48 ---
==> shard 20 of 48: make browser.check~9of13
./hack/gotest.sh browser 'check~9of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 9 of 13 of ./check/ runs 18 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 54.163s
suite: browser.check~9of13 took 68s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m24.810000s 0m10.300000s
--- shard 21 of 48 ---
==> shard 21 of 48: make browser.check~10of13
./hack/gotest.sh browser 'check~10of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 10 of 13 of ./check/ runs 17 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 70.594s
suite: browser.check~10of13 took 84s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m33.790000s 0m11.150000s
--- shard 22 of 48 ---
==> shard 22 of 48: make browser.check~11of13
./hack/gotest.sh browser 'check~11of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 11 of 13 of ./check/ runs 18 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 55.445s
suite: browser.check~11of13 took 71s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.850000s 0m7.500000s
--- shard 23 of 48 ---
==> shard 23 of 48: make browser.check~12of13
./hack/gotest.sh browser 'check~12of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 12 of 13 of ./check/ runs 18 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 63.924s
suite: browser.check~12of13 took 79s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m24.870000s 0m9.650000s
--- shard 24 of 48 ---
==> shard 24 of 48: make browser.check~13of13
./hack/gotest.sh browser 'check~13of13'
gotest: on ip-172-31-23-110, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 13 of 13 of ./check/ runs 18 of 189 browser tests
ok amadan.net/rastrillo/fiesta/check 56.121s
suite: browser.check~13of13 took 71s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m22.230000s 0m8.560000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 1 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 71.639s
suite: browser.internal.gallery~1of18 took 79s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.520000s 0m4.200000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 2 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 64.926s
suite: browser.internal.gallery~2of18 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m11.780000s 0m3.570000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 3 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 69.086s
suite: browser.internal.gallery~3of18 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.850000s 0m2.860000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 4 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 65.439s
suite: browser.internal.gallery~4of18 took 72s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.260000s 0m2.540000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 5 of 18 of ./internal/gallery/ runs 6 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 76.048s
suite: browser.internal.gallery~5of18 took 82s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.900000s 0m4.970000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 6 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 78.222s
suite: browser.internal.gallery~6of18 took 85s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.770000s 0m5.810000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 7 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 70.165s
suite: browser.internal.gallery~7of18 took 77s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.590000s 0m4.200000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 8 of 18 of ./internal/gallery/ runs 6 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 76.728s
suite: browser.internal.gallery~8of18 took 84s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m17.740000s 0m6.630000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 9 of 18 of ./internal/gallery/ runs 2 of 82 browser tests
amadan: job cancelled — a newer push superseded it
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 10 of 18 of ./internal/gallery/ runs 3 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 80.763s
suite: browser.internal.gallery~10of18 took 87s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.940000s 0m4.820000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 11 of 18 of ./internal/gallery/ runs 4 of 82 browser tests
amadan: job cancelled — a newer push superseded it
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 12 of 18 of ./internal/gallery/ runs 4 of 82 browser tests
amadan: job cancelled — a newer push superseded it
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 13 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 72.704s
suite: browser.internal.gallery~13of18 took 81s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m11.850000s 0m3.550000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 14 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 70.417s
suite: browser.internal.gallery~14of18 took 79s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m11.720000s 0m3.670000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 15 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 73.095s
suite: browser.internal.gallery~15of18 took 82s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.500000s 0m3.900000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 16 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 71.459s
suite: browser.internal.gallery~16of18 took 81s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.930000s 0m3.810000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 17 of 18 of ./internal/gallery/ runs 5 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 74.562s
suite: browser.internal.gallery~17of18 took 81s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.850000s 0m4.440000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 18 of 18 of ./internal/gallery/ runs 2 of 82 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 74.791s
suite: browser.internal.gallery~18of18 took 81s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.340000s 0m2.560000s
--- 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-23-110, 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 46.973s
suite: browser.internal.gallery.history took 52s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m20.590000s 0m2.050000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 1 of 4 of ./internal/www/ runs 4 of 16 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 64.662s
suite: browser.internal.www~1of4 took 73s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m30.350000s 0m1.960000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 2 of 4 of ./internal/www/ runs 4 of 16 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 68.428s
suite: browser.internal.www~2of4 took 76s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m36.690000s 0m2.300000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 3 of 4 of ./internal/www/ runs 4 of 16 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 65.979s
suite: browser.internal.www~3of4 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m30.550000s 0m2.180000s
--- 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-23-110, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 4 of 4 of ./internal/www/ runs 4 of 16 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 65.072s
suite: browser.internal.www~4of4 took 72s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m29.990000s 0m1.990000s
Intent
diff --git a/check/markup_v3_browser_test.go b/check/markup_v3_browser_test.go| index d4add7b..f02f943 100644 |
| --- a/check/markup_v3_browser_test.go |
| +++ b/check/markup_v3_browser_test.go |
| @@ -151,6 +151,25 @@ func styleProperties() []string { |
| // wearing the costume of a real finding. |
| const freezeAnimations = `if (document.getAnimations) document.getAnimations().forEach(function (a) { try { a.currentTime = 0; a.pause(); } catch (e) {} });` |
| +// settleJS waits until a read of the page would read the same again: |
| +// the document loaded, its fonts ready, every animation and transition |
| +// that has an end at its end (the ones that never end, .rst-spin's, are |
| +// frozen by the read itself), then two frames, so style and layout have |
| +// caught up with all of it. A read taken sooner, on a busy runner, |
| +// caught one element at 390px mid-change and reported a difference that |
| +// a second read of the same page did not find. |
| +const settleJS = `(async () => { |
| + if (document.readyState !== "complete") await new Promise(r => addEventListener("load", r, {once: true})); |
| + await document.fonts.ready; |
| + for (;;) { |
| + const running = document.getAnimations().filter(a => a.playState === "running" && a.effect && a.effect.getComputedTiming().endTime !== Infinity); |
| + if (running.length === 0) break; |
| + await Promise.all(running.map(a => a.finished.catch(() => null))); |
| + } |
| + await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); |
| + return true; |
| +})()` |
| + |
| const digestJS = `(function (props) { |
| ` + freezeAnimations + ` |
| var out = [], els = document.querySelectorAll("#fixture *"); |
| @@ -242,6 +261,7 @@ func TestBothSpellingsComputeTheSameStyles(t *testing.T) { |
| chromedp.EmulateViewport(width, 900), |
| chromedp.Navigate(rig.Origin+"/?spelling="+spelling), |
| chromedp.WaitVisible("#fixture", chromedp.ByQuery), |
| + chromedp.Evaluate(settleJS, nil, awaitPromise), |
| chromedp.Evaluate(fmt.Sprintf(digestJS, propsJSON), &got), |
| ); err != nil { |
| t.Fatalf("reading the %s pass at %dpx: %v", spelling, width, err) |
| @@ -281,10 +301,30 @@ func TestBothSpellingsComputeTheSameStyles(t *testing.T) { |
| } |
| t.Logf("at %dpx: the control pass differs on %d of %d elements, so the stylesheet is reaching the fixture", width, styled, len(byClass)) |
| - var differ []int |
| - for i := range byClass { |
| - if byClass[i] != byAttr[i] { |
| - differ = append(differ, i) |
| + differing := func() []int { |
| + var out []int |
| + for i := range byClass { |
| + if byClass[i] != byAttr[i] { |
| + out = append(out, i) |
| + } |
| + } |
| + return out |
| + } |
| + differ := differing() |
| + // A difference is read twice before it is reported: both |
| + // spellings again, each on a freshly loaded and settled page, |
| + // compared exactly as before. What still differs is reported |
| + // with the properties that moved; what did not was a read of a |
| + // page still changing, and the log says so. |
| + if len(differ) > 0 { |
| + t.Logf("at %dpx: %d elements differ on the first read; reading both spellings again", width, len(differ)) |
| + byClass, byAttr = read("class", width), read("attr", width) |
| + if len(byClass) != len(byAttr) { |
| + t.Fatalf("at %dpx, read again: the two spellings render different DOMs: %d elements in classes, %d in attributes", width, len(byClass), len(byAttr)) |
| + } |
| + differ = differing() |
| + if len(differ) == 0 { |
| + t.Logf("at %dpx: read again, the two spellings agree on every element", width) |
| } |
| } |
| if len(differ) == 0 { |
| @@ -308,6 +348,7 @@ func TestBothSpellingsComputeTheSameStyles(t *testing.T) { |
| chromedp.EmulateViewport(width, 900), |
| chromedp.Navigate(rig.Origin+"/?spelling="+spelling), |
| chromedp.WaitVisible("#fixture", chromedp.ByQuery), |
| + chromedp.Evaluate(settleJS, nil, awaitPromise), |
| chromedp.Evaluate(fmt.Sprintf(detailJS, propsJSON, wantJSON), &got), |
| ); err != nil { |
| t.Fatalf("reading the %s detail at %dpx: %v", spelling, width, err) |
| @@ -329,6 +370,9 @@ func TestBothSpellingsComputeTheSameStyles(t *testing.T) { |
| moved = append(moved, fmt.Sprintf("%s: class %q, attribute %q", name, c.Style[name], a.Style[name])) |
| } |
| } |
| + if len(moved) == 0 { |
| + moved = append(moved, "no property differs on a third read of both, so the difference comes and goes between loads") |
| + } |
| t.Errorf("at %dpx: element %d (<%s>) computes differently in the two spellings:\n\tclass markup: %s\n\tattribute markup: %s\n\t%s", |
| width, i, strings.ToLower(c.Tag), c.HTML, a.HTML, strings.Join(moved, "\n\t")) |
| } |