name: Tests / Code Coverage
#  Tests / Code Coverage workflow runs unit tests and uploads a code coverage report
#  This workflow is run on pushes to development & every Pull Requests where a .go, .mod, .sum have been changed
on:
  pull_request:
  push:
    branches:
      - development
jobs:
  test-rpc:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        id: git_diff
        with:
          SUFFIX_FILTER: |
            .go
            .mod
            .sum
      - name: test-rpc
        run: |
          make test-rpc
        if: "env.GIT_DIFF != ''"

  split-test-files:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Create a file with all the pkgs
        run: go list ./... | grep -Ev 'vendor|importer|rpc/tester' > pkgs.txt
      - name: Split pkgs into 4 files
        run: split -n l/4 --additional-suffix=.txt ./pkgs.txt
      # cache multiple
      - uses: actions/upload-artifact@v2
        with:
          name: "${{ github.sha }}-aa"
          path: ./xaa.txt
      - uses: actions/upload-artifact@v2
        with:
          name: "${{ github.sha }}-ab"
          path: ./xab.txt
      - uses: actions/upload-artifact@v2
        with:
          name: "${{ github.sha }}-ac"
          path: ./xac.txt
      - uses: actions/upload-artifact@v2
        with:
          name: "${{ github.sha }}-ad"
          path: ./xad.txt

  test-coverage-run-1:
    runs-on: ubuntu-latest
    needs: split-test-files
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        id: git_diff
        with:
          SUFFIX_FILTER: |
            .go
            .mod
            .sum
      - uses: actions/download-artifact@v2
        with:
          name: "${{ github.sha }}-aa"
        if: "env.GIT_DIFF != ''"
      - name: test & coverage report creation
        run: |
          cat xaa.txt | xargs go test -mod=readonly -timeout 8m -coverprofile=coverage.txt -covermode=atomic
        if: "env.GIT_DIFF != ''"
      - name: filter out proto files
        run: |
          excludelist+=" $(find ./ -type f -name '*.pb.go')"
          for filename in ${excludelist}; do
            filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g')
            echo "Excluding ${filename} from coverage report..."
            sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt
          done
        if: "env.GIT_DIFF != ''"
      - uses: codecov/codecov-action@v1
        with:
          file: ./coverage.txt
          fail_ci_if_error: true
        if: "env.GIT_DIFF != ''"

  test-coverage-run-2:
    runs-on: ubuntu-latest
    needs: split-test-files
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        id: git_diff
        with:
          SUFFIX_FILTER: |
            .go
            .mod
            .sum
      - uses: actions/download-artifact@v2
        with:
          name: "${{ github.sha }}-ab"
        if: "env.GIT_DIFF != ''"
      - name: test & coverage report creation
        run: |
          cat xab.txt | xargs go test -mod=readonly -timeout 6m -coverprofile=coverage.txt -covermode=atomic
        if: "env.GIT_DIFF != ''"
      - name: filter out proto files
        run: |
          excludelist+=" $(find ./ -type f -name '*.pb.go')"
          for filename in ${excludelist}; do
            filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g')
            echo "Excluding ${filename} from coverage report..."
            sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt
          done
        if: "env.GIT_DIFF != ''"
      - uses: codecov/codecov-action@v1
        with:
          file: ./coverage.txt
          fail_ci_if_error: true
        if: "env.GIT_DIFF != ''"

  test-coverage-run-3:
    runs-on: ubuntu-latest
    needs: split-test-files
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        id: git_diff
        with:
          SUFFIX_FILTER: |
            .go
            .mod
            .sum
      - uses: actions/download-artifact@v2
        with:
          name: "${{ github.sha }}-ac"
        if: "env.GIT_DIFF != ''"
      - name: test & coverage report creation
        run: |
          cat xac.txt | xargs go test -mod=readonly -timeout 6m -coverprofile=coverage.txt -covermode=atomic
        if: "env.GIT_DIFF != ''"
      - name: filter out proto files
        run: |
          excludelist+=" $(find ./ -type f -name '*.pb.go')"
          for filename in ${excludelist}; do
            filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g')
            echo "Excluding ${filename} from coverage report..."
            sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt
          done
        if: "env.GIT_DIFF != ''"
      - uses: codecov/codecov-action@v1
        with:
          file: ./coverage.txt
          fail_ci_if_error: true
        if: "env.GIT_DIFF != ''"

  test-coverage-run-4:
    runs-on: ubuntu-latest
    needs: split-test-files
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        id: git_diff
        with:
          SUFFIX_FILTER: |
            .go
            .mod
            .sum
      - uses: actions/download-artifact@v2
        with:
          name: "${{ github.sha }}-ad"
        if: "env.GIT_DIFF != ''"
      - name: test & coverage report creation
        run: |
          cat xad.txt | xargs go test -mod=readonly -timeout 6m -coverprofile=coverage.txt -covermode=atomic
        if: "env.GIT_DIFF != ''"
      - name: filter out proto files
        run: |
          excludelist+=" $(find ./ -type f -name '*.pb.go')"
          for filename in ${excludelist}; do
            filename=$(echo $filename | sed 's/^./github.com\/cosmos\/ethermint/g')
            echo "Excluding ${filename} from coverage report..."
            sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt
          done
        if: "env.GIT_DIFF != ''"
      - uses: codecov/codecov-action@v1
        with:
          file: ./coverage.txt
          fail_ci_if_error: true
        if: "env.GIT_DIFF != ''"

  test-importer:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        id: git_diff
        with:
          SUFFIX_FILTER: |
            .go
            .mod
            .sum
      - name: test-importer
        run: |
          make test-import
        if: "env.GIT_DIFF != ''"

  test-solidity:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v2
      - uses: technote-space/get-diff-action@v4
        id: git_diff
        with:
          SUFFIX_FILTER: |
            .go
            .mod
            .sum
      - name: test-solidity
        run: |
          make test-solidity
        if: "env.GIT_DIFF != ''"
