test(parity): differential rsync 3.4.1 parity gate + CI #300

Merged
TapTap merged 1 commits from feat/parity-gate into dev 2026-09-18 22:18:53 +02:00
Owner

Differential rsync-parity CI gate

Adds an automated gate that runs real rsync 3.4.1 and FastSync over the same generated corpora and compares the destination trees (paths, contents, symlink targets, modes) plus normalized stdout for output-oriented flags.

New:

  • tests/integration/test_differential_parity.py — 49 tests (43 table cases + 6 standalone).
  • tests/integration/parity_harness.py — corpus/runner/comparator reusing common.py.
  • tests/integration/parity_caveats.py — data-driven allowlist for the documented ⚠️/❌ residuals; an unlisted diff fails with a readable tree/stdout diff, and an allowlisted-but-now-matching case warns (fails under FASTSYNC_PARITY_STRICT=1).
  • tests/integration/README.md, AGENTS.md pointer.
  • .gitea/workflows/ci.yaml: fast parity_ci subset on pull_request, full parity (strict) on push.

No production code changes. Verified: gate 49/50 pass, fast subset 15, full suite green with the gate included.

Stacks under the follow-up parity-fix PR (which shrinks the allowlist).

## Differential rsync-parity CI gate Adds an automated gate that runs **real `rsync 3.4.1`** and FastSync over the same generated corpora and compares the destination trees (paths, contents, symlink targets, modes) plus normalized stdout for output-oriented flags. New: - `tests/integration/test_differential_parity.py` — 49 tests (43 table cases + 6 standalone). - `tests/integration/parity_harness.py` — corpus/runner/comparator reusing `common.py`. - `tests/integration/parity_caveats.py` — data-driven allowlist for the documented ⚠️/❌ residuals; an unlisted diff fails with a readable tree/stdout diff, and an allowlisted-but-now-matching case warns (fails under `FASTSYNC_PARITY_STRICT=1`). - `tests/integration/README.md`, `AGENTS.md` pointer. - `.gitea/workflows/ci.yaml`: fast `parity_ci` subset on `pull_request`, full `parity` (strict) on `push`. No production code changes. Verified: gate 49/50 pass, fast subset 15, full suite green with the gate included. Stacks under the follow-up parity-fix PR (which shrinks the allowlist).
TapTap added 1 commit 2026-09-18 22:15:51 +02:00
test(parity): add differential rsync-parity CI gate
CI / lint (pull_request) Successful in 1m42s
CI / parity-full (pull_request) Skipped
CI / sanitizers (address) (pull_request) Skipped
CI / sanitizers (undefined) (pull_request) Skipped
CI / fuzz-build (pull_request) Skipped
CI / coverage (pull_request) Skipped
CI / valgrind (pull_request) Skipped
CI / parity-fast (pull_request) Successful in 19s
CI / build-and-test (pull_request) Successful in 48s
b705fb807f
Add tests/integration/test_differential_parity.py plus a shared
parity_harness.py and a data-driven parity_caveats.py allowlist.  The gate
runs real rsync 3.4.1 and FastSync over the same corpora, compares the
destination trees (paths, hashes, symlink targets, modes, hard-link
grouping) and the normalized -i/--stats/--out-format output, and fails on
any difference not listed in the allowlist.  Stale allowlist entries warn
(or fail under FASTSYNC_PARITY_STRICT=1) so the residual list shrinks.

Register parity/parity_ci markers and wire a fast PR job (parity_ci) plus a
push-only full job (parity, strict) into .gitea/workflows/ci.yaml.
Document the gate and the allowlist workflow in tests/integration/README.md.
TapTap merged commit ae037cc27b into dev 2026-09-18 22:18:53 +02:00
TapTap deleted branch feat/parity-gate 2026-09-18 22:18:54 +02:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: TapTap/FastSync#300