Skip to content

feat(LinuxTentacleE2E): Phase 12.M.L.B.0 — LinuxTentacleBinaryFixture (real binary build)

Summary

Big-infrastructure PR. UNBLOCKS Section B (service-lifecycle CLI), Section C (register), and Section G (multi-instance) — none of these can be tested with the bash-script placeholder used for upgrade-flow E2E.

User direction (option a3 of self-audit after 26-test stage close): build the real binary fixture as a one-time investment to unlock the most important remaining functionality (register + service-lifecycle).

Strategy

Aspect Choice Rationale
Build flags Mirror production CI exactly Same as build-publish-linux-tentacle.yml: -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=true -p:Version=<stamp>
Cache location bin/squid-tentacle-binary-fixture/linux-x64/ Stable path under bin/, survives between runs, cleared by dotnet clean
Concurrency Process-wide singleton via static lock First test triggers ~30-60s build, subsequent reuse instantly
Skip-on-non-Linux IsAvailable checks Linux + dotnet on PATH Self-contained linux-x64 binary won't run on macOS/Windows

Why a real binary, not a placeholder

Without real binary With real binary
service install writes systemd unit pointing at fake binary → unit fails to start Real binary path → real systemd start works
register requires real REST POST + cert validation Production binary handles it
create-instance walks real config dir layouts Production binary's InstanceRegistry does it
Would need Tier 🟡 mocking Stays at Tier 🟢 H per Rule 12.4

Scope of THIS PR

Smallest viable foundation + 2 smoke tests:

  • LinuxTentacleBinaryFixture infrastructure (build + cache + run helper)
  • LinuxTentacleE2ECategories.TentacleBinary trait constant
  • tentacle-linux-e2e.yml workflow filter updated
  • Smoke test class:
    • Binary_Version_PrintsBuildVersionStamp — proves build pipeline + AssemblyVersion.Canonical regression check
    • Binary_NoArgs_FailsClearlyWithoutHanging — sanity for default RunCommand path

What this PR does NOT include

Deferred to follow-up PRs to keep this reviewable:

  • J.M.L.C.1+ register E2E (needs StubSquidServer-equivalent for Linux project)
  • J.M.L.B.1+ service install/start/stop E2E (uses this fixture + LinuxServiceFixture, no server needed)
  • J.M.L.G.1+ multi-instance E2E

Fidelity tier

🔵 Fixture-only (Rule 12) for the smoke tests. Downstream production-flow tests (J.M.L.B.1+ / J.M.L.C.1+) that USE this fixture will be tier 🟢 H.

Expected runtime

  • Cold (first run): 30-60s for dotnet publish
  • Warm (subsequent): <100ms per test
  • CI ubuntu-latest with cold NuGet cache: ~60-90s for first build

Test plan

  • Linux E2E workflow runs (manual workflow_dispatch after merge)
  • Binary_Version_PrintsBuildVersionStamp passes within 90s (first runner; build + assert)
  • Binary_NoArgs_FailsClearlyWithoutHanging passes within ~5s (uses cached binary)
  • No regression on existing 26 Linux E2E tests
  • Workflow filter picks up new Category=LinuxTentacleBinaryE2E traited tests

🤖 Generated with Claude Code

Merge request reports

Loading