test-fixtures: lazy-download manifest replaces eest-fixtures submodule#21002
Merged
Conversation
Switch BenchmarkEngineX{Instruction,Precompile,Scenario} to stream
fixtures directly from fixtures_benchmark.tar.gz (mirrored verbatim
from execution-spec-tests release benchmark@v0.0.7) instead of the
unpacked submodule directory. Bumps the eest-fixtures submodule to a
commit that adds the tarball as an LFS asset on top of the existing
tree, so other tests still see the unpacked layout.
NewEngineXTestRunner now takes a pre-built preAllocs map; dir-based
callers use the new LoadPreAllocsFromDir helper.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
TestExecutionSpecBlockchainDevnet now streams from the verbatim fixtures_bal.tar.gz (mirrored from execution-spec-tests release bal@v5.7.0) instead of the unpacked blockchain_tests_devnet/ dir. Bumps the eest-fixtures submodule to a commit that adds the tarball as an LFS asset and drops the now-redundant blockchain_tests_devnet/. Adds testutil.TestMatcher.WalkTar, a tar(.gz) counterpart to Walk. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the eest-fixtures submodule pin (which was carrying both
fixtures_benchmark.tar.gz and fixtures_bal.tar.gz as Git LFS assets)
with a lazy-download manifest:
* execution/tests/eest-fixtures.json pins each tarball's URL +
sha256 against the canonical execution-spec-tests release.
* cmd/eest-fixtures downloads missing/mismatched tarballs into
execution/tests/eest-cache/ (gitignored) and verifies the sha256.
Re-runs are no-ops when files match (mtime preserved, so Go test
caching stays valid).
* make eest-fixtures runs the tool; make test-all depends on it;
make test-short does not.
* In CI, test-all-erigon.yml restores execution/tests/eest-cache
via actions/cache keyed on the manifest hash, so steady-state
runs skip the download.
Reverts the submodule pointer to ec66995f0 (eest-fixtures main, no
longer pinned to the tarball branch). Drops the blockchain_tests_devnet/
LFS-pull patterns from setup-erigon since the migrated eest_devnet
test now reads from the lazy-downloaded fixtures_bal.tar.gz.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…res_develop.tar.gz
Migrates eest_blockchain/block_test.go from the unpacked
blockchain_tests/ submodule directory to the lazy-downloaded
fixtures_develop.tar.gz (execution-spec-tests release v5.4.0),
streamed via testutil.TestMatcher.WalkTar.
The eest_{cancun_blobs,frontier_scenarios,prague_calldata,osaka_clz}
sibling packages still read from the submodule and are unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…s_develop.tar.gz Migrates the four sibling packages (eest_cancun_blobs, eest_frontier_scenarios, eest_osaka_clz, eest_prague_calldata) from the unpacked blockchain_tests/ submodule directory to the lazy-downloaded fixtures_develop.tar.gz. With the main TestExecutionSpecBlockchain already on the tarball, no test now reads from blockchain_tests/ in the eest-fixtures submodule, so the corresponding LFS-pull patterns can be dropped in setup-erigon (only state_tests/static/state_tests/stStackTests/*.json remains for TestState). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Migrates TestState from the unpacked state_tests/static/state_tests/ submodule directory to the lazy-downloaded fixtures_develop.tar.gz, sharing the per-subtest harness with runStateTests via a new runStateTestsTar helper that delegates the inner closure to a factored-out runStateTest. With this, no test reads from the eest-fixtures submodule's LFS- tracked content, so the second git-lfs-pull block in setup-erigon (targeting state_tests/static/state_tests/stStackTests/*.json) is removed. The remaining pull is just for execution/tests/test-corners, which is in the main repo, not the submodule. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
No erigon test reads from execution/tests/execution-spec-tests anymore — every consumer (TestExecutionSpecBlockchain and its sibling packages, TestState, TestExecutionSpecBlockchainDevnet, benchmarkEngineX) now streams from a lazy-downloaded fixture tarball pinned in execution/tests/eest-fixtures.json. Removes the submodule from .gitmodules, drops the dead eestDir constant, and cleans up the now-unreachable execution-spec-tests exclusions in .golangci.yml. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The fixtures_bal.tar.gz URL pinned in execution/tests/eest-fixtures.json is bal@v5.7.0; the eest-bal hive-runner target was still on v5.1.0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the hardcoded bal@v5.7.0 references in the eest-bal target with two Make variables sourced from execution/tests/eest-fixtures.json: EEST_FIXTURES_BAL_URL — pulled by jq from the manifest EEST_FIXTURES_BAL_TAG — derived from the URL via sed Future manifest bumps automatically flow into the eest-bal hive run without a parallel Makefile edit. Adds a runtime dependency on jq when invoking the target. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the hardcoded EEST_VERSION=v5.3.0 (which had drifted from the manifest's v5.4.0 pin) with EEST_FIXTURES_DEVELOP_URL sourced from execution/tests/eest-fixtures.json by jq. Future manifest bumps flow into the eest-hive hive run automatically. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drops the env.EEST_VERSION constant and the hardcoded bal URL on the glamsterdam-devnet matrix row in favour of looking each tarball's URL up via jq from execution/tests/eest-fixtures.json. The matrix field is renamed fixtures-url -> fixtures-tarball and now carries just the manifest key (filename); the URL is resolved at run-step time with fixtures_develop.tar.gz as the default. Adds the manifest path to the sparse checkout of erigon-src so the run step can read it. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each shard now declares its tarball (fixtures_develop.tar.gz or fixtures_bal.tar.gz) directly in the matrix entry, and the run step looks the URL up via jq with no default. Self-contained per row, no shell case-on-shard or fallback logic. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds an optional "branch" attribute to entries in
execution/tests/eest-fixtures.json (set to "devnets/bal/4" for
fixtures_bal.tar.gz; absent for develop and benchmark).
Both consumers of the bal hive branch now read it from the manifest:
* Makefile's EEST_FIXTURES_BAL_TAG, renamed to
EEST_FIXTURES_BAL_BRANCH for accuracy, switches from a regex on
the URL to a jq lookup of .branch. The eest-bal target's
--sim.buildarg drops the dead branch=hive override and the
tests- prefix; it now passes branch=devnets/bal/4 directly.
* test-hive-eest.yml drops the hardcoded branch from the bal
matrix row's extra-hive-flags. The run step jq-reads .branch
(with `// empty` fallback) and conditionally appends it as a
--sim.buildarg to the hive command, so develop shards stay
branch-less.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… manifest Merges execution/tests/eest-fixtures.json and cl/spectest/fixtures.json into a single repository-level test-fixtures.json that pins all four test fixture tarballs (3 from execution-spec-tests + 1 from consensus-spec-tests). Cache dir is now top-level test-fixtures-cache/, the tool is cmd/test-fixtures, and the make target is test-fixtures. cl/spectest's `make tests` now invokes the top-level `make test-fixtures` to populate the shared cache, then extracts mainnet.tar.gz from there. Test paths updated to reach the new top-level cache (../../ from execution/tests, ../../../ from execution/tests/eest_*). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cmd/test-fixtures was ~140 lines of stdlib Go doing four things — parse JSON, GET, sha256-verify, atomic rename — all of which jq + curl + sha256sum/shasum + mv handle in one shell loop. The script lives at tools/test-fixtures.sh; the make test-fixtures target invokes it directly. cl/spectest/Makefile already invokes the make target, so it picks up the swap automatically. Drops a runtime dependency on Go for fixture download (jq + curl + sha256sum/shasum cover macOS, Linux, and Git Bash on Windows). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ript directly
Two follow-ups to the unification:
* Rename EEST_FIXTURES_{BAL_URL,BAL_BRANCH,DEVELOP_URL} ->
FIXTURES_{BAL_URL,BAL_BRANCH,DEVELOP_URL}. They read from
test-fixtures.json, so the EEST_ prefix was misleading.
* cl/spectest/Makefile: replace `cd ../.. && $(MAKE) test-fixtures`
with a direct `../../tools/test-fixtures.sh` invocation. No
recursive make, just the same script with explicit manifest +
cache args.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hort() The custom env var was doing the same job as testing.Short() — keeping the heavy engine-x benchmarks out of `make test-bench` (which already passes -short). Replace with the idiomatic skip and drop the dbg import. Manual runs without -short execute as before; the doc-comment example loses the env-var prefix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
On Windows runners using Git Bash, the jq output read into the loop's $want variable carried a trailing \r, causing the sha256 comparison to fail with a misleading "mismatch — want X got X" error (the \r made the log render the second hash on a fresh line). Pipe through `tr -d '\r'` to normalize line endings. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Replaces the heavyweight eest-fixtures Git submodule (LFS-backed unpacked JSON) with a pinned manifest + lazy-download cache of release tarballs, and updates tests/CI to consume fixtures from cached tarballs (including consensus-spec-tests for cl/spectest).
Changes:
- Add
test-fixtures.jsonmanifest andtools/test-fixtures.shto download/verify fixture tarballs intotest-fixtures-cache/. - Update execution tests to stream
.jsonfixtures from cached tarballs viaTestMatcher.WalkTar, plus refactor EngineX pre-alloc loading to accept in-memory maps. - Wire fixture fetching/caching into
make test-all,cl/spectest, and GitHub workflows; remove theeest-fixturessubmodule and related lint/LFS setup.
Reviewed changes
Copilot reviewed 22 out of 23 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
tools/test-fixtures.sh |
New downloader/verifier for pinned fixture tarballs (sha256-checked) into a local cache directory. |
test-fixtures.json |
New manifest pinning fixture tarball URLs, sha256, size (and optional branch metadata). |
Makefile |
Adds test-fixtures target; makes test-all depend on fixture download; reads fixture URL/branch from manifest for hive targets. |
execution/tests/testutil/matcher.go |
Adds WalkTar + runTestBytes to execute tests directly from tar(.gz) entries. |
execution/tests/state_test.go |
Switches TestState to read state tests from cached tarball; factors shared runner into runStateTest. |
execution/tests/invalid_receipt_hash_high_mgas_test.go |
Adjusts EngineX runner setup to use LoadPreAllocsFromDir + new runner constructor signature. |
execution/tests/init_test.go |
Removes eestDir path variable tied to the removed submodule layout. |
execution/tests/eest_prague_calldata/block_test.go |
Updates to use WalkTar over cached develop tarball. |
execution/tests/eest_osaka_clz/block_test.go |
Updates to use WalkTar over cached develop tarball. |
execution/tests/eest_frontier_scenarios/block_test.go |
Updates to use WalkTar over cached develop tarball. |
execution/tests/eest_devnet/block_test.go |
Updates devnet blockchain tests to use cached BAL tarball via WalkTar. |
execution/tests/eest_cancun_blobs/block_test.go |
Updates to use WalkTar over cached develop tarball. |
execution/tests/eest_blockchain/block_test.go |
Updates main EEST blockchain suite to use WalkTar over cached develop tarball. |
execution/tests/benchmark_engine_x_test.go |
Reworks benchmark fixture loading to stream from cached benchmark tarball; removes env-gating in favor of -short skipping. |
execution/engineapi/engineapitester/engine_x_test_runner.go |
Changes EngineX runner construction to accept pre-alloc map; adds LoadPreAllocsFromDir. |
cl/spectest/Makefile |
Uses the shared fixture downloader and extracts mainnet.tar.gz from the shared cache. |
.golangci.yml |
Removes execution-spec-tests from linter/formatter skip list (submodule removed). |
.gitmodules |
Removes the eest-fixtures submodule entry. |
.gitignore |
Ignores test-fixtures-cache/ directory. |
.github/workflows/test-hive-eest.yml |
Reads fixtures URL/branch from test-fixtures.json per matrix shard instead of hardcoding versions/URLs. |
.github/workflows/test-all-erigon.yml |
Adds actions/cache for test-fixtures-cache/ keyed by test-fixtures.json hash. |
.github/actions/setup-erigon/action.yml |
Removes LFS pull logic for the removed execution-spec-tests submodule fixtures. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Five skill docs referenced state that no longer matches main:
* erigon-test-all, erigon-test-race: prerequisite section said to
sync the eest-fixtures submodule. That submodule is gone;
fixtures come from test-fixtures.json via make test-fixtures
(auto-deps from make test-all). Only the legacy-tests submodule
+ test-corners LFS pull are still local prerequisites.
* erigon-test-hive: drop `EEST_VERSION` reference (Makefile var no
longer exists) and the v5.3.0 hardcoded URL — read from the
manifest with jq instead.
* erigon-implement-eip: stop describing execution/tests/execution-
spec-tests as a submodule; describe fixtures as tarballs pinned
in test-fixtures.json and streamed via testutil.WalkTar.
* hive-test: bump the CI shard description from bal@v5.6.1 /
devnets/bal/3 to the manifest-pinned bal@v5.7.0 / devnets/bal/4
and point readers at the manifest. The skill's own shell
EEST_VERSION variable (set by Phase 0 dynamic discovery) is
unrelated and stays.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Four small follow-ups from the Copilot review on PR #21002: * Makefile: switch FIXTURES_{BAL_URL,BAL_BRANCH,DEVELOP_URL} from immediate (:=) to lazy (=) expansion. Avoids running jq at make-parse time for every invocation, including unrelated targets like `make erigon` or `make lint`. Now jq runs only when eest-bal / eest-hive recipes actually reference the vars. * testutil.WalkTar: doc-comment said "tar(.gz)" but the implementation always wraps in gzip.NewReader; clarify it requires gzip-compressed tar. * testutil.WalkTar: guard against an empty `prefix` becoming "/" (which would silently match zero entries). Treat "" as "match every entry". * benchmarkEngineX: skip with a `make test-fixtures` hint when the cached tarball is missing, matching the WalkTar behaviour for the other migrated tests. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
taratorio
requested changes
May 6, 2026
…esting.Short()" This reverts commit 0b81fea.
Address taratorio's PR-review naming feedback in one go:
fixtures_bal.tar.gz -> fixtures_devnet (key reflects what
the tarball contains;
BAL is just one of the
EIPs in the devnet)
fixtures_develop.tar.gz -> fixtures_stable (cache name is decoupled
from upstream's
"develop" branch label;
this is the stable EEST
release)
mainnet.tar.gz -> cl_mainnet (cl_ prefix marks it as
consensus-spec-tests
vs the EEST entries)
*.tar.gz -> * (drop the .tar.gz suffix from manifest
keys; the cache filenames still have
it, the downloader appends it)
Make var, target, workflow, test-path, skill-doc, and cache-file
renames follow:
FIXTURES_BAL_* -> FIXTURES_DEVNET_*
FIXTURES_DEVELOP_ -> FIXTURES_STABLE_
make eest-bal -> make eest-devnet
Upstream URLs (which contain the literal upstream filenames
fixtures_bal.tar.gz / fixtures_develop.tar.gz / mainnet.tar.gz)
stay untouched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Follow-up to b679309 — the user-facing /hive-test eest-bal argument and the related table rows in hive-test/SKILL.md and erigon-test-hive/SKILL.md still said eest-bal. Rename to eest-devnet so the skill's vocabulary matches the make target and the manifest key. The remaining `fixtures_bal.tar.gz` reference in hive-test/SKILL.md (line 99, BAL_FIXTURES_URL) is the literal upstream release-asset filename built from the BAL release tag in Phase 0; that stays. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the fixtures_ prefix in test-fixtures.json keys with the upstream-project acronym so the EL/CL distinction is explicit at a glance: fixtures_benchmark -> eest_benchmark fixtures_devnet -> eest_devnet fixtures_stable -> eest_stable cl_mainnet (unchanged, already cl_-prefixed) Make vars, workflow matrix values, test-path strings, cache filenames, and skill-doc references follow: FIXTURES_DEVNET_URL -> EEST_DEVNET_URL FIXTURES_DEVNET_BRANCH -> EEST_DEVNET_BRANCH FIXTURES_STABLE_URL -> EEST_STABLE_URL Upstream URLs that contain the literal upstream filenames (`fixtures_benchmark.tar.gz`, `fixtures_bal.tar.gz`, `fixtures_develop.tar.gz`, `mainnet.tar.gz`) are unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per taratorio's review: the WalkTar duplication isn't worth carrying
when tools/test-fixtures.sh can untar after download and the existing
dir-based Walk just works. Two wins from the change:
1. Local debugging — JSON files are browsable on disk under
test-fixtures-cache/<key>/.
2. Test code is back to the simple dir-walking shape that already
existed (Walk, filepath.WalkDir, LoadPreAllocsFromDir).
Script changes (tools/test-fixtures.sh):
* Extract each tarball into test-fixtures-cache/<key>/ alongside
the .tar.gz, with a .sha256 sentinel inside the dir for
cache-state tracking. Idempotent on re-runs.
* tarball is kept (not deleted) so re-extraction doesn't re-download.
Test code:
* 6 eest_*/block_test.go: WalkTar(tarPath, prefix, fn) -> Walk(dir, fn).
* state_test.go: collapse runStateTestsTar back into runStateTests
(closure inline), drop the runStateTest helper.
* benchmark_engine_x_test.go: revert to pre-tarball shape using
LoadPreAllocsFromDir + filepath.WalkDir; the
BENCH_ENGINE_X_MANUAL_ALLOW gate stays.
* testutil/matcher.go: drop WalkTar, runTestBytes, and the
archive/tar / compress/gzip / io imports (-91 lines).
cl/spectest:
* Makefile drops the local `tar xf`; rm cleanups and tests_test.go's
os.DirFS both point at ../../test-fixtures-cache/cl_mainnet/tests.
CI:
* test-all-erigon.yml cache narrows to test-fixtures-cache/*.tar.gz
so the action stays under cache budget; the script re-extracts on
each CI run from the cached tarballs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
With benchmarkEngineX and TestInvalidReceiptHashHighMgas both back on a directory layout (now sourced from the extracted test-fixtures-cache, but still a directory), there's no reason for NewEngineXTestRunner to take a pre-built map and a separate LoadPreAllocsFromDir helper. Restore the original `NewEngineXTestRunner(t, logger, preAllocsDir) (*Runner, error)` signature from main and drop the helper. Both callers shed a line. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
eestDir now points at test-fixtures-cache/eest_stable/fixtures (the stable EEST tarball's extracted root, the closest analogue to its old submodule meaning). TestState's path drops to filepath.Join(eestDir, "state_tests", "static", "state_tests"). The benchmark and devnet tarballs live at sibling cache subdirs (eest_benchmark/, eest_devnet/) with different prefixes, so they keep their explicit paths. Subpackage tests (eest_*) need an extra "..", so they keep theirs too. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each of eest_blockchain, eest_cancun_blobs, eest_frontier_scenarios,
eest_osaka_clz, and eest_prague_calldata gets its own package-level
eestDir = filepath.Join("..", "..", "..", "test-fixtures-cache",
"eest_stable", "fixtures"), and the local `dir` becomes
`filepath.Join(eestDir, "blockchain_tests")`.
Mirrors the eestDir restored in execution/tests/init_test.go (one
fewer "..", since that package sits one level shallower). Subpackages
need their own copy because Go test cwd is per-package and a single
constant can't share a relative path across both depths.
eest_devnet keeps its explicit path: it points at a different cache
subdir (eest_devnet/) and the user only asked for the same-path
sites.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # execution/tests/benchmark_engine_x_test.go
…constant
Two small follow-ups noted in the post-merge review:
* tools/test-fixtures.sh: extend the header comment to spell out
that keeping tarballs alongside extracted dirs roughly doubles
local disk vs. an extracted-only layout, and that CI works around
that by caching only *.tar.gz.
* cl/spectest/tests_test.go: factor the os.DirFS path into a
package-level mainnetDir constant for parity with the eestDir
variables in the EEST subpackages.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…st.go
Strip churn that crept in across the rename/extract iterations and
keep only the salient diff vs main:
* init_test.go: keep eestDir at its original second position in
the var block; only change is its filepath.
* benchmark_engine_x_test.go: restore preAllocDir variable name
and original declaration order; restore the
"// Parse all test files, group by subcategory." comment; drop
the gratuitous blank line after `logger := …`.
Net diff vs main is now just: ctx-based runner API (from main),
engineXDir pointing at the eest_benchmark cache subdir, and the
runner.Close cleanup.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
taratorio
approved these changes
May 6, 2026
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 24 out of 25 changed files in this pull request and generated 6 comments.
Comments suppressed due to low confidence (1)
Makefile:248
test-allnow depends ontest-fixtures, buttest-all-racestill runstest-filtereddirectly. On a clean checkout,make test-all-racewill fail unless the user manually ranmake test-fixturesfirst. Consider adding the sametest-fixturesprerequisite totest-all-race(while keepingtest-shortfixture-free).
test-all: override GO_FLAGS := -timeout $(default_test_timeout) $(GO_FLAGS)
test-all: test-fixtures test-filtered
## test-fixtures: download & verify pinned test fixture tarballs
.PHONY: test-fixtures
test-fixtures:
tools/test-fixtures.sh
## test-bench: check the benchmarks compile and run
test-bench: override GO_FLAGS += -run=^$$ -bench=. -benchtime=1x -short -timeout=5m
test-bench:
$(GOTEST)
test-all-race: override GO_FLAGS := -timeout $(default_test_race_timeout) $(GO_FLAGS) -race
test-all-race: test-filtered
`make test-all-race` now declares `test-fixtures` as a prerequisite, matching
`make test-all`. Drops the side-note in erigon-test-race/SKILL.md telling
users to run `make test-fixtures` manually.
`tools/test-fixtures.sh` installs an EXIT trap that removes the in-progress
iteration's `${tar_path}.tmp` and `${out_dir}.tmp` so a Ctrl-C or curl/tar
failure mid-flight doesn't leak a half-downloaded tarball or partially
extracted dir into the cache.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tc.)
Five small follow-ups from Copilot's second pass:
* tools/test-fixtures.sh: read & parse the manifest into a variable
*before* the loop and fail fast if jq errors. Process substitution
`< <(jq …)` masks failures from `set -e`, so a broken manifest used
to silently exit 0 having processed nothing.
* tools/test-fixtures.sh: add sha256sum/shasum to the up-front tool
check so a missing hasher fails with a clear message instead of
surfacing later as an empty awk pipeline.
* tools/test-fixtures.sh: pass `curl --retry 3 --retry-all-errors
--retry-delay 2` so transient network blips on cache-miss runs
don't fail CI.
* tools/test-fixtures.sh: extract with `--no-same-owner --no-same-
permissions` to avoid odd file ownership on shared systems.
sha256-pinning the tarball already covers tampered-content risk.
* Makefile: add `test-fixtures` as a prerequisite for `test-group`
and `test-sonar-coverage`. They run packages that need the
extracted fixtures (./cl/spectest, ./execution/tests/...) and
were previously expected to be run only when fixtures already
happened to be present.
Skipping the cl/spectest "skip when fixtures absent" suggestion —
that's a pre-existing footgun unchanged by this PR. Skipping the
tar path-traversal hardening — modern tar refuses absolute paths and
`..` parents by default; the manifest's sha256 pin closes the rest.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pre-PR, the cl/spectest test in `make test-all` was a silent no-op
(no `cl/spectest/tests/` directory existed in that workflow's
checkout). cl/spectest tests proper ran only via the
test-integration-caplin.yml workflow's `cd cl/spectest && make tests`,
which extracted the tarball *and* deleted six fork subdirs whose
fixtures crash the parallel state hasher with a nil-receiver panic
in `(*ExtraData).HashSSZ`:
mainnet/{eip6110,whisk,eip7441,eip7732,eip7805,gloas}
Post-PR, `make test-all` declares `test-fixtures` as a prereq, so
`tools/test-fixtures.sh` extracts cl_mainnet into the shared cache
and the cl/spectest test (now reading from
test-fixtures-cache/cl_mainnet/tests) starts running tests against
those previously-excluded forks. The latent CL bug surfaces and the
test-all-erigon and race CI jobs panic at
cl/cltypes/solid/extra_data.go:78.
Apply the six rm -rf calls inside `make test-fixtures` itself so the
exclusions hold for every consumer (test-all, test-group,
test-sonar-coverage, test-all-race, and `cd cl/spectest && make
tests`). Simplify cl/spectest/Makefile to just call
`$(MAKE) -C ../.. test-fixtures` so there's a single source of truth
for the list.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3 tasks
awskii
added a commit
that referenced
this pull request
May 22, 2026
Adopts the lazy-download manifest machinery introduced by #21002 instead of relying on the prior Git LFS path under execution/tests/execution-spec-tests/. - test-fixtures.json: add eest_zkevm entry pinning zkevm@v0.3.4 fixtures_zkevm.tar.gz (sha256 b9e3ab70..., 231977945 bytes). - Makefile: add a focused test-fixtures-zkevm target so workflows can pull just the zkevm tarball without forcing eest_stable/devnet/benchmark. - execution/tests/eest_zkevm_witness/witness_test.go: repoint the fixture walk root at test-fixtures-cache/eest_zkevm/fixtures/blockchain_tests, matching the tarball's internal layout (the script does not strip --strip-components). - .github/workflows/test-all-erigon-race.yml: when the matrix entry is execution-eest-zkevm, restore the cached tarball (keyed on hashFiles('test-fixtures.json')) and run make test-fixtures-zkevm before make test-group. Other matrix entries are unaffected.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Replaces the
eest-fixturesGit submodule (15+ GB of unpacked JSON fixtures behind Git LFS) with a lazy-download manifest. Tarballs are downloaded into a local cache and extracted there; tests read JSON files from the extracted directories using the existing directory-based test runner. The same machinery covers both execution-spec-tests fixtures andcl/spectest's consensus-spec-tests fixtures.Layout
test-fixtures.json— pinned manifest. Each entry hasurl,sha256,size, and (optionally)branch. Keys:eest_benchmark,eest_devnet,eest_stable,cl_mainnet.tools/test-fixtures.sh— bash script that downloads each tarball, sha256-verifies it, and extracts intotest-fixtures-cache/<key>/with a.sha256sentinel. Re-runs are no-ops when the sentinel matches; tarballs persist alongside the extracted dirs so re-extraction doesn't re-download.make test-fixturesinvokes the script.make test-alldepends on it;make test-shortdoes not.cl/spectest'smake testscalls the same script.test-all-erigon.ymlcaches onlytest-fixtures-cache/*.tar.gz(keyed onhashFiles('test-fixtures.json')); the script re-extracts on each run from the cached tarballs.test-hive-eest.ymlreads per-shard fixture URLs and the BAL hive branch from the manifest withjq; theeest-devnet/eest-hiveMake targets do the same.Migrated tests
These tests now read from the extracted cache via the existing
testutil.TestMatcher.Walk(orfilepath.WalkDirfor the engine-x benchmark):BenchmarkEngineX{Instruction,Precompile,Scenario}←eest_benchmarkTestExecutionSpecBlockchainand split-out siblings (eest_cancun_blobs,eest_frontier_scenarios,eest_osaka_clz,eest_prague_calldata) ←eest_stableTestExecutionSpecBlockchainDevnet←eest_devnetTestState←eest_stablecl/spectestmainnet suite ←cl_mainnetTestInvalidReceiptHashHighMgaskeeps reading its pre-allocs from in-repoexecution/tests/test-corners/(the only LFS pull left in CI).Trade-offs
*.tar.gzand re-extracting (~30–60 s) on each run.testutilto maintain alongsideWalk.