mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-04-05 09:06:08 +00:00
It happened in the past that we screwed up the `preconditions` of the state machine test such that no more transitions were sampled that actually send packets. To protect against this, we use the newly introduced logs and grep for certain transitions. In the future, we can consider emitting a more structured output, like writing all testcases to a DB and run more complex queries against it to ensure that certain cases are covered.
203 lines
6.4 KiB
YAML
203 lines
6.4 KiB
YAML
---
|
|
name: Rust
|
|
"on":
|
|
workflow_call:
|
|
|
|
defaults:
|
|
run:
|
|
working-directory: ./rust
|
|
|
|
permissions:
|
|
contents: 'read'
|
|
id-token: 'write'
|
|
|
|
# Never tolerate warnings.
|
|
env:
|
|
RUSTFLAGS: "-Dwarnings"
|
|
RUSTDOCFLAGS: "-D warnings"
|
|
|
|
jobs:
|
|
bench:
|
|
name: bench-${{ matrix.runs-on }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
runs-on: [
|
|
windows-2019 # Only platform with a benchmark right now
|
|
]
|
|
runs-on: ${{ matrix.runs-on }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: ./.github/actions/setup-rust
|
|
id: setup-rust
|
|
- run: cargo bench ${{ steps.setup-rust.outputs.bench-packages }}
|
|
env:
|
|
RUST_LOG: "debug"
|
|
name: "cargo bench"
|
|
shell: bash
|
|
|
|
static-analysis:
|
|
name: static-analysis-${{ matrix.runs-on }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# TODO: https://github.com/rust-lang/cargo/issues/5220
|
|
runs-on: [
|
|
ubuntu-22.04,
|
|
macos-14,
|
|
windows-2022
|
|
]
|
|
runs-on: ${{ matrix.runs-on }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: ./.github/actions/setup-rust
|
|
id: setup-rust
|
|
- uses: ./.github/actions/setup-tauri
|
|
timeout-minutes: 5
|
|
- uses: taiki-e/install-action@cargo-udeps
|
|
- run: |
|
|
rustup install --no-self-update nightly-2024-06-01 --profile minimal # The exact nightly version doesn't matter, just pin a random one.
|
|
cargo +nightly-2024-06-01 udeps --all-targets --all-features ${{ steps.setup-rust.outputs.packages }}
|
|
name: Check for unused dependencies
|
|
- run: cargo fmt -- --check
|
|
- run: cargo doc --all-features --no-deps --document-private-items ${{ steps.setup-rust.outputs.packages }}
|
|
name: "cargo doc"
|
|
shell: bash
|
|
- run: cargo clippy --all-targets --all-features ${{ steps.setup-rust.outputs.packages }}
|
|
name: "cargo clippy"
|
|
shell: bash
|
|
|
|
test:
|
|
name: test-${{ matrix.runs-on }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# TODO: https://github.com/rust-lang/cargo/issues/5220
|
|
runs-on: [
|
|
ubuntu-20.04,
|
|
ubuntu-22.04,
|
|
macos-12,
|
|
macos-13,
|
|
macos-14,
|
|
windows-2019,
|
|
windows-2022
|
|
]
|
|
runs-on: ${{ matrix.runs-on }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: ./.github/actions/setup-rust
|
|
id: setup-rust
|
|
- uses: ./.github/actions/setup-tauri
|
|
- uses: taiki-e/install-action@v2
|
|
with:
|
|
tool: ripgrep
|
|
- name: "cargo test"
|
|
shell: bash
|
|
run: |
|
|
|
|
# First, run all tests.
|
|
cargo test --all-features ${{ steps.setup-rust.outputs.packages }} -- --include-ignored --nocapture
|
|
|
|
# Assert that we sample certain transitions
|
|
rg SendICMPPacketToCidrResource $TESTCASES_DIR
|
|
rg SendICMPPacketToDnsResource $TESTCASES_DIR
|
|
rg SendDnsQueries $TESTCASES_DIR
|
|
|
|
# Backup dumped state and transition samples
|
|
mv $TESTCASES_DIR $TESTCASES_BACKUP_DIR
|
|
|
|
# Re-run only the regression seeds
|
|
PROPTEST_CASES=0 cargo test --all-features ${{ steps.setup-rust.outputs.packages }} -- tunnel_test --nocapture
|
|
|
|
# Assert that sampled state and transitions don't change between runs
|
|
for file in "$TESTCASES_DIR"/*.{state,transitions}; do
|
|
filename=$(basename "$file")
|
|
|
|
if ! diff "$file" "$TESTCASES_BACKUP_DIR/$filename"; then
|
|
echo "Found non-deterministic testcase: $filename"
|
|
exit 1
|
|
fi
|
|
done
|
|
env:
|
|
# <https://github.com/rust-lang/cargo/issues/5999>
|
|
# Needed to create tunnel interfaces in unit tests
|
|
CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER: "sudo --preserve-env"
|
|
PROPTEST_VERBOSE: 0 # Otherwise the output is very long.
|
|
PROPTEST_CASES: 1000 # Default is only 256.
|
|
CARGO_PROFILE_TEST_OPT_LEVEL: 1 # Otherwise the tests take forever.
|
|
TESTCASES_DIR: "connlib/tunnel/testcases"
|
|
TESTCASES_BACKUP_DIR: "connlib/tunnel/testcases_backup"
|
|
- name: Upload testcase data
|
|
if: ${{ failure() }}
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
overwrite: true
|
|
name: proptest-cases
|
|
path: |
|
|
rust/connlib/tunnel/testcases
|
|
rust/connlib/tunnel/testcases_backup
|
|
retention-days: 7
|
|
|
|
# Runs the Tauri client smoke test, built in debug mode. We can't run it in release
|
|
# mode because of a known issue: <https://github.com/firezone/firezone/blob/456e044f882c2bb314e19cc44c0d19c5ad817b7c/rust/windows-client/src-tauri/src/client.rs#L162-L164>
|
|
gui-smoke-test:
|
|
name: gui-smoke-test-${{ matrix.runs-on }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
runs-on: [
|
|
ubuntu-20.04,
|
|
ubuntu-22.04,
|
|
windows-2019,
|
|
windows-2022
|
|
]
|
|
runs-on: ${{ matrix.runs-on }}
|
|
defaults:
|
|
run:
|
|
# Must be in this dir for `pnpm` to work
|
|
working-directory: ./rust/gui-client
|
|
# The Windows client ignores RUST_LOG because it uses a settings file instead
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: ./.github/actions/setup-node
|
|
- uses: ./.github/actions/setup-rust
|
|
- uses: ./.github/actions/setup-tauri
|
|
timeout-minutes: 5
|
|
with:
|
|
runtime: true
|
|
- name: pnpm install
|
|
run: |
|
|
pnpm install
|
|
cp "node_modules/flowbite/dist/flowbite.min.js" "src/"
|
|
- name: Compile TypeScript
|
|
run: pnpm tsc
|
|
- name: Compile Tailwind
|
|
run: pnpm tailwindcss -i src/input.css -o src/output.css
|
|
- name: Build client
|
|
run: cargo build -p firezone-gui-client --all-targets
|
|
- uses: taiki-e/install-action@v2
|
|
with:
|
|
tool: dump_syms,minidump-stackwalk
|
|
- name: Run smoke test
|
|
working-directory: ./rust
|
|
run: cargo run -p gui-smoke-test
|
|
|
|
headless-client:
|
|
name: headless-client-${{ matrix.test }}-${{ matrix.runs-on }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# TODO: Add Windows as part of issue #3782
|
|
runs-on: [ubuntu-20.04, ubuntu-22.04]
|
|
test: [linux-group, token-path]
|
|
runs-on: ${{ matrix.runs-on }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: ./.github/actions/setup-rust
|
|
- uses: ./.github/actions/setup-tauri
|
|
timeout-minutes: 5
|
|
- run: scripts/tests/${{ matrix.test }}.sh
|
|
name: "test script"
|
|
shell: bash
|
|
working-directory: ./
|