on: push: branches: ["master", "tokio-*.x"] pull_request: branches: ["master", "tokio-*.x"] name: CI env: RUSTFLAGS: -Dwarnings RUST_BACKTRACE: 1 nightly: nightly-2021-11-23 minrust: 1.46 jobs: # Depends on all action sthat are required for a "successful" CI run. tests-pass: name: all systems go runs-on: ubuntu-latest needs: - test - test-unstable - miri - cross - features - minrust - fmt - clippy - docs - valgrind - loom-compile - check-readme steps: - run: exit 0 test: name: test tokio full runs-on: ${{ matrix.os }} strategy: matrix: os: - windows-latest - ubuntu-latest - macos-latest steps: - uses: actions/checkout@v2 - name: Install Rust run: rustup update stable - uses: Swatinem/rust-cache@v1 - name: Install cargo-hack run: cargo install cargo-hack # Run `tokio` with `full` features. This excludes testing utilities which # can alter the runtime behavior of Tokio. - name: test tokio full run: cargo test --features full working-directory: tokio # Test **all** crates in the workspace with all features. - name: test all --all-features run: cargo test --workspace --all-features # Run integration tests for each feature - name: test tests-integration --each-feature run: cargo hack test --each-feature working-directory: tests-integration # Run macro build tests - name: test tests-build --each-feature run: cargo hack test --each-feature working-directory: tests-build # Build benchmarks. Run of benchmarks is done by bench.yml workflow. - name: build benches run: cargo build --benches working-directory: benches # bench.yml workflow runs benchmarks only on linux. if: startsWith(matrix.os, 'ubuntu') valgrind: name: valgrind runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install Rust run: rustup update stable - uses: Swatinem/rust-cache@v1 - name: Install Valgrind run: | sudo apt-get update -y sudo apt-get install -y valgrind # Compile tests - name: cargo build test-mem run: cargo build --features rt-net --bin test-mem working-directory: tests-integration # Run with valgrind - name: Run valgrind test-mem run: valgrind --error-exitcode=1 --leak-check=full --show-leak-kinds=all ./target/debug/test-mem # Compile tests - name: cargo build test-process-signal run: cargo build --features rt-process-signal --bin test-process-signal working-directory: tests-integration # Run with valgrind - name: Run valgrind test-process-signal run: valgrind --error-exitcode=1 --leak-check=full --show-leak-kinds=all ./target/debug/test-process-signal test-unstable: name: test tokio full --unstable runs-on: ${{ matrix.os }} strategy: matrix: os: - windows-latest - ubuntu-latest - macos-latest steps: - uses: actions/checkout@v2 - name: Install Rust run: rustup update stable - uses: Swatinem/rust-cache@v1 # Run `tokio` with "unstable" cfg flag. - name: test tokio full --cfg unstable run: cargo test --all-features working-directory: tokio env: RUSTFLAGS: --cfg tokio_unstable -Dwarnings miri: name: miri runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.nightly }} override: true - uses: Swatinem/rust-cache@v1 - name: Install Miri run: | set -e rustup component add miri cargo miri setup rm -rf tokio/tests - name: miri run: cargo miri test --features rt,rt-multi-thread,sync task working-directory: tokio san: name: san runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.nightly }} override: true - uses: Swatinem/rust-cache@v1 - name: asan run: cargo test --all-features --target x86_64-unknown-linux-gnu --lib -- --test-threads 1 working-directory: tokio env: RUSTFLAGS: -Z sanitizer=address ASAN_OPTIONS: detect_leaks=0 cross: name: cross runs-on: ubuntu-latest strategy: matrix: target: - i686-unknown-linux-gnu - powerpc-unknown-linux-gnu - powerpc64-unknown-linux-gnu - mips-unknown-linux-gnu - arm-linux-androideabi steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: stable target: ${{ matrix.target }} override: true - uses: Swatinem/rust-cache@v1 - uses: actions-rs/cargo@v1 with: use-cross: true command: check args: --workspace --target ${{ matrix.target }} features: name: features runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.nightly }} override: true - uses: Swatinem/rust-cache@v1 - name: Install cargo-hack run: cargo install cargo-hack - name: check --each-feature run: cargo hack check --all --each-feature -Z avoid-dev-deps # Try with unstable feature flags - name: check --each-feature --unstable run: cargo hack check --all --each-feature -Z avoid-dev-deps env: RUSTFLAGS: --cfg tokio_unstable -Dwarnings minrust: name: minrust runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.minrust }} override: true - uses: Swatinem/rust-cache@v1 - name: "test --workspace --all-features" run: cargo check --workspace --all-features minimal-versions: name: minimal-versions runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.nightly }} override: true - uses: Swatinem/rust-cache@v1 - name: Install cargo-hack run: cargo install cargo-hack - name: "check --all-features -Z minimal-versions" run: | # Remove dev-dependencies from Cargo.toml to prevent the next `cargo update` # from determining minimal versions based on dev-dependencies. cargo hack --remove-dev-deps --workspace # Update Cargo.lock to minimal version dependencies. cargo update -Z minimal-versions cargo hack check --all-features --ignore-private - name: "check --all-features --unstable -Z minimal-versions" env: RUSTFLAGS: --cfg tokio_unstable -Dwarnings run: | # Remove dev-dependencies from Cargo.toml to prevent the next `cargo update` # from determining minimal versions based on dev-dependencies. cargo hack --remove-dev-deps --workspace # Update Cargo.lock to minimal version dependencies. cargo update -Z minimal-versions cargo hack check --all-features --ignore-private fmt: name: fmt runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install Rust run: rustup update stable - uses: Swatinem/rust-cache@v1 # Check fmt - name: "rustfmt --check" # Workaround for rust-lang/cargo#7732 run: | if ! rustfmt --check --edition 2018 $(git ls-files '*.rs'); then printf "Please run \`rustfmt --edition 2018 \$(git ls-files '*.rs')\` to fix rustfmt errors.\nSee CONTRIBUTING.md for more details.\n" >&2 exit 1 fi clippy: name: clippy runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install Rust run: rustup update 1.56 && rustup default 1.56 - uses: Swatinem/rust-cache@v1 - name: Install clippy run: rustup component add clippy # Run clippy - name: "clippy --all" run: cargo clippy --all --tests --all-features docs: name: docs runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.nightly }} override: true - uses: Swatinem/rust-cache@v1 - name: "doc --lib --all-features" run: cargo doc --lib --no-deps --all-features --document-private-items env: RUSTFLAGS: --cfg docsrs RUSTDOCFLAGS: --cfg docsrs -Dwarnings loom-compile: name: build loom tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install Rust run: rustup update stable - uses: Swatinem/rust-cache@v1 - name: build --cfg loom run: cargo test --no-run --lib --features full working-directory: tokio env: RUSTFLAGS: --cfg loom --cfg tokio_unstable -Dwarnings check-readme: name: Check README runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Verify that both READMEs are identical run: diff README.md tokio/README.md - name: Verify that Tokio version is up to date in README working-directory: tokio run: grep -q "$(sed '/^version = /!d' Cargo.toml | head -n1)" README.md