name: Run Safari Tests

on:
  workflow_call:
    inputs:
      artifact-name:
        description: Prefix for the artifact uploaded
        required: true
        type: string
      merged-artifact-name:
        description: Merge the uploaded artifacts into a singular artifact
        required: false
        type: string
      safari-technology-preview:
        description: Run Safari Technology Preview rather than the system Safari
        required: true
        type: boolean
      safaridriver-diagnose:
        description: Run safaridriver capturing diagnostics
        required: true
        type: boolean
      fetch-ref:
        description: The ref to fetch and initially checkout
        required: false
        type: string
      fetch-depth:
        description: The fetch-depth to checkout
        required: false
        type: number
      test-rev:
        description: The rev to checkout before running the tests
        required: false
        type: string
      matrix:
        description: Test matrix, to override test-type/current-chunk/total-chunks
        required: false
        type: string
      extra-options:
        description: Extra options to pass to wpt run
        required: false
        type: string

# We never interact with the GitHub API, thus we can simply disable all
# permissions the GitHub token would have.
permissions: {}

jobs:
  results:
    name: ${{ matrix.current-chunk || 1 }} (of ${{ matrix.total-chunks || 1 }})
    env:
      CURRENT_CHUNK: ${{ matrix.current-chunk || 1 }}
      TOTAL_CHUNKS: ${{ matrix.total-chunks || 1 }}
    runs-on:
      - self-hosted
      - webkit-ews
    timeout-minutes: 180
    strategy:
      matrix: "${{ fromJSON(inputs.matrix || '{\"pointless-matrix-item\": [0]}') }}"
    steps:
      - name: checkout
        uses: actions/checkout@v4.1.0
        with:
          fetch-depth: ${{ inputs.fetch-depth || 1 }}
          ref: ${{ inputs.fetch-ref }}
      - name: test-checkout
        if: inputs.test-rev
        env:
          REV: ${{ inputs.test-rev }}
        run: |-
          git switch --force --progress -d "$REV"
      - name: Reconfigure the display(s)
        run: |-
          ./wpt macos-display-configuration
      - name: Set system caption style to ""
        run: |-
          defaults write com.apple.mediaaccessibility MACaptionActiveProfile -string ""
      - name: Enable safaridriver diagnostics
        if: inputs.safaridriver-diagnose
        run: |-
          rm -rf ~/Library/Logs/com.apple.WebDriver/
          defaults write com.apple.WebDriver DiagnosticsEnabled 1
      - name: Enable safaridriver (Safari)
        if: ${{ !inputs.safari-technology-preview }}
        run: |-
          set -eux -o pipefail
          sudo safaridriver --enable
      - name: Enable safaridriver (Safari Technology Preview)
        if: ${{ inputs.safari-technology-preview }}
        run: |-
          set -eux -o pipefail
          export SYSTEM_VERSION_COMPAT=0
          ./wpt install --channel preview --download-only -d . --rename STP safari browser
          sudo installer -pkg STP.pkg -target LocalSystem
          sudo /Applications/Safari\ Technology\ Preview.app/Contents/MacOS/safaridriver --enable
      - name: Update hosts
        run: |-
          set -eux -o pipefail
          ./wpt make-hosts-file | sudo tee -a /etc/hosts
      - name: Update manifest
        run: ./wpt manifest
      - name: Run tests
        run: |-
          set -eux -o pipefail
          export SYSTEM_VERSION_COMPAT=0
          ./wpt run \
            --no-manifest-update \
            --no-restart-on-unexpected \
            --no-pause \
            --this-chunk "$CURRENT_CHUNK" \
            --total-chunks "$TOTAL_CHUNKS" \
            --chunk-type hash \
            --log-wptreport ${{ runner.temp }}/wpt_report_"$CURRENT_CHUNK".json \
            --log-wptscreenshot ${{ runner.temp }}/wpt_screenshot_"$CURRENT_CHUNK".txt \
            --log-mach - \
            --log-mach-level info \
            --channel ${{ inputs.safari-technology-preview && 'preview' || 'stable' }} \
            --kill-safari \
            ${{ inputs.extra-options }} \
            -- \
            safari
      - name: Publish results
        if: "!cancelled()"
        uses: actions/upload-artifact@v4.1.0
        with:
          name: ${{ inputs.artifact-name }}-${{ env.CURRENT_CHUNK }}
          path: |
            ${{ runner.temp }}/wpt_report_*.json
            ${{ runner.temp }}/wpt_screenshot_*.txt
          if-no-files-found: error
      - name: Publish safaridriver logs
        if: inputs.safaridriver-diagnose && !cancelled()
        uses: actions/upload-artifact@v4.1.0
        with:
          name: ${{ inputs.artifact-name }}-safaridriver-logs-${{ env.CURRENT_CHUNK }}
          path: ~/Library/Logs/com.apple.WebDriver/
          if-no-files-found: warn
      - name: Disable safaridriver diagnostics
        if: inputs.safaridriver-diagnose && always()
        run: |-
          defaults write com.apple.WebDriver DiagnosticsEnabled 0
          rm -rf ~/Library/Logs/com.apple.WebDriver/
      - name: Cleanup
        if: always()
        run: |-
          set -ux
          sudo sed -i '' '/^# Start web-platform-tests hosts$/,/^# End web-platform-tests hosts$/d' /etc/hosts

  notify-unmerged:
    name: Notify (unmerged results)
    needs: results
    if: "! inputs.merged-artifact-name"
    uses: ./.github/workflows/wpt_fyi_notify.yml
    with:
      artifact-name: ${{ inputs.artifact-name }}-*

  merge-results:
    name: Merge results artifacts
    runs-on: ubuntu-24.04
    needs: results
    if: inputs.merged-artifact-name
    steps:
      - name: Merge Artifacts
        uses: actions/upload-artifact/merge@v4
        with:
          name: ${{ inputs.merged-artifact-name }}
          pattern: ${{ inputs.artifact-name }}-*

  notify-merged:
    name: Notify (merged results)
    needs: merge-results
    if: inputs.merged-artifact-name
    uses: ./.github/workflows/wpt_fyi_notify.yml
    with:
      artifact-name: ${{ inputs.merged-artifact-name }}
