Commit Graph

1 Commits

Author SHA1 Message Date
shankar0123 ad13ef3e4c test(deploy): cross-phase end-to-end atomicity + post-verify + idempotency + concurrency invariants
Phase 11 of the deploy-hardening I master bundle. Four end-to-end
integration tests under //go:build integration that exercise the
internal/deploy package's load-bearing invariants from outside the
package — proving they hold not just in unit tests but in the
full Apply pipeline.

deploy/test/deploy_e2e_test.go:

- TestDeploy_Atomicity_FileIsAlwaysOldOrNew — pin POSIX-rename
  atomicity. Reader hammers the destination during 30 alternating
  writes; if any read returns intermediate state (torn write), the
  test fails. Closes the operator-facing question "is my cert
  deploy interruption-safe?".

- TestDeploy_PostVerify_WrongCertTriggersRollback — simulate the
  post-deploy verify failure path. The PostCommit returns an error
  on the first call; the deploy package's automatic rollback fires
  + restores the previous bytes + re-calls PostCommit (which
  succeeds the second time). Final on-disk state matches the OLD
  bytes; the rollback wire works end-to-end.

- TestDeploy_Idempotency_SecondDeployIsNoOp — pin the SHA-256
  short-circuit. Defends against agent-restart retry storms that
  would otherwise hammer targets with no-op reloads. Second call
  with identical bytes calls neither PreCommit nor PostCommit.

- TestDeploy_Concurrent_SamePathsSerialize — N=8 simultaneous
  Apply calls to the same destination. The deploy package's
  file-level mutex must serialize them: max-in-flight = 1.

Run via:
  INTEGRATION=1 go test -tags integration -race \
    ./deploy/test/... -run Deploy

Tests live in package `integration` to match the existing
crl_ocsp_e2e_test.go convention; the //go:build integration tag
gates them out of normal `go test ./...` runs.

All 4 tests green. Race detector clean.

Phase 12 next: documentation (docs/deployment-atomicity.md +
README + connectors.md + disaster-recovery.md updates).
2026-04-30 15:27:11 +00:00