diff --git a/.config/nextest.toml b/.config/nextest.toml index 4b435fe07..c4efee7cc 100644 --- a/.config/nextest.toml +++ b/.config/nextest.toml @@ -77,3 +77,19 @@ retries = 2 filter = 'package(rustfs-ecstore) & test(/^store::bucket::tests::bucket_delete_(mark_delete_marks|purge_removes|default_s3_delete)/)' test-group = 'ecstore-serial-flaky' retries = 2 + +# --------------------------------------------------------------------------- +# e2e-smoke profile — PR smoke subset of the e2e_test crate (backlog#1149 ci-4) +# --------------------------------------------------------------------------- +# PR smoke subset of the e2e_test crate (backlog#1149 ci-4). This profile is +# the single wiring mechanism for e2e tests in CI: other suites join by +# extending this filter (or a sibling profile), never by adding ad-hoc e2e +# jobs to ci.yml. Admission criteria (see crates/e2e_test/README.md): fast, +# single-node topology, no external dependencies (no awscurl / Vault / fixed +# ports / pre-started server), no #[ignore]. +# +# Each e2e test spawns its own rustfs server on a random port with an isolated +# temp dir (crates/e2e_test/src/common.rs), so the subset is parallel-safe. +[profile.e2e-smoke] +default-filter = 'package(e2e_test) & test(/^(delete_marker_migration_semantics|version_id_regression|list_objects_v2_pagination|list_object_versions_regression|list_objects_duplicates|list_buckets_double_slash|leading_slash_key|special_chars|create_bucket_region|delete_objects_versioning|head_object_consistency|head_object_range|copy_object_metadata|copy_source_invalid_date|content_encoding|anonymous_access|bucket_policy_check)_test::/)' +fail-fast = false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2145b4490..7f02d69de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -353,7 +353,7 @@ jobs: - name: Checkout repository uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 - # Full setup with dependency caching: the migration-proof step below + # Full setup with dependency caching: the smoke-suite step below # compiles the e2e_test crate, which pulls in most of the workspace. # Without a restored cache this was a cold multi-GB build on every run. - name: Setup Rust environment @@ -375,8 +375,13 @@ jobs: - name: Make binary executable run: chmod +x ./target/debug/rustfs - - name: Run delete-marker migration proof - run: cargo test -p e2e_test delete_marker_migration_semantics -- --nocapture --test-threads=1 + # PR smoke subset of the in-repo e2e suite (backlog#1149 ci-4). The + # profile.e2e-smoke default-filter in .config/nextest.toml is the single + # wiring mechanism for e2e tests in CI — extend that filter instead of + # adding new e2e jobs here. Each test spawns its own rustfs server on a + # random port and reuses the downloaded debug binary above. + - name: Run e2e smoke suite + run: cargo nextest run --profile e2e-smoke -p e2e_test - name: Install s3s-e2e test tool uses: taiki-e/cache-cargo-install-action@7447f04c51f2ba27ca35e7f1e28fab848c5b3ba7 # v2 diff --git a/.gitignore b/.gitignore index f22ceed7e..cc7612e39 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,8 @@ docs/* !docs/testing/** !docs/superpowers/ !docs/superpowers/** +!docs/testing/ +!docs/testing/** docs/heal-scanner-logging-governance.md docs/benchmark/rustfs-target-bench/ docs/benchmark/*.md diff --git a/crates/e2e_test/README.md b/crates/e2e_test/README.md index e69de29bb..8a304d2ff 100644 --- a/crates/e2e_test/README.md +++ b/crates/e2e_test/README.md @@ -0,0 +1,51 @@ +# e2e_test + +End-to-end test suite for RustFS. Tests spawn a real `rustfs` binary (see +`src/common.rs`) and drive it with the AWS SDK. + +> This README currently only documents the CI smoke subset (backlog#1149 +> ci-4). The full contributor guide — how to add a case, fixture helpers, +> `#[ignore]` semantics, harness topologies — is tracked as backlog#1153 +> infra-10 and will extend this file. + +## CI smoke subset (`--profile e2e-smoke`) + +A subset of this crate runs on every PR via the `e2e-tests` job: + +```bash +cargo nextest run --profile e2e-smoke -p e2e_test +``` + +The selection lives in `.config/nextest.toml` under `[profile.e2e-smoke]` +(`default-filter`). That filter is the **single wiring mechanism** for e2e +tests in CI — extend it (or add a sibling profile) instead of adding new e2e +jobs to `ci.yml`. + +### Admission criteria for the smoke subset + +A test module may join the smoke filter only if every test in it is: + +1. **Fast** — single-digit seconds per test; the whole subset must keep the + `e2e-tests` job ≤ 20 minutes. +2. **Single-node** — spawns its own server via + `RustFSTestEnvironment`/`start_rustfs_server` on a random port with an + isolated temp dir. No `RustFSTestClusterEnvironment`, no fixed ports. +3. **Dependency-free** — no pre-started server at `localhost:9000`, no Vault, + no fixed protocol ports. Tools that may be absent on the runner (e.g. + `awscurl`) are acceptable only when the test skips gracefully with a + visible log line (see `bucket_policy_check_test.rs`). +4. **Not `#[ignore]`** — ignored tests are activation work (backlog#1149 + ci-13 / backlog#1148 ilm-3), not smoke candidates. + +Note on `#[serial]`: nextest runs each test in its own process, so +`serial_test`'s in-process mutex does **not** serialize across tests there +(see the header of `.config/nextest.toml`). Smoke tests must therefore be +parallel-safe by construction (random port + isolated temp dir), which the +current subset is. + +### Authoritative test inventory + +`docs/testing/e2e-suite-inventory.md` records the per-module test counts as +listed by `cargo nextest list -p e2e_test`. Regenerate it when adding or +moving e2e tests so acceptance numbers in the test-strategy issues +(backlog#1147–#1155) stay auditable. diff --git a/docs/testing/e2e-suite-inventory.md b/docs/testing/e2e-suite-inventory.md new file mode 100644 index 000000000..cd3ea2de6 --- /dev/null +++ b/docs/testing/e2e-suite-inventory.md @@ -0,0 +1,62 @@ +# e2e_test suite inventory + +> Authoritative per-module test counts for the `e2e_test` crate (backlog#1149 +> ci-4), generated from `cargo nextest list -p e2e_test`. Regenerate with: +> ```bash +> cargo nextest list -p e2e_test | grep "^ " | sed "s/^ *//;s/::.*//" | sort | uniq -c +> ``` +> Modules marked ✅ are in the PR smoke profile `e2e-smoke` +> (`.config/nextest.toml`); admission criteria: `crates/e2e_test/README.md`. +> Note: counts exclude `#[ignore]`d tests (nextest lists them separately). + +| module | tests | PR smoke | +|---|---|---| +| admin_timeout_regression_test | 1 | | +| anonymous_access_test | 3 | ✅ | +| archive_download_integrity_test | 13 | | +| bucket_logging_test | 3 | | +| bucket_policy_check_test | 1 | ✅ | +| checksum_upload_test | 6 | | +| cluster_concurrency_test | 2 | | +| common | 3 | | +| compression_test | 1 | | +| content_encoding_test | 3 | ✅ | +| copy_object_metadata_test | 1 | ✅ | +| copy_object_version_restore_test | 1 | | +| copy_source_invalid_date_test | 1 | ✅ | +| create_bucket_region_test | 2 | ✅ | +| delete_marker_migration_semantics_test | 2 | ✅ | +| delete_object_no_content_length_test | 1 | | +| delete_objects_versioning_test | 2 | ✅ | +| existing_object_tag_policy_test | 4 | | +| head_object_consistency_test | 1 | ✅ | +| head_object_range_test | 1 | ✅ | +| heal_erasure_disk_rebuild_test | 3 | | +| kms | 40 | | +| leading_slash_key_test | 2 | ✅ | +| list_buckets_double_slash_test | 3 | ✅ | +| list_object_versions_metadata_extension_test | 1 | | +| list_object_versions_regression_test | 2 | ✅ | +| list_objects_duplicates_test | 3 | ✅ | +| list_objects_v2_metadata_extension_test | 1 | | +| list_objects_v2_pagination_test | 12 | ✅ | +| mc_mirror_small_bucket_test | 1 | | +| multipart_auth_test | 109 | | +| namespace_lock_quorum_test | 2 | | +| object_lambda_test | 16 | | +| object_lock | 33 | | +| overwrite_cleanup_regression_test | 1 | | +| protocols | 16 | | +| quota_test | 13 | | +| reliability_disk_fault_test | 3 | | +| reliant | 6 | | +| replication_extension_test | 36 | | +| security_boundary_test | 4 | | +| server_startup_failfast_test | 1 | | +| snowball_auto_extract_test | 6 | | +| special_chars_test | 14 | ✅ | +| stale_multipart_cleanup_cluster_test | 1 | | +| tls_gen | 3 | | +| version_id_regression_test | 10 | ✅ | + +**Total listed: 394 tests across 47 modules · PR smoke subset: 63 tests / 17 modules** · generated 2026-07-10.