name: Python Tests

on:
  workflow_call:
    inputs:
      continuous-run:
        required: true
        description: "Boolean string denoting whether this run is continuous --
          empty string for presubmit, non-empty string for continuous."
        type: string
      safe-checkout:
        required: true
        description: "The SHA key for the commit we want to run over"
        type: string
      continuous-prefix:
        required: true
        description: "The string continuous-only tests should be prefixed with when displaying test
          results."
        type: string


permissions:
  contents: read

jobs:
  linux:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        type: [ Pure, C++]
        version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
        include:
          - type: Pure
            targets: //python/... //python:python_version_test
            flags: --define=use_fast_cpp_protos=false
          - type: C++
            targets: //python/... //python:python_version_test
            flags: --define=use_fast_cpp_protos=true
            # Test using WORKSPACE with our oldest support Python version.
          - version: "3.10"
          - version: "3.11"
            continuous-only: true
          - version: "3.12"
            continuous-only: true
          - version: "3.13"
            continuous-only: true
          - version: "3.14"
          - type: C++
            version: aarch64
            targets: //python/... //python:aarch64_test
            # TODO Enable this once conformance tests are fixed.
            flags: --define=use_fast_cpp_protos=true --test_tag_filters=-conformance
            image: us-docker.pkg.dev/protobuf-build/containers/test/linux/emulation:8.0.1-aarch64-168f9c9d015a0fa16611e1e9eede796fe9bfbb69

    name: ${{ matrix.continuous-only && inputs.continuous-prefix || '' }} Linux ${{ matrix.type }} ${{ matrix.version }} ${{ matrix.nobzlmod && 'No Bzlmod' || '' }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}
      - name: Run tests
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/bazel-docker@v5
        with:
          image: ${{ matrix.image || format('us-docker.pkg.dev/protobuf-build/containers/test/linux/python:8.0.1-{0}-5237f14696e60e4b050edfbf7ba9b374f37f83c6', matrix.version) }}
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          bazel-cache: python_linux/${{ matrix.type }}_${{ matrix.version }}
          bazel: test ${{ matrix.targets }} ${{ matrix.flags }} ${{ matrix.nobzlmod && '--noenable_bzlmod' || '' }} --test_env=KOKORO_PYTHON_VERSION


  macos:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        type: [ Pure, C++]
        version: [ "3.12", "3.13", "3.14" ]
        include:
          - type: Pure
            targets: //python/... //python:python_version_test
          - type: C++
            targets: //python/... //python:python_version_test
            flags: --define=use_fast_cpp_protos=true
          - version: "3.13"
            continuous-only: true
          - version: "3.14"
            continuous-only: true

    name: MacOS ${{ matrix.type }} ${{ matrix.version }}
    runs-on: macos-14
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Pin Python version
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405  # v6.2.0
        with:
          python-version: ${{ matrix.version }}
          cache: pip
          cache-dependency-path: 'python/requirements.txt'

      - name: Validate version
        run: python3 --version | grep ${{ matrix.version }} || (echo "Invalid Python version - $(python3 --version)" && exit 1)

      - name: Create and start virtual environment
        run: |
          python3 -m venv venv
          source venv/bin/activate

      - name: Run tests
        uses: protocolbuffers/protobuf-ci/bazel@v5
        env:
          KOKORO_PYTHON_VERSION: ${{ matrix.version }}
        with:
          version: 8.0.1 # Bazel version
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          bazel-cache: python_macos/${{ matrix.type }}_${{ matrix.version }}
          bazel: >-
            test ${{ matrix.targets }} ${{ matrix.flags }}
            --test_env=KOKORO_PYTHON_VERSION=${{ matrix.version }}
            --macos_minimum_os=12.0
