on:
  push:
    branches: ["master", "tokio-*.x"]
  pull_request:
    types: [labeled, opened, synchronize, reopened]
    branches: ["master", "tokio-*.x"]

name: Loom

env:
  RUSTFLAGS: -Dwarnings
  RUST_BACKTRACE: 1
  # Change to specific Rust release to pin
  rust_stable: stable

permissions:
  contents: read

jobs:
  loom:
    name: loom
    # base_ref is null when it's not a pull request
    if: github.repository_owner == 'tokio-rs' && (contains(github.event.pull_request.labels.*.name, 'R-loom') || (github.base_ref == null))
    runs-on: ubuntu-latest
    strategy:
      matrix:
        scope:
          - --skip loom_pool
          - loom_pool::group_a
          - loom_pool::group_b
          - loom_pool::group_c
          - loom_pool::group_d
          - time::driver
    steps:
      - uses: actions/checkout@v3
      - name: Install Rust ${{ env.rust_stable }}
        uses: dtolnay/rust-toolchain@master
        with:
            toolchain: ${{ env.rust_stable }}
      - uses: Swatinem/rust-cache@v2
      - name: loom ${{ matrix.scope }}
        run: cargo test --lib --release --features full -- --nocapture $SCOPE
        working-directory: tokio
        env:
          RUSTFLAGS: --cfg loom --cfg tokio_unstable -Dwarnings
          LOOM_MAX_PREEMPTIONS: 2
          LOOM_MAX_BRANCHES: 10000
          SCOPE: ${{ matrix.scope }}
