name: Tests

on:
  pull_request:
  push:
    branches:
      - nightly
      - main
      - release/*
  workflow_dispatch:

jobs:
  unittests-linux:
    strategy:
      matrix:
        python-version:
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
        runner: ["linux.12xlarge"]
        gpu-arch-type: ["cpu"]
        include:
          - python-version: 3.9
            runner: linux.g5.4xlarge.nvidia.gpu
            gpu-arch-type: cuda
            gpu-arch-version: "11.8"
      fail-fast: false
    uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@release/2.7
    permissions:
      id-token: write
      contents: read
    with:
      repository: pytorch/vision
      runner: ${{ matrix.runner }}
      gpu-arch-type: ${{ matrix.gpu-arch-type }}
      gpu-arch-version: ${{ matrix.gpu-arch-version }}
      timeout: 120
      test-infra-ref: release/2.7
      script: |
        set -euo pipefail

        export PYTHON_VERSION=${{ matrix.python-version }}
        export GPU_ARCH_TYPE=${{ matrix.gpu-arch-type }}
        export GPU_ARCH_VERSION=${{ matrix.gpu-arch-version }}

        ./.github/scripts/unittest.sh

  unittests-macos:
    strategy:
      matrix:
        python-version:
          - "3.9"
          - "3.10"
          # TODO put back 3.11 (See blame)
          # - "3.11"
          - "3.12"
        runner: ["macos-m1-stable"]
      fail-fast: false
    uses: pytorch/test-infra/.github/workflows/macos_job.yml@release/2.7
    with:
      repository: pytorch/vision
      timeout: 240
      runner: ${{ matrix.runner }}
      test-infra-ref: release/2.7
      script: |
        set -euo pipefail

        export PYTHON_VERSION=${{ matrix.python-version }}
        export GPU_ARCH_TYPE=cpu
        export GPU_ARCH_VERSION=''

        ${CONDA_RUN} ./.github/scripts/unittest.sh

  unittests-windows:
    strategy:
      matrix:
        python-version:
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
        runner: ["windows.4xlarge"]
        gpu-arch-type: ["cpu"]
        # TODO: put GPU testing back
        # include:
        #   - python-version: "3.9"
        #     runner: windows.g5.4xlarge.nvidia.gpu
        #     gpu-arch-type: cuda
        #     gpu-arch-version: "11.8"
      fail-fast: false
    uses: pytorch/test-infra/.github/workflows/windows_job.yml@release/2.7
    permissions:
      id-token: write
      contents: read
    with:
      repository: pytorch/vision
      runner: ${{ matrix.runner }}
      gpu-arch-type: ${{ matrix.gpu-arch-type }}
      gpu-arch-version: ${{ matrix.gpu-arch-version }}
      timeout: 120
      test-infra-ref: release/2.7
      script: |
        set -euxo pipefail

        export PYTHON_VERSION=${{ matrix.python-version }}
        export VC_YEAR=2022
        export VSDEVCMD_ARGS=""
        export GPU_ARCH_TYPE=${{ matrix.gpu-arch-type }}
        export GPU_ARCH_VERSION=${{ matrix.gpu-arch-version }}

        ./.github/scripts/unittest.sh

  # onnx:
  #   uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@release/2.7
  #   permissions:
  #     id-token: write
  #     contents: read
  #   with:
  #     repository: pytorch/vision
  #     test-infra-ref: release/2.7
  #     script: |
  #       set -euo pipefail
  #       export PYTHON_VERSION=3.10
  #       export GPU_ARCH_TYPE=cpu
  #       export GPU_ARCH_VERSION=''

  #       ./.github/scripts/setup-env.sh

  #       # Prepare conda
  #       CONDA_PATH=$(which conda)
  #       eval "$(${CONDA_PATH} shell.bash hook)"
  #       conda activate ci

  #       echo '::group::Install ONNX'
  #       pip install --progress-bar=off onnx onnxruntime
  #       echo '::endgroup::'

  #       echo '::group::Install testing utilities'
  #       pip install --progress-bar=off pytest "numpy<2"
  #       echo '::endgroup::'

  #       echo '::group::Run ONNX tests'
  #       pytest --junit-xml="${RUNNER_TEST_RESULTS_DIR}/test-results.xml" -v --durations=25 test/test_onnx.py
  #       echo '::endgroup::'

  unittests-extended:
    uses: pytorch/test-infra/.github/workflows/linux_job_v2.yml@release/2.7
    permissions:
      id-token: write
      contents: read
    if: contains(github.event.pull_request.labels.*.name, 'run-extended')
    with:
      repository: pytorch/vision
      test-infra-ref: release/2.7
      script: |
        set -euo pipefail

        export PYTHON_VERSION=3.9
        export GPU_ARCH_TYPE=cpu
        export GPU_ARCH_VERSION=''

        ./.github/scripts/setup-env.sh

        # Prepare conda
        CONDA_PATH=$(which conda)
        eval "$(${CONDA_PATH} shell.bash hook)"
        conda activate ci

        echo '::group::Pre-download model weights'
        pip install --progress-bar=off aiohttp aiofiles tqdm
        python scripts/download_model_urls.py
        echo '::endgroup::'

        echo '::group::Install testing utilities'
        # TODO: remove the <8 constraint on pytest when https://github.com/pytorch/vision/issues/8238 is closed
        pip install --progress-bar=off "pytest<8"
        echo '::endgroup::'

        echo '::group::Run extended unittests'
        export PYTORCH_TEST_WITH_EXTENDED=1
        pytest --junit-xml="${RUNNER_TEST_RESULTS_DIR}/test-results.xml" -v --durations=25 test/test_extended_*.py
        echo '::endgroup::'
