name: test

on:
  push:
    branches:
      - main
      - "*upstream*"
  pull_request:
    branches:
      - main
      - "*upstream*"

concurrency:
  cancel-in-progress: true
  group: ${{github.workflow}}-${{github.ref}}

env:
  CARGO_TERM_COLOR: always
  TARGET_RUST_VERSION: "nightly-2024-09-01"

jobs:
  nextest:
    uses: ./.github/workflows/nextest.yml
    with:
      profile: default
    secrets: inherit

  doctest:
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
        with:
          toolchain: ${{ env.TARGET_RUST_VERSION }}
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true
      - name: cargo test
        run: cargo test --doc -p forge

  clippy:
    name: clippy
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@clippy
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true
      - run: cargo clippy --workspace --all-targets --all-features
        env:
          RUSTFLAGS: -Dwarnings

  rustfmt:
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
        with:
          toolchain: ${{ env.TARGET_RUST_VERSION }}
          components: rustfmt
      - run: cargo fmt --all --check

  forge-fmt:
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
        with:
          toolchain: ${{ env.TARGET_RUST_VERSION }}
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true
      - name: forge fmt
        shell: bash
        run: ./.github/scripts/format.sh --check

  codespell:
    runs-on: ubuntu-22.04
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v4
      - uses: codespell-project/actions-codespell@v2
        with:
          skip: "*.json"

  crate-checks:
    # ubuntu-22.04 runs out of disk space
    runs-on: ubuntu-22.04-github-hosted-16core
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
        with:
          toolchain: ${{ env.TARGET_RUST_VERSION }}
      - uses: taiki-e/install-action@cargo-hack
      - uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true
      - name: cargo hack
        run: cargo hack check

  zk-cargo-test:
    runs-on: ubuntu-22.04-github-hosted-16core
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Install Rust
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: ${{ env.TARGET_RUST_VERSION }}

      - name: Install cargo-nextest
        uses: taiki-e/install-action@nextest

      - name: Run anvil-zksync
        uses: dutterbutter/anvil-zksync-action@v1.1.0
        with:
          mode: fork
          forkUrl: mainnet
          log: info
          logFilePath: anvil_zksync.log
          target: x86_64-unknown-linux-gnu
          releaseTag: v0.2.1

      - name: Setup Git config
        run: |
          git config --global user.name "GitHub Actions Bot"
          git config --global user.email "<>"
          git config --global url."https://github.com/".insteadOf "git@github.com:"

      - name: Run zk tests
        env:
          RUST_BACKTRACE: full
          TEST_MAINNET_URL: http://localhost:8011
        run: |
          ZK_DEBUG_HISTORICAL_BLOCK_HASHES=5 cargo nextest run --package '*' --lib --test '*' --filter-expr 'test(~zk)'

  deny:
    uses: ithacaxyz/ci/.github/workflows/deny.yml@main
    with:
      # Clear out arguments to not pass `--all-features` to `cargo deny`.
      # Many crates have an `openssl` feature which enables banned dependencies.
      deny-flags: ""


  check-ci-install:
    name: CI install
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - name: Install foundry-zksync
        run: cp ./install-foundry-zksync ./foundryup-zksync/* /tmp/ && cd /tmp && ./install-foundry-zksync
      - name: Verify installation
        run: forge --version

  check-ci-install-anvil:
    name: CI install anvil-zksync
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      
      - name: Install foundry-zksync
        run: |
          cp ./install-foundry-zksync ./foundryup-zksync/* /tmp/
          cd /tmp
          ./install-foundry-zksync
      
      - name: Verify anvil-zksync installation
        run: anvil-zksync --version