Skip to content

test: forge-only integration tests (itest) — curated versity partition against the smelt stack - #38

Merged
frrist merged 1 commit into
mainfrom
forge-e2e-via-smelt
Jul 14, 2026
Merged

test: forge-only integration tests (itest) — curated versity partition against the smelt stack#38
frrist merged 1 commit into
mainfrom
forge-e2e-via-smelt

Conversation

@frrist

@frrist frrist commented Jul 14, 2026

Copy link
Copy Markdown
Member

Ingot now owns its integration tests, and every test runs against the real forge-mode deployment — there is no in-memory ingot under test anywhere.

What this does

  • Adds the itest build tag and make itest — a new itest/ package boots the smelt Forge stack (smelt as a Go test dependency) and bind-mounts a build of the working tree over the published image. CI gates it behind unit tests (go-test.yml: unititest).
  • Brings in the forge-based tests (previously hosted in smelt):
    • TestForgeVersity — the S3 conformance partition: per upstream versitygw group, a curated pass table and a known-fail (XFail) table. 189 pass / 102 xfail / 2 skips; an XFail case that starts passing errors so it gets promoted.
    • TestForgeScenarios — ingot-unique behavior (blob-split/spool-by-digest, zero-byte objects, part-spans-blobs multipart, failed-Complete recovery) on a small-max_blob_size config.
    • TestForgeNativeProvision, TestForgeReadAfterEviction — onboarding and the network read tier.
  • Removes the in-process, non-forge tests: the in-memory harness (StartHarness + inmem wiring), smoke_test.go, the multipart/blobsplit harness tests, and the versity suite-runner machinery. testing/ shrinks to S3-client glue (Config, NewS3Conf, roundtrip helpers). Coverage moved, it didn't shrink — the curated partition now also covers all of CopyObject and the 7 multipart groups, which the old lists missed.

Try it

make test    # unit — seconds, no Docker
make itest   # integration — full stack in Docker, ~6-8 min
go test -tags itest ./itest -run 'TestForgeVersity/PutObject/success' -v   # one case

See itest/README.md for the category table and curation rules.

🤖 Generated with Claude Code

…t the smelt stack

Two changes folded together: ingot owns its integration tests (previously
hosted in smelt), and there is no in-memory ingot under test anywhere —
the deployment tested is always the real forge-mode daemon.

itest/ (build tag itest) boots the full smelt Forge stack via
github.com/fil-forge/smelt/pkg/stack and bind-mounts a CGO_ENABLED=0
build of THIS working tree over the published image's /usr/bin/ingot.
Compose files and configs travel with the Go import (go:embed) — no
smelt checkout needed.

The S3 surface is gated by the curated-partition format (formerly
smoke_test.go's, now against the real deployment): per upstream
versitygw group, a pass table (every case must pass) and an XFail table
(known failures, reported as SKIP; an unexpected pass errors so the case
gets promoted). One shared stack serves all categories
(TestForgeVersity); ListBuckets runs first because its exact-listing
cases need the pristine stack. Coverage grew: the old lists missed 16 of
31 CopyObject cases and all 7 multipart groups — all partitioned
empirically now (189 pass / 102 xfail / 2 position-sensitive skips).

The in-memory harness world is deleted: harness.go (StartHarness + inmem
wiring), smoke_test.go, multipart/blobsplit/harness/run-capture tests,
and the versity suite-runner machinery (Run/RunT/Suite/stdout capture) —
the curated tables invoke upstream cases directly. testing/ shrinks to
S3-client glue: Config, exported NewS3Conf, roundtrip helpers.
Ingot-unique assertions were ported to run over the stack
(scenarios_test.go, one small-max_blob_size stack via smelt's
WithServiceConfig + testdata/config-smallblob.yaml): blob-split
round-trip with spooled-by-digest proof (spool counted inside the
container), zero-byte objects, a multipart part spanning multiple
internal blobs, and failed-Complete session recovery. Assertions
duplicating upstream coverage (abort semantics) were dropped.

Test pattern, locally and in CI: make test (unit, seconds, no Docker) →
make itest (integration, ~6 min); the CI itest job runs only after the
unit job passes (go-test.yml two stages; separate e2e workflow removed).

Also: TestForgeNativeProvision (guppy-free onboarding + ship-path
round-trip) and TestForgeReadAfterEviction (read tier re-fetches from
piri after spool wipe), each on their own stack.

deps: smelt pin pulls newer spf13/genproto — the pre-split genproto
monolith pruned away entirely, resolving the ambiguous-import collision
documented in smelt's DEVELOPING.md without a replace.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@frrist frrist self-assigned this Jul 14, 2026
@frrist
frrist requested a review from alanshaw July 14, 2026 20:36
@frrist frrist changed the title test: smelt-based integration tests test: forge-only integration tests (itest) — curated versity partition against the smelt stack Jul 14, 2026
@frrist
frrist merged commit 1c3c2dd into main Jul 14, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant