name: Tests
on: [push, pull_request]
jobs:
  test-linux:
    strategy:
      fail-fast: false
      matrix:
        target:
        - linux-amd64-unit-test-1-cpu
        - linux-amd64-unit-test-2-cpu
        - linux-amd64-unit-test-4-cpu
        - linux-amd64-unit-test-4-cpu-race
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - id: goversion
      run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
    - uses: actions/setup-go@v3
      with:
        go-version: ${{ steps.goversion.outputs.goversion }}
    - run: make fmt
    - env:
        TARGET: ${{ matrix.target }}
      run: |
        case "${TARGET}" in
          linux-amd64-unit-test-1-cpu)
            CPU=1 make test
            ;;
          linux-amd64-unit-test-2-cpu)
            CPU=2 make test
            ;;
          linux-amd64-unit-test-4-cpu)
            CPU=4 make test
            ;;
          linux-amd64-unit-test-4-cpu-race)
            # XXX: By default, the Github Action runner will terminate the process
            # if it has high resource usage. Try to use GOGC to limit memory and
            # cpu usage here to prevent unexpected terminating. It can be replaced
            # with GOMEMLIMIT=2048MiB if the go-version is updated to >=1.19.x.
            #
            # REF: https://github.com/actions/runner-images/issues/6680#issuecomment-1335778010
            GOGC=30 CPU=4 ENABLE_RACE=true make test
            ;;
          *)
            echo "Failed to find target"
            exit 1
            ;;
        esac
    - name: golangci-lint
      uses: golangci/golangci-lint-action@08e2f20817b15149a52b5b3ebe7de50aff2ba8c5 # v3.4.0

  test-windows:
    strategy:
      fail-fast: false
      matrix:
        target:
        - windows-amd64-unit-test-4-cpu
        # FIXME(fuweid):
        #
        # The windows will throws the following error when enable race.
        # We skip it until we have solution.
        #
        #   ThreadSanitizer failed to allocate 0x000200000000 (8589934592) bytes at 0x0400c0000000 (error code: 1455)
        #
        #- windows-amd64-unit-test-4-cpu-race
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v3
    - id: goversion
      run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
    - uses: actions/setup-go@v3
      with:
        go-version: ${{ steps.goversion.outputs.goversion }}
    - run: make fmt
    - env:
        TARGET: ${{ matrix.target }}
      run: |
        case "${TARGET}" in
          windows-amd64-unit-test-4-cpu)
            CPU=4 make test
            ;;
          *)
            echo "Failed to find target"
            exit 1
            ;;
        esac
      shell: bash
    - name: golangci-lint
      uses: golangci/golangci-lint-action@08e2f20817b15149a52b5b3ebe7de50aff2ba8c5 # v3.4.0

  coverage:
    needs: ["test-linux", "test-windows"]
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v3
    - id: goversion
      run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
    - uses: actions/setup-go@v3
      with:
        go-version: ${{ steps.goversion.outputs.goversion }}
    - run: make coverage
