# This is the configuration file for Azure Pipelines, used to run tests on
# macOS and Windows. Documentation to help understand this setup:
# https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema
# https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers
# https://docs.microsoft.com/en-us/azure/devops/pipelines/process/multiple-phases
# https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates
# https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables
# https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/index
#
# In addition to this configuration file, some setup in the Azure DevOps
# project is required:
#  - The "Build pull requests from forks of this repository" setting must be
#    enabled: https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/github#validate-contributions-from-forks

trigger:
# These are all the branches referenced in the jobs that follow.
- epochs/daily
- epochs/three_hourly
- triggers/edge_stable
- triggers/edge_dev
- triggers/edge_canary
- triggers/wktr_preview

# Set safaridriver_diagnose to true to enable safaridriver diagnostics. The
# logs won't appear in `./wpt run` output but will be uploaded as an artifact.
variables:
  safaridriver_diagnose: false

jobs:
# The decision jobs runs `./wpt test-jobs` to determine which jobs to run,
# and all following jobs wait for it to finish and depend on its output.
- job: decision
  displayName: './wpt test-jobs'
  condition: eq(variables['Build.Reason'], 'PullRequest')
  pool:
    vmImage: 'ubuntu-24.04'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/checkout.yml
  - script: |
      set -eux -o pipefail
      git fetch --depth 50 --quiet origin master
      ./wpt test-jobs | while read job; do
        echo "$job"
        echo "##vso[task.setvariable variable=$job;isOutput=true]true";
      done
    name: test_jobs
    displayName: 'Run ./wpt test-jobs'

- job: tools_unittest_mac_py39
  displayName: 'tools/ unittests: macOS + Python 3.9'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.tools_unittest']
  pool:
    vmImage: 'macOS-14'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.9'
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/
      toxenv: py39

- job: tools_unittest_mac_py314
  displayName: 'tools/ unittests: macOS + Python 3.14'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.tools_unittest']
  pool:
    vmImage: 'macOS-14'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/
      toxenv: py314

- job: wptrunner_unittest_mac_py39
  displayName: 'tools/wptrunner/ unittests: macOS + Python 3.9'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
  pool:
    vmImage: 'macOS-14'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.9'
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wptrunner/
      toxenv: py39

- job: wptrunner_unittest_mac_py314
  displayName: 'tools/wptrunner/ unittests: macOS + Python 3.14'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
  pool:
    vmImage: 'macOS-14'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wptrunner/
      toxenv: py314

- job: wpt_integration_mac_py39
  displayName: 'tools/wpt/ tests: macOS + Python 3.9'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wpt_integration']
  pool:
    vmImage: 'macOS-14'
  steps:
  # full checkout required
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.9'
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wpt/
      toxenv: py39

- job: wpt_integration_mac_py314
  displayName: 'tools/wpt/ tests: macOS + Python 3.14'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wpt_integration']
  pool:
    vmImage: 'macOS-14'
  steps:
  # full checkout required
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wpt/
      toxenv: py314

- job: tools_unittest_win_py39
  displayName: 'tools/ unittests: Windows + Python 3.9'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.tools_unittest']
  pool:
    vmImage: 'windows-latest'
  variables:
    HYPOTHESIS_PROFILE: ci
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.9'
      addToPath: false
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/
      toxenv: py39

- job: tools_unittest_win_py314
  displayName: 'tools/ unittests: Windows + Python 3.14'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.tools_unittest']
  pool:
    vmImage: 'windows-latest'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
      addToPath: false
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/
      toxenv: py314

- job: wptrunner_unittest_win_py39
  displayName: 'tools/wptrunner/ unittests: Windows + Python 3.9'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
  pool:
    vmImage: 'windows-latest'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.9'
      addToPath: false
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wptrunner/
      toxenv: py39

- job: wptrunner_unittest_win_py314
  displayName: 'tools/wptrunner/ unittests: Windows + Python 3.14'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
  pool:
    vmImage: 'windows-latest'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
      addToPath: false
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wptrunner/
      toxenv: py314

- job: wpt_integration_win_py39
  displayName: 'tools/wpt/ tests: Windows + Python 3.9'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wpt_integration']
  pool:
    vmImage: 'windows-latest'
  steps:
  # full checkout required
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.9'
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wpt/
      toxenv: py39

- job: wpt_integration_win_py314
  displayName: 'tools/wpt/ tests: Windows + Python 3.14'
  dependsOn: decision
  condition: dependencies.decision.outputs['test_jobs.wpt_integration']
  pool:
    vmImage: 'windows-latest'
  steps:
  # full checkout required
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - template: tools/ci/azure/tox_pytest.yml
    parameters:
      directory: tools/wpt/
      toxenv: py314

- job: results_edge_stable
  displayName: 'all tests: Edge Stable'
  condition: |
    or(eq(variables['Build.SourceBranch'], 'refs/heads/epochs/daily'),
       eq(variables['Build.SourceBranch'], 'refs/heads/triggers/edge_stable'),
       and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_stable']))
  strategy:
    parallel: 10 # chosen to make runtime ~2h
  timeoutInMinutes: 180
  pool:
    vmImage: 'windows-latest'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/system_info.yml
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/install_certs.yml
  - template: tools/ci/azure/install_edge.yml
    parameters:
      channel: stable
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - script: python ./wpt run --yes --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info --channel stable edge
    displayName: 'Run tests (Edge Stable)'
  - task: PublishBuildArtifacts@1
    displayName: 'Publish results'
    inputs:
      artifactName: 'edge-stable-results'
  - template: tools/ci/azure/publish_logs.yml
  - template: tools/ci/azure/sysdiagnose.yml
- template: tools/ci/azure/fyi_hook.yml
  parameters:
    dependsOn: results_edge_stable
    artifactName: edge-stable-results

- job: results_edge_dev
  displayName: 'all tests: Edge Dev'
  condition: |
    or(eq(variables['Build.SourceBranch'], 'refs/heads/epochs/three_hourly'),
       eq(variables['Build.SourceBranch'], 'refs/heads/triggers/edge_dev'),
       and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_dev']))
  strategy:
    parallel: 10 # chosen to make runtime ~2h
  timeoutInMinutes: 180
  pool:
    vmImage: 'windows-latest'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/system_info.yml
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/install_certs.yml
  - template: tools/ci/azure/install_edge.yml
    parameters:
      channel: dev
  - template: tools/ci/azure/configure_watson.yml
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - script: python ./wpt run --yes --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info --channel dev edge
    displayName: 'Run tests (Edge Dev)'
  - task: PublishBuildArtifacts@1
    displayName: 'Publish results'
    inputs:
      artifactName: 'edge-dev-results'
  - template: tools/ci/azure/publish_logs.yml
  - template: tools/ci/azure/sysdiagnose.yml
- template: tools/ci/azure/fyi_hook.yml
  parameters:
    dependsOn: results_edge_dev
    artifactName: edge-dev-results

- job: results_edge_canary
  displayName: 'all tests: Edge Canary'
  condition: |
    or(eq(variables['Build.SourceBranch'], 'refs/heads/epochs/weekly'),
       eq(variables['Build.SourceBranch'], 'refs/heads/triggers/edge_canary'),
       and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_canary']))
  strategy:
    parallel: 10 # chosen to make runtime ~2h
  timeoutInMinutes: 180
  pool:
    vmImage: 'windows-latest'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/install_certs.yml
  - template: tools/ci/azure/install_edge.yml
    parameters:
      channel: canary
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - script: python ./wpt run --yes --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info --channel canary edge
    displayName: 'Run tests (Edge Canary)'
  - task: PublishBuildArtifacts@1
    displayName: 'Publish results'
    inputs:
      artifactName: 'edge-canary-results'
  - template: tools/ci/azure/publish_logs.yml
  - template: tools/ci/azure/sysdiagnose.yml
- template: tools/ci/azure/fyi_hook.yml
  parameters:
    dependsOn: results_edge_canary
    artifactName: edge-canary-results

- job: results_wktr_preview
  displayName: 'all tests: WebKitTestRunner'
  condition: |
    or(eq(variables['Build.SourceBranch'], 'refs/heads/triggers/wktr_preview'),
       and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_wktr_preview']))
  strategy:
    parallel: 8 # chosen to make runtime ~2h
  timeoutInMinutes: 180
  pool:
    vmImage: 'macOS-14'
  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.14'
  - template: tools/ci/azure/checkout.yml
  - template: tools/ci/azure/install_certs.yml
  - template: tools/ci/azure/color_profile.yml
  - template: tools/ci/azure/update_hosts.yml
  - template: tools/ci/azure/update_manifest.yml
  - script: |
      set -eux -o pipefail
      export SYSTEM_VERSION_COMPAT=0
      ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info --channel experimental --install-browser --yes wktr
    displayName: 'Run tests'
  - task: PublishBuildArtifacts@1
    displayName: 'Publish results'
    inputs:
      artifactName: 'wktr-preview-results'
  - template: tools/ci/azure/publish_logs.yml
  - template: tools/ci/azure/sysdiagnose.yml
- template: tools/ci/azure/fyi_hook.yml
  parameters:
    dependsOn: results_wktr_preview
    artifactName: wktr-preview-results
