name: sha2

on:
  pull_request:
    paths:
      - ".github/workflows/sha2.yml"
      - "sha2/**"
      - "Cargo.*"
  push:
    branches: master

defaults:
  run:
    working-directory: sha2

env:
  RUSTFLAGS: -Dwarnings
  CARGO_INCREMENTAL: 0

# Cancels CI jobs when new commits are pushed to a PR branch
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  set-msrv:
    uses: RustCrypto/actions/.github/workflows/set-msrv.yml@master
    with:
      msrv: 1.85.0

  # Builds for no_std platforms
  build:
    needs: set-msrv
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - ${{needs.set-msrv.outputs.msrv}}
          - stable
        target:
          - thumbv7em-none-eabi
          - wasm32-unknown-unknown
          - loongarch64-unknown-linux-gnu
    steps:
      - uses: actions/checkout@v6
      - uses: RustCrypto/actions/cargo-cache@master
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}
      - uses: RustCrypto/actions/cargo-hack-install@master
      - run: cargo hack build --target ${{ matrix.target }} --each-feature --exclude-features default,std

  # Linux tests
  linux:
    needs: set-msrv
    strategy:
      matrix:
        include:
          # 32-bit Linux/x86
          - target: i686-unknown-linux-gnu
            rust: ${{needs.set-msrv.outputs.msrv}}
            deps: sudo apt update && sudo apt install gcc-multilib
          - target: i686-unknown-linux-gnu
            rust: stable
            deps: sudo apt update && sudo apt install gcc-multilib

          # 64-bit Linux/x86_64
          - target: x86_64-unknown-linux-gnu
            rust: ${{needs.set-msrv.outputs.msrv}}
          - target: x86_64-unknown-linux-gnu
            rust: stable
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: RustCrypto/actions/cargo-cache@master
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}
      - uses: RustCrypto/actions/cargo-hack-install@master
      - run: ${{ matrix.deps }}
      - run: cargo hack test --feature-powerset
      - run: cargo test --all-features
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft"
      - run: cargo test --all-features
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft-compact"

  # macOS tests
  macos:
    needs: set-msrv
    strategy:
      matrix:
        rust:
          - ${{needs.set-msrv.outputs.msrv}}
          - stable
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v6
      - uses: RustCrypto/actions/cargo-cache@master
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          targets: x86_64-apple-darwin
      - run: cargo test --no-default-features
      - run: cargo test
      - run: cargo test --all-features
      - run: cargo test --all-features
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft"
      - run: cargo test --all-features
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft-compact"

  # Windows tests
  windows:
    needs: set-msrv
    strategy:
      matrix:
        rust:
          - ${{needs.set-msrv.outputs.msrv}}
          - stable
        target:
          - x86_64-pc-windows-gnu
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v6
      - uses: RustCrypto/actions/cargo-cache@master
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}
      - uses: msys2/setup-msys2@v2
      - run: cargo test --target ${{ matrix.target }}
      - run: cargo test --all-features
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft"
      - run: cargo test --all-features
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft-compact"

  # Cross-compiled tests
  cross:
    needs: set-msrv
    strategy:
      matrix:
        rust:
          - ${{needs.set-msrv.outputs.msrv}}
          - stable
        target:
          - aarch64-unknown-linux-gnu
          - powerpc-unknown-linux-gnu
        features:
          - default
    runs-on: ubuntu-latest
    defaults:
      run:
        # Cross mounts only current package, i.e. by default it ignores workspace's Cargo.toml
        working-directory: .
    steps:
      - uses: RustCrypto/actions/cross-tests@master
        with:
          rust: ${{ matrix.rust }}
          package: ${{ github.workflow }}
          target: ${{ matrix.target }}
          features: ${{ matrix.features }}

  riscv64-zknh:
    runs-on: ubuntu-latest
    defaults:
      run:
        # Cross mounts only current package, i.e. by default it ignores workspace's Cargo.toml
        working-directory: .
    steps:
      - uses: actions/checkout@v6
      - uses: RustCrypto/actions/cargo-cache@master
      - name: Install Cross
        env:
          # Do not fail on compilation warnings
          RUSTFLAGS: ""
        run: cargo install cross --git https://github.com/cross-rs/cross
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
      - run: cross test --package sha2 --all-features --target riscv64gc-unknown-linux-gnu
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft" -C target-feature=+zknh,+zbkb
      - run: cross test --package sha2 --all-features --target riscv64gc-unknown-linux-gnu
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft-compact" -C target-feature=+zknh,+zbkb
      - run: cross test --package sha2 --all-features --target riscv64gc-unknown-linux-gnu
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="riscv-zknh" -C target-feature=+zknh,+zbkb
      - run: cross test --package sha2 --all-features --target riscv64gc-unknown-linux-gnu
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="riscv-zknh-compact" -C target-feature=+zknh,+zbkb

  riscv32-zknh:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: RustCrypto/actions/cargo-cache@master
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
          components: rust-src
      - run: cargo build --all-features --target riscv32gc-unknown-linux-gnu -Z build-std
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft" -C target-feature=+zknh,+zbkb
      - run: cargo build --all-features --target riscv32gc-unknown-linux-gnu -Z build-std
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="soft-compact" -C target-feature=+zknh,+zbkb
      - run: cargo build --all-features --target riscv32gc-unknown-linux-gnu -Z build-std
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="riscv-zknh" -C target-feature=+zknh,+zbkb
      - run: cargo build --all-features --target riscv32gc-unknown-linux-gnu -Z build-std
        env:
          RUSTFLAGS: -Dwarnings --cfg sha2_backend="riscv-zknh-compact" -C target-feature=+zknh,+zbkb

  # wasmtime tests
  wasm:
    needs: set-msrv
    strategy:
      matrix:
        include:
          # without simd
          - rust: ${{needs.set-msrv.outputs.msrv}}
            flags: "-C target-feature=-simd128"
          - rust: stable
            flags: "-C target-feature=-simd128"

          # with simd
          - rust: ${{needs.set-msrv.outputs.msrv}}
            flags: "-C target-feature=+simd128"
          - rust: stable
            flags: "-C target-feature=+simd128"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: RustCrypto/actions/cargo-cache@master
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          targets: wasm32-wasip1
      - uses: RustCrypto/actions/cargo-hack-install@master
      - uses: jcbhmr/setup-wasmtime@v2
      - run: cargo hack test --feature-powerset --target wasm32-wasip1
        env:
          RUSTFLAGS: ${{ matrix.flags }}
          CARGO_TARGET_WASM32_WASIP1_RUNNER: wasmtime

  minimal-versions:
    uses: RustCrypto/actions/.github/workflows/minimal-versions.yml@master
    with:
      working-directory: ${{ github.workflow }}
