name: Tests / Code Coverage
on:
  pull_request:
  merge_group:
  push:
    branches:
      - main

permissions:
  contents: write
  pull-requests: write

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

jobs:
  split-test-files:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
      - name: Create a file with all core Cosmos SDK pkgs
        run: go list ./... > pkgs.txt
      - name: Split pkgs into 4 files
        run: split -d -n l/4 pkgs.txt pkgs.txt.part.
      - uses: actions/upload-artifact@v4
        with:
          name: "${{ github.sha }}-00"
          path: ./pkgs.txt.part.00
      - uses: actions/upload-artifact@v4
        with:
          name: "${{ github.sha }}-01"
          path: ./pkgs.txt.part.01
      - uses: actions/upload-artifact@v4
        with:
          name: "${{ github.sha }}-02"
          path: ./pkgs.txt.part.02
      - uses: actions/upload-artifact@v4
        with:
          name: "${{ github.sha }}-03"
          path: ./pkgs.txt.part.03

  tests:
    runs-on: depot-ubuntu-22.04-4
    needs: split-test-files
    strategy:
      fail-fast: false
      matrix:
        part: ["00", "01", "02", "03"]
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            **/*.go
            go.mod
            go.sum
            **/go.mod
            **/go.sum
            **/Makefile
            Makefile
      - uses: actions/download-artifact@v4
        with:
          name: "${{ github.sha }}-${{ matrix.part }}"
      - name: test & coverage report creation
        if: env.GIT_DIFF
        run: |
          cat pkgs.txt.part.${{ matrix.part }} | xargs go test -mod=readonly -race -timeout 30m -coverprofile=${{ matrix.part }}profile.out -covermode=atomic -tags='ledger test_ledger_mock'
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-${{ matrix.part }}-coverage"
          path: ./${{ matrix.part }}profile.out

  test-integration:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            **/*.go
            go.mod
            go.sum
            **/go.mod
            **/go.sum
            **/Makefile
            Makefile
      - name: integration tests
        if: env.GIT_DIFF
        run: |
          make test-integration-cov
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-integration-coverage"
          path: ./tests/integration-profile.out

  test-e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            **/*.go
            go.mod
            go.sum
            **/go.mod
            **/go.sum
            **/Makefile
            Makefile
      - name: e2e tests
        if: env.GIT_DIFF
        run: |
          make test-e2e-cov
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-e2e-coverage"
          path: ./tests/e2e-profile.out

  repo-analysis:
    runs-on: depot-ubuntu-22.04-4
    needs: [tests, test-integration, test-e2e, test-clientv2, test-core, test-depinject, test-errors, test-math, test-schema, test-collections, test-cosmovisor, test-confix, test-store, test-log, test-x-tx, test-tools-benchmark]
    steps:
      - uses: actions/checkout@v6
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            **/*.go
            go.mod
            go.sum
            **/go.mod
            **/go.sum
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-00-coverage"
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-01-coverage"
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-02-coverage"
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-03-coverage"
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-integration-coverage"
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-e2e-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-clientv2-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-core-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-depinject-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-errors-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-math-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-schema-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-collections-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-cosmovisor-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-confix-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-store-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-blockstm-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-log-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-x-tx-coverage"
        continue-on-error: true
      - uses: actions/download-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-tools-benchmark-coverage"
        continue-on-error: true
      - name: Upload coverage to Codecov
        if: env.GIT_DIFF
        uses: codecov/codecov-action@v5
        with:
          files: ./00profile.out,./01profile.out,./02profile.out,./03profile.out,./integration-profile.out,./e2e-profile.out,./client/v2/coverage.out,./core/coverage.out,./depinject/coverage.out,./errors/coverage.out,./math/coverage.out,./schema/coverage.out,./collections/coverage.out,./tools/cosmovisor/coverage.out,./tools/confix/coverage.out,./store/coverage.out,./log/coverage.out,./x/tx/coverage.out,./tools/benchmark/coverage.out,./blockstm/coverage.out
          fail_ci_if_error: false
          verbose: true
          token: ${{ secrets.CODECOV_TOKEN }}

  test-sim-nondeterminism:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            **/*.go
            go.mod
            go.sum
            **/go.mod
            **/go.sum
            **/Makefile
            Makefile
      - name: test-sim-nondeterminism
        if: env.GIT_DIFF
        run: |
          make test-sim-nondeterminism

  ###############################
  #### Cosmos SDK Submodules ####
  ###############################

  # NOTE: The following jobs are used to test the Cosmos SDK Go submodules.
  # They run when there is a diff in their respective directories.

  test-clientv2:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: client/v2/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            client/v2/**/*.go
            client/v2/go.mod
            client/v2/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd client/v2
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-clientv2-coverage"
          path: ./client/v2/coverage.out

  test-core:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: core/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            core/**/*.go
            core/go.mod
            core/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd core
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-core-coverage"
          path: ./core/coverage.out

  test-depinject:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: false
          cache: true
          cache-dependency-path: depinject/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            depinject/**/*.go
            depinject/go.mod
            depinject/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd depinject
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-depinject-coverage"
          path: ./depinject/coverage.out

  test-errors:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: errors/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            errors/**/*.go
            errors/go.mod
            errors/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd errors
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-errors-coverage"
          path: ./errors/coverage.out

  test-math:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: math/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            math/**/*.go
            math/go.mod
            math/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd math
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-math-coverage"
          path: ./math/coverage.out

  test-schema:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.12"
          cache: true
          cache-dependency-path: schema/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            schema/**/*.go
            schema/go.mod
            schema/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd schema
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-schema-coverage"
          path: ./schema/coverage.out

  test-collections:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: collections/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            collections/**/*.go
            collections/go.mod
            collections/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd collections
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-collections-coverage"
          path: ./collections/coverage.out

  test-cosmovisor:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: tools/cosmovisor/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            tools/cosmovisor/**/*.go
            tools/cosmovisor/go.mod
            tools/cosmovisor/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd tools/cosmovisor
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-cosmovisor-coverage"
          path: ./tools/cosmovisor/coverage.out

  test-confix:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: tools/confix/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            tools/confix/**/*.go
            tools/confix/go.mod
            tools/confix/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd tools/confix
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-confix-coverage"
          path: ./tools/confix/coverage.out

  test-store:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: store/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            store/**/*.go
            store/go.mod
            store/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd store
          (cd streaming/abci/examples/file && go build .)
          go test -ldflags "-r /usr/local/lib" -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-store-coverage"
          path: ./store/coverage.out
  test-blockstm:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: store/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            blockstm/**/*.go
            blockstm/go.mod
            blockstm/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd blockstm
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -coverpkg=./,./tree -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-blockstm-coverage"
          path: ./blockstm/coverage.out

  test-log:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: log/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            log/*.go
            log/go.mod
            log/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd log
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-log-coverage"
          path: ./log/coverage.out

  #############################
  ### Cosmos SDK x/{module} ###
  #############################

  # NOTE: The following jobs are used to test the Cosmos SDK Go submodules present under x/{module}.
  # They run when there is a diff in their respective directories.

  test-x-tx:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: x/tx/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            x/tx/**/*.go
            x/tx/go.mod
            x/tx/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd x/tx
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace ledger test_ledger_mock' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-x-tx-coverage"
          path: ./x/tx/coverage.out

  test-tools-benchmark:
    runs-on: depot-ubuntu-22.04-4
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: "1.25.5"
          check-latest: true
          cache: true
          cache-dependency-path: tools/benchmark/go.sum
      - uses: technote-space/get-diff-action@v6.1.2
        id: git_diff
        with:
          PATTERNS: |
            tools/benchmark/**/*.go
            tools/benchmark/go.mod
            tools/benchmark/go.sum
      - name: tests
        if: env.GIT_DIFF
        run: |
          cd tools/benchmark
          go test -mod=readonly -timeout 30m -coverprofile=coverage.out -covermode=atomic -tags='norace' ./...
      - uses: actions/upload-artifact@v4
        if: env.GIT_DIFF
        with:
          name: "${{ github.sha }}-tools-benchmark-coverage"
          path: ./tools/benchmark/coverage.out
