name: PHP Tests

on:
  workflow_call:
    inputs:
      safe-checkout:
        required: true
        description: "The SHA key for the commit we want to run over"
        type: string

permissions:
  contents: read

jobs:
  linux:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        include:
          - name: 8.0 Optimized
            version: "8.0.5"
            version-short: "8.0"
            command: composer test \&\& composer test_c
          - name: 8.0 Debug
            version: 8.0.5-dbg
            version-short: "8.0"
            command: composer test \&\& composer test_c
          - name: 8.0 Memory Leak
            version: 8.0.5-dbg
            version-short: "8.0"
            # Run specialized memory leak & multirequest tests.
            command: composer test_c \&\& tests/multirequest.sh \&\& tests/memory_leak_test.sh
          - name: 8.0 Valgrind
            version: 8.0.5-dbg
            version-short: "8.0"
            command: composer test_valgrind

    name: Linux ${{ matrix.name}}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v2
        with:
          ref: ${{ inputs.safe-checkout }}
      - name: Setup composer
        uses: protocolbuffers/protobuf-ci/composer-setup@v2
        with:
          cache-prefix: php-${{ matrix.version-short }}
          directory: php
      - name: Run tests
        uses: protocolbuffers/protobuf-ci/docker@v2
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/php:${{ matrix.version }}-66964dc8b07b6d1fc73a5cc14e59e84c1c534cea
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          extra-flags: -e COMPOSER_HOME=/workspace/composer-cache
          command: ${{ matrix.command }}

  linux-32bit:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        version: ['8.0']
        suffix: [ '', '-zts']
        test: ['test', 'test_c']
        exclude:
          - suffix: '-zts'
            test: 'test'
        include:
          - suffix: '-zts'
            suffix_name: ' Thread Safe'
          - test: 'test_c'
            test_name: ' Extension'

    name: Linux 32-bit ${{ matrix.version}}${{ matrix.suffix_name }}${{ matrix.test_name }}
    runs-on: ubuntu-latest
    env:
      image: us-docker.pkg.dev/protobuf-build/containers/test/linux/32bit@sha256:8275360dc5d676f3470872d79087901c0e4153453976bea908a92c82e8d209ea
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v2
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Cross compile protoc for i386
        id: cross-compile
        uses: protocolbuffers/protobuf-ci/cross-compile-protoc@v2
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:6.3.0-91a0ac83e968068672bc6001a4d474cfd9a50f1d
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          architecture: linux-i386

      - name: Setup composer
        uses: protocolbuffers/protobuf-ci/composer-setup@v2
        with:
          cache-prefix: php-${{ matrix.version }}
          directory: php

      - name: Run tests
        uses: protocolbuffers/protobuf-ci/docker@v2
        with:
          image: ${{ env.image }}
          platform: linux/386
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          extra-flags: -e COMPOSER_HOME=/workspace/composer-cache -e PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }}
          command: >-
            /bin/bash -cex '
            PATH="/usr/local/php-${{ matrix.version }}${{matrix.suffix}}/bin:$PATH";
            cd php && php -v && php -m;
            composer update --ignore-platform-reqs;
            composer ${{ matrix.test }}'

  linux-aarch64:
    name: Linux aarch64
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v2
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Cross compile protoc for aarch64
        id: cross-compile
        uses: protocolbuffers/protobuf-ci/cross-compile-protoc@v2
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:6.3.0-91a0ac83e968068672bc6001a4d474cfd9a50f1d
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          architecture: linux-aarch64

      - name: Setup composer
        uses: protocolbuffers/protobuf-ci/composer-setup@v2
        with:
          cache-prefix: php-8.0
          directory: php

      - name: Run tests
        uses: protocolbuffers/protobuf-ci/docker@v2
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/php-aarch64@sha256:77ff9fdec867bbfb290ee0b10d8b7a3e5e434155daa5ec93de7341c7592b858d
          platform: linux/arm64
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          extra-flags: -e COMPOSER_HOME=/workspace/composer-cache -e PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }}
          command: >-
            -c '
            cd php;
            composer update --ignore-platform-reqs;
            composer test;
            composer test_c'

  macos:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        version: ['8.2']
    name: MacOS PHP ${{ matrix.version }}
    runs-on: macos-13
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v2
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Uninstall problematic libgd
        run: brew uninstall --ignore-dependencies gd

      - name: Install dependencies
        run: brew install coreutils gd

      - name: Pin PHP version
        uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # 2.30.0
        with:
          php-version: ${{ matrix.version }}

      - name: Check PHP version
        run: php --version | grep ${{ matrix.version }} || (echo "Invalid PHP version - $(php --version)" && exit 1)

      - name: Setup composer
        uses: protocolbuffers/protobuf-ci/composer-setup@v2
        with:
          cache-prefix: php-${{ matrix.version }}
          directory: php

      - name: Run tests
        uses: protocolbuffers/protobuf-ci/bash@v2
        with:
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          command: |
            pushd php
            php -v
            php -m
            composer update
            composer test_c
            popd

      - name: Run conformance tests
        uses: protocolbuffers/protobuf-ci/bazel@v2
        with:
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          bazel-cache: php_macos/${{ matrix.version }}
          bazel: test //php:conformance_test_c --action_env=PATH --test_env=PATH
