name: CI
permissions:
  contents: read

on:
  pull_request:
  push:
    branches:
    - master

env:
  CARGO_NET_RETRY: 3

jobs:
  clippy:
    name: Clippy
    runs-on: ubuntu-latest

    strategy:
      matrix:
        rust:
          - stable
        feature:
          - rt-async-io-crypto-rust
          - rt-async-io-crypto-openssl
          - rt-tokio-crypto-rust
          - rt-tokio-crypto-openssl

    steps:
    - uses: actions/checkout@v4
      with:
        persist-credentials: false
    
    - uses: actions-rust-lang/setup-rust-toolchain@v1
      with:
        toolchain: ${{ matrix.rust }}
        components: clippy

    - uses: actions/cache@v4
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target
        key: $clippy-cache-${{ steps.toolchain.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.lock') }}

    - name: "Clippy ${{ matrix.rust }}"
      run: cargo clippy --features=${{ matrix.feature }} --all-targets --all -- -D clippy::dbg_macro -D warnings -F unused_must_use

  fmt:
    name: Rustfmt
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
          components: rustfmt

      - name: "Check formatting"
        run: cargo fmt --all -- --check

  test:
    name: Tests
    runs-on: ubuntu-latest

    strategy:
      matrix:
        rust:
          - stable
        feature:
          - rt-async-io-crypto-rust
          - rt-async-io-crypto-openssl
          - rt-tokio-crypto-rust
          - rt-tokio-crypto-openssl

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}

      - uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: $test-cache-${{ steps.toolchain.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.lock') }}

      - name: Install gnome-keyring
        run: sudo apt-get install -y gnome-keyring

      - name: Start gnome-keyring
        # run gnome-keyring with 'foobar' as password for the login keyring
        # this will create a new login keyring and unlock it
        # the login password doesn't matter, but the keyring must be unlocked for the tests to work
        run: gnome-keyring-daemon --components=secrets --daemonize --unlock <<< 'foobar'

      - name: Run tests
        # run tests single-threaded to avoid race conditions
        run: cargo test --features=${{ matrix.feature }} -- --test-threads=1

      - name: Run example
        run: cargo run --features=${{ matrix.feature }} --example example

  # MSRV, influenced by zbus.
  check_msrv:
    name: Check MSRV
    runs-on: ubuntu-latest

    strategy:
      matrix:
       feature:
         - rt-async-io-crypto-rust
         - rt-async-io-crypto-openssl
         - rt-tokio-crypto-rust
         - rt-tokio-crypto-openssl

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: "1.75.0"
          components: clippy

      - uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: $clippy-cache-${{ steps.toolchain.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.lock') }}

      - name: Generate lockfile
        run: |
          cargo generate-lockfile

      - name: Clippy MSRV
        run: cargo clippy --features=${{ matrix.feature }} --all-targets --all -- -D clippy::dbg_macro -D warnings -F unused_must_use
