name: Program Auction House

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

env:
  CARGO_TERM_COLOR: always
  SOLANA_VERSION_STABLE: 1.9.22
  SOLANA_VERSION_UNSTABLE: 1.10.5
  RUST_TOOLCHAIN: stable

jobs:
  changes:
    runs-on: ubuntu-latest
    # Set job outputs to values from filter step
    outputs:
      core: ${{ steps.filter.outputs.core }}
      package: ${{ steps.filter.outputs.package }}
    steps:
      - uses: actions/checkout@v2
      # For pull requests it's not necessary to checkout the code
      - uses: dorny/paths-filter@v2
        id: filter
        with:
          filters: |
            core:
              - 'core/**'
            package:
              - 'auction-house/**'

  build-and-test-auction-house-stable:
    needs: changes
    if: ${{ needs.changes.outputs.core == 'true' || needs.changes.outputs.package == 'true' }}
    runs-on: ubuntu-latest
    env:
      cache_id: program-auction-house-stable

    steps:
      # Setup Deps
      - uses: actions/checkout@v2
      - uses: ./.github/actions/install-linux-build-deps
      - uses: ./.github/actions/install-solana
        with:
          solana_version: ${{ env.SOLANA_VERSION_STABLE }}
      - uses: ./.github/actions/install-rust
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}

      # Restore Cache from previous build/test
      - uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            ./rust/target
          key:
            ${{ env.cache_id }}-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{
            env.RUSTC_HASH }}

      # Run lint checks
      - uses: ./.github/actions/verify-rust
        with:
          working-directory: ./auction-house/program

      # Build deps
      - uses: ./.github/actions/build-token-metadata

      # Run test
      - name: test-auction-house-program
        id: run_auction_house_test
        working-directory: ./auction-house/program
        run: |
          cargo +${{ env.RUST_TOOLCHAIN }} test -- --nocapture --test-threads 1
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --version
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --bpf-out-dir ../../target/deploy/ -- --nocapture --test-threads 1
      
      # Verify we didn't break Auctioneer compatibility
      - name: test-auctioneer-program
        id: run_auctioneer_test
        working-directory: ./auctioneer/program
        run: |
          cargo +${{ env.RUST_TOOLCHAIN }} test -- --nocapture --test-threads 1
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --version
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --bpf-out-dir ../../target/deploy/ -- --nocapture --test-threads 1

  build-and-test-auction-house-unstable:
    needs: changes
    if: ${{ needs.changes.outputs.core == 'true' || needs.changes.outputs.package == 'true' }}
    runs-on: ubuntu-latest
    env:
      cache_id: program-auction-house-unstable

    steps:
      # Setup Deps
      - uses: actions/checkout@v2
      - uses: ./.github/actions/install-linux-build-deps
      - uses: ./.github/actions/install-solana
        with:
          solana_version: ${{ env.SOLANA_VERSION_UNSTABLE }}
      - uses: ./.github/actions/install-rust
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}

      # Restore Cache from previous build/test
      - uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            ./rust/target
          key:
            ${{ env.cache_id }}-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{
            env.RUSTC_HASH }}

      # Run lint checks
      - uses: ./.github/actions/verify-rust
        with:
          working-directory: ./auction-house/program

      # Build deps
      - uses: ./.github/actions/build-token-metadata

      # Run test
      - name: test-auction-house-program
        id: run_auction_house_test
        working-directory: ./auction-house/program
        run: |
          cargo +${{ env.RUST_TOOLCHAIN }} test -- --nocapture --test-threads 1
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --version
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --bpf-out-dir ../../target/deploy/ -- --nocapture --test-threads 1
      
      # Verify we didn't break Auctioneer compatibility
      - name: test-auctioneer-program
        id: run_auctioneer_test
        working-directory: ./auctioneer/program
        run: |
          cargo +${{ env.RUST_TOOLCHAIN }} test -- --nocapture --test-threads 1
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --version
          cargo +${{ env.RUST_TOOLCHAIN }} test-bpf --bpf-out-dir ../../target/deploy/ -- --nocapture --test-threads 1
