name: Tests
on:
workflow_call:
inputs:
rust-version:
description: "The version of the rust compiler to run"
type: string
default: "stable"
flaky:
description: "Whether to also run flaky tests"
type: boolean
default: false
git-ref:
description: "Which git ref to checkout"
type: string
default: ${{ github.ref }}
env:
RUST_BACKTRACE: 1
RUSTFLAGS: -Dwarnings
RUSTDOCFLAGS: -Dwarnings
SCCACHE_CACHE_SIZE: "10G"
CRATES_LIST: "iroh-quinn,iroh-quinn-proto,iroh-quinn-udp"
NEXTEST_VERSION: "0.9.80"
jobs:
build_and_test_nix:
timeout-minutes: 30
name: "Tests"
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
name: [ubuntu-latest, macOS-arm-latest]
rust: ["${{ inputs.rust-version }}"]
features: [all, none, default]
include:
- name: ubuntu-latest
os: ubuntu-latest
release-os: linux
release-arch: amd64
runner: [self-hosted, linux, X64]
- name: macOS-arm-latest
os: macOS-latest
release-os: darwin
release-arch: aarch64
runner: [self-hosted, macOS, ARM64]
env:
RUSTC_WRAPPER: "sccache"
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ inputs.git-ref }}
- name: Install ${{ matrix.rust }} rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
- name: Install cargo-nextest
uses: taiki-e/install-action@v2
with:
tool: nextest@${{ env.NEXTEST_VERSION }}
- name: Install sccache
uses: mozilla-actions/sccache-action@v0.0.9
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: 'stable'
- name: Select features
run: |
case "${{ matrix.features }}" in
all)
echo "FEATURES=--all-features" >> "$GITHUB_ENV"
;;
none)
echo "FEATURES=--no-default-features" >> "$GITHUB_ENV"
;;
default)
echo "FEATURES=" >> "$GITHUB_ENV"
;;
*)
exit 1
esac
- name: check features
if: ${{ ! inputs.flaky }}
run: |
for i in ${CRATES_LIST//,/ }
do
echo "Checking $i $FEATURES"
targets="--lib --bins"
echo cargo check -p $i $FEATURES $targets
cargo check -p $i $FEATURES $targets
done
env:
RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
- name: build tests
run: |
cargo nextest run --workspace --exclude fuzz ${{ env.FEATURES }} --lib --bins --tests --no-run
- name: list ignored tests
run: |
cargo nextest list --workspace --exclude fuzz ${{ env.FEATURES }} --lib --bins --tests --run-ignored ignored-only
- name: run tests
run: |
mkdir -p output
cargo nextest run --workspace --exclude fuzz ${{ env.FEATURES }} --lib --bins --tests --profile ci --run-ignored ${{ inputs.flaky && 'all' || 'default' }} ${{ inputs.flaky && '--verbose' || '' }} --no-fail-fast --message-format ${{ inputs.flaky && 'libtest-json' || 'human' }} > output/${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
env:
RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
NEXTEST_EXPERIMENTAL_LIBTEST_JSON: 1
- name: upload results
if: ${{ failure() && inputs.flaky }}
uses: actions/upload-artifact@v5
with:
name: libtest_run_${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
path: output
retention-days: 45
compression-level: 0
- name: doctests
if: ${{ (! inputs.flaky) && matrix.features == 'all' }}
env:
RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
run: |
cargo test --workspace --all-features --doc
- name: Check doctest features
if: ${{ ! inputs.flaky }}
env:
RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
run: |
for i in ${CRATES_LIST//,/ }
do
echo "Checking $i doctest $FEATURES"
echo cargo test -p $i --doc $FEATURES
cargo test -p $i --doc $FEATURES
done
build_and_test_windows:
timeout-minutes: 30
name: "Tests"
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
name: [windows-latest]
rust: ["${{ inputs.rust-version}}"]
features: [all, none, default]
target:
- x86_64-pc-windows-msvc
include:
- name: windows-latest
os: windows
runner: [self-hosted, windows, x64]
env:
RUSTC_WRAPPER: "sccache"
BINDGEN_EXTRA_CLANG_ARGS: "--target=x86_64-pc-windows-msvc"
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ inputs.git-ref }}
- name: Install ${{ matrix.rust }}
run: |
rustup toolchain install ${{ matrix.rust }}
rustup toolchain default ${{ matrix.rust }}
rustup target add ${{ matrix.target }}
rustup set default-host ${{ matrix.target }}
- name: Cache cargo-nextest
id: cache-nextest
uses: actions/cache@v4
with:
path: ~/.cargo/bin/cargo-nextest.exe
key: nextest-windows-${{ env.NEXTEST_VERSION }}
- name: Install cargo-nextest
if: steps.cache-nextest.outputs.cache-hit != 'true'
shell: powershell
run: |
$tmp = New-TemporaryFile | Rename-Item -NewName { $_ -replace 'tmp$', 'zip' } -PassThru
Invoke-WebRequest -OutFile $tmp https://get.nexte.st/${{ env.NEXTEST_VERSION }}/windows
$outputDir = if ($Env:CARGO_HOME) { Join-Path $Env:CARGO_HOME "bin" } else { "~/.cargo/bin" }
$tmp | Expand-Archive -DestinationPath $outputDir -Force
$tmp | Remove-Item
- name: Select features
run: |
switch ("${{ matrix.features }}") {
"all" {
echo "FEATURES=--all-features" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
}
"none" {
echo "FEATURES=--no-default-features" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
}
"default" {
echo "FEATURES=" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
}
default {
Exit 1
}
}
- name: Install sccache
uses: mozilla-actions/sccache-action@v0.0.9
- uses: msys2/setup-msys2@v2
with:
release: false
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: 'stable'
- name: Install NASM
uses: ilammy/setup-nasm@v1
- name: Cache Strawberry Perl
id: cache-perl
uses: actions/cache@v4
with:
path: C:\Strawberry
key: strawberry-perl-5.38.2.2
- name: Install Strawberry Perl
if: steps.cache-perl.outputs.cache-hit != 'true'
run: |
Invoke-WebRequest -Uri "https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_53822_64bit/strawberry-perl-5.38.2.2-64bit-portable.zip" -OutFile perl.zip
Expand-Archive perl.zip -DestinationPath C:\Strawberry -Force
- name: Add Perl to PATH
run: |
echo "C:\Strawberry\perl\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "C:\Strawberry\c\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: Install cmake
uses: lukka/get-cmake@latest
- name: Cache LLVM
id: cache-llvm
uses: actions/cache@v4
with:
path: C:\Program Files\LLVM
key: llvm-17.0.6-windows
- name: Install LLVM
if: steps.cache-llvm.outputs.cache-hit != 'true'
run: |
$llvmUrl = "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/LLVM-17.0.6-win64.exe"
Invoke-WebRequest -Uri $llvmUrl -OutFile llvm-installer.exe
Start-Process -FilePath .\llvm-installer.exe -ArgumentList "/S" -Wait
- name: Add LLVM to PATH
run: |
echo "C:\Program Files\LLVM\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "LIBCLANG_PATH=C:\Program Files\LLVM\bin" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Setup MSVC dev environment
uses: ilammy/msvc-dev-cmd@v1
- name: build tests
run: |
cargo nextest run --workspace --exclude fuzz ${{ env.FEATURES }} --lib --bins --tests --target ${{ matrix.target }} --no-run
- name: list ignored tests
run: |
cargo nextest list --workspace --exclude fuzz ${{ env.FEATURES }} --lib --bins --tests --target ${{ matrix.target }} --run-ignored ignored-only
- name: tests
run: |
mkdir -p output
cargo nextest run --workspace --exclude fuzz ${{ env.FEATURES }} --lib --bins --tests --profile ci --target ${{ matrix.target }} --run-ignored ${{ inputs.flaky && 'all' || 'default' }} --no-fail-fast --message-format ${{ inputs.flaky && 'libtest-json' || 'human' }} > output/${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
env:
RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
NEXTEST_EXPERIMENTAL_LIBTEST_JSON: 1
- name: upload results
if: ${{ failure() && inputs.flaky }}
uses: actions/upload-artifact@v5
with:
name: libtest_run_${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
path: output
retention-days: 1
compression-level: 0
minimal-crates:
timeout-minutes: 45
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
name: [ubuntu-latest, macOS-arm-latest]
include:
- name: ubuntu-latest
os: ubuntu-latest
release-os: linux
release-arch: amd64
runner: [self-hosted, linux, X64]
- name: macOS-arm-latest
os: macOS-latest
release-os: darwin
release-arch: aarch64
runner: [self-hosted, macOS, ARM64]
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@nightly
- name: Install Go (required for aws-lc-rs FIPS)
uses: actions/setup-go@v5
with:
go-version: "stable"
cache: false
- name: cargo check
run: |
rm -f Cargo.lock
cargo +nightly check -Z minimal-versions --workspace --exclude fuzz --all-features --lib --bins
minimal-crates-windows:
timeout-minutes: 30
name: "Minimal Crates (Windows)"
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
name: [windows-latest]
rust: ["${{ inputs.rust-version}}"]
target:
- x86_64-pc-windows-msvc
include:
- name: windows-latest
os: windows
runner: [self-hosted, windows, x64]
env:
RUSTC_WRAPPER: "sccache"
BINDGEN_EXTRA_CLANG_ARGS: "--target=x86_64-pc-windows-msvc"
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ inputs.git-ref }}
- name: Install Rust nightly
run: |
rustup toolchain install nightly
rustup target add ${{ matrix.target }}
rustup set default-host ${{ matrix.target }}
- name: Install sccache
uses: mozilla-actions/sccache-action@v0.0.9
- uses: msys2/setup-msys2@v2
with:
release: false
- name: Install cmake
uses: lukka/get-cmake@latest
- name: Install NASM
uses: ilammy/setup-nasm@v1
- name: Cache Strawberry Perl
id: cache-perl
uses: actions/cache@v4
with:
path: C:\Strawberry
key: strawberry-perl-5.38.2.2
- name: Install Strawberry Perl
if: steps.cache-perl.outputs.cache-hit != 'true'
run: |
Invoke-WebRequest -Uri "https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_53822_64bit/strawberry-perl-5.38.2.2-64bit-portable.zip" -OutFile perl.zip
Expand-Archive perl.zip -DestinationPath C:\Strawberry -Force
- name: Add Perl to PATH
run: |
echo "C:\Strawberry\perl\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "C:\Strawberry\c\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: Install Go (required for aws-lc-rs FIPS)
uses: actions/setup-go@v5
with:
go-version: "stable"
cache: false
- name: Cache LLVM
id: cache-llvm
uses: actions/cache@v4
with:
path: C:\Program Files\LLVM
key: llvm-17.0.6-windows
- name: Install LLVM
if: steps.cache-llvm.outputs.cache-hit != 'true'
run: |
$llvmUrl = "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/LLVM-17.0.6-win64.exe"
Invoke-WebRequest -Uri $llvmUrl -OutFile llvm-installer.exe
Start-Process -FilePath .\llvm-installer.exe -ArgumentList "/S" -Wait
- name: Add LLVM to PATH
run: |
echo "C:\Program Files\LLVM\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "LIBCLANG_PATH=C:\Program Files\LLVM\bin" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Setup MSVC dev environment
uses: ilammy/msvc-dev-cmd@v1
- name: cargo check
run: |
rm -Force Cargo.lock
cargo +nightly check -Z minimal-versions --workspace --exclude fuzz --all-features --lib --bins