name: Test

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      # Go Test looks at `mtime` for caching. `git clone` messes with this. Set it consistently to last commit time.
      - name: Restore file modification time
        run: git ls-files -z | while read -d '' path; do touch -d "$(git log -1 --format="@%ct" "$path")" "$path"; done

      # We need to set a cache marker to ensure that the cache is individual for each job.
      - name: Add Cache Marker
        run: echo "go-test" > env.txt

      - name: Install Go
        id: install-go
        uses: actions/setup-go@v5
        with:
          go-version-file: 'go.mod'
          cache-dependency-path: |
            go.sum
            env.txt

      # We trigger mod download separately as otherwise it will count towards
      # the 1 minute default timeout of golangci-lint. Only needed if there is no cache.
      - name: Download dependencies
        run: go mod download
        if: steps.install-go.outputs.cache-hit != 'true'

      - name: Run Linter
        uses: golangci/golangci-lint-action@v8
        with:
          version: v2.7.2

      - name: Setup gotestsum
        uses: gertd/action-gotestsum@v3.0.0
        with:
          gotestsum_version: v1.13.0

      - name: Download nmap
        run: sudo apt-get install -y nmap

      - name: Run Tests
        env:
          TEST_DIR: ${{ inputs.TEST_DIR }}
        run: |
          GOTESTSUM_FLAGS="--junitfile tests.xml --format pkgname -- -cover -race"
          if [ -z "$TEST_DIR" ]; then
            gotestsum $GOTESTSUM_FLAGS ./...
          else
            gotestsum $GOTESTSUM_FLAGS ./$TEST_DIR/...
          fi

      - name: Test Summary
        uses: test-summary/action@v2
        with:
          paths: "tests.xml"
        if: always()