Skip to content

Better mutants testing #1180

Better mutants testing

Better mutants testing #1180

Workflow file for this run

name: Rust
on:
push:
branches:
- main
pull_request:
paths:
- Cargo.*
- .cargo/**
- .github/workflows/rust.yml
- src/**
- tests/**
- testdata/**
# see https://matklad.github.io/2021/09/04/fast-rust-builds.html
env:
CARGO_TERM_COLOR: always
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
CI: 1
RUST_BACKTRACE: short
RUSTFLAGS: "-W rust-2021-compatibility"
RUSTUP_MAX_RETRIES: 10
# TODO: Add -D warnings when that's clean on Windows.
jobs:
# Run tests just on Ubuntu to establish that things basically work,
# before launching mutants etc
quick-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- uses: swatinem/rust-cache@v2
- name: Show version
run: |
rustup show
cargo --version
rustc --version
- name: Test
run: >
cargo test --features fail/failpoints
tests:
needs: [quick-test]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest, windows-latest, macOS-latest]
features: ["", "s3"]
version: [stable, nightly, "1.74"]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.version }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.features }}
- name: Show version
run: |
rustup show
cargo --version
rustc --version
- name: Build
run: >
cargo build --all-targets --no-default-features --features=${{
matrix.features }} --features fail/failpoints
- name: Test
run: >
cargo test --no-default-features --features=${{ matrix.features }}
--features fail/failpoints -- --include-ignored
# Run rustfmt separately so that it does not block test results
rustfmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
components: rustfmt
- uses: Swatinem/rust-cache@v2
- name: rustfmt check
run: cargo fmt --all -- --check
# S3 integration tests can't run from CI because they need credentials, but we
# can at least make sure that they compile.
build-large-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- uses: swatinem/rust-cache@v2
- name: cargo build
run: cargo build --all-targets --features s3,s3-integration-test
clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- uses: swatinem/rust-cache@v2
- name: clippy
run: cargo clippy --all-targets -- --deny clippy::all
# Not all features can be run: s3 integration tests require credentials.
# But all of them should compile.
check-all-features:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- uses: swatinem/rust-cache@v2
- name: clippy
run: cargo clippy --all-targets --all-features -- --deny clippy::all
pr-mutants:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
needs: [quick-test]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Relative diff
run: |
git branch -av
git diff origin/${{ github.base_ref }}.. | tee git.diff
- uses: dtolnay/rust-toolchain@master
with:
toolchain: beta
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
name: Install cargo-mutants using install-action
with:
tool: cargo-mutants
- name: Mutants in diff
run: >
cargo mutants --no-shuffle -vV --in-diff git.diff --in-place -- --features
fail/failpoints
- name: Archive mutants.out
uses: actions/upload-artifact@v4
if: always()
with:
name: mutants-incremental.out
path: mutants.out
cargo-mutants:
runs-on: ubuntu-latest
needs: [quick-test]
strategy:
# We want to see all the missed mutants so don't fail fast.
fail-fast: false
matrix:
shard: [0, 1, 2, 3]
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: taiki-e/install-action@v2
name: Install cargo-mutants using install-action
with:
tool: cargo-mutants
- uses: dtolnay/rust-toolchain@master
with:
toolchain: stable
- uses: swatinem/rust-cache@v2
- name: Run mutant tests
# Don't use the S3 features because they require AWS credentials for realistic
# testing.
run: |
cargo mutants --no-shuffle -vV --cargo-arg=--no-default-features \
--in-place \
--baseline=skip --shard ${{ matrix.shard }}/4 \
-- \
--features fail/failpoints
- name: Archive results
uses: actions/upload-artifact@v4
if: always()
with:
name: mutants-${{ matrix.shard }}.out
path: mutants.out