Skip to content

test-fixtures: lazy-download manifest replaces eest-fixtures submodule#21002

Merged
yperbasis merged 36 commits into
mainfrom
yperbasis/targz
May 6, 2026
Merged

test-fixtures: lazy-download manifest replaces eest-fixtures submodule#21002
yperbasis merged 36 commits into
mainfrom
yperbasis/targz

Conversation

@yperbasis

@yperbasis yperbasis commented May 5, 2026

Copy link
Copy Markdown
Member

Summary

Replaces the eest-fixtures Git 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 and cl/spectest's consensus-spec-tests fixtures.

Layout

  • test-fixtures.json — pinned manifest. Each entry has url, 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 into test-fixtures-cache/<key>/ with a .sha256 sentinel. Re-runs are no-ops when the sentinel matches; tarballs persist alongside the extracted dirs so re-extraction doesn't re-download.
  • make test-fixtures invokes the script. make test-all depends on it; make test-short does not. cl/spectest's make tests calls the same script.
  • CI: test-all-erigon.yml caches only test-fixtures-cache/*.tar.gz (keyed on hashFiles('test-fixtures.json')); the script re-extracts on each run from the cached tarballs. test-hive-eest.yml reads per-shard fixture URLs and the BAL hive branch from the manifest with jq; the eest-devnet / eest-hive Make targets do the same.

Migrated tests

These tests now read from the extracted cache via the existing testutil.TestMatcher.Walk (or filepath.WalkDir for the engine-x benchmark):

  • BenchmarkEngineX{Instruction,Precompile,Scenario}eest_benchmark
  • TestExecutionSpecBlockchain and split-out siblings (eest_cancun_blobs, eest_frontier_scenarios, eest_osaka_clz, eest_prague_calldata) ← eest_stable
  • TestExecutionSpecBlockchainDevneteest_devnet
  • TestStateeest_stable
  • cl/spectest mainnet suite ← cl_mainnet

TestInvalidReceiptHashHighMgas keeps reading its pre-allocs from in-repo execution/tests/test-corners/ (the only LFS pull left in CI).

Trade-offs

  • Local disk: keeping tarballs alongside extracted dirs roughly doubles cache disk usage (~12 GB total with all four tarballs). The trade-off is cheap re-extraction without re-download; CI sidesteps this by caching only *.tar.gz and re-extracting (~30–60 s) on each run.
  • No tar streaming in tests: tests use ordinary directory walking — no parallel tar/gzip traversal in testutil to maintain alongside Walk.

yperbasis and others added 2 commits May 5, 2026 17:16
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>
@yperbasis yperbasis added the QA label May 5, 2026
yperbasis and others added 15 commits May 5, 2026 19:44
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>
@yperbasis yperbasis changed the title execution/tests: read engine-x benchmark fixtures from tar.gz test-fixtures: lazy-download manifest replaces eest-fixtures submodule May 5, 2026
@yperbasis yperbasis requested a review from Copilot May 5, 2026 19:56
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>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.json manifest and tools/test-fixtures.sh to download/verify fixture tarballs into test-fixtures-cache/.
  • Update execution tests to stream .json fixtures from cached tarballs via TestMatcher.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 the eest-fixtures submodule 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.

Comment thread Makefile Outdated
Comment thread Makefile Outdated
Comment thread execution/tests/testutil/matcher.go Outdated
Comment thread execution/tests/testutil/matcher.go Outdated
Comment thread execution/tests/benchmark_engine_x_test.go Outdated
yperbasis and others added 2 commits May 5, 2026 22:03
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>
@yperbasis yperbasis marked this pull request as ready for review May 5, 2026 20:14
yperbasis and others added 11 commits May 6, 2026 10:17
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>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-all now depends on test-fixtures, but test-all-race still runs test-filtered directly. On a clean checkout, make test-all-race will fail unless the user manually ran make test-fixtures first. Consider adding the same test-fixtures prerequisite to test-all-race (while keeping test-short fixture-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

Comment thread tools/test-fixtures.sh Outdated
Comment thread tools/test-fixtures.sh
Comment thread tools/test-fixtures.sh
Comment thread tools/test-fixtures.sh
Comment thread cl/spectest/tests_test.go
Comment thread Makefile
yperbasis and others added 3 commits May 6, 2026 12:27
`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>
@yperbasis yperbasis enabled auto-merge May 6, 2026 11:38
@yperbasis yperbasis added this pull request to the merge queue May 6, 2026
@github-merge-queue github-merge-queue Bot removed this pull request from the merge queue due to failed status checks May 6, 2026
@yperbasis yperbasis added this pull request to the merge queue May 6, 2026
Merged via the queue into main with commit ef9b48f May 6, 2026
37 checks passed
@yperbasis yperbasis deleted the yperbasis/targz branch May 6, 2026 13:00
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants