name: CI

on:
  push:
    branches-ignore:
      - 'main'

env:
  BUILDER_VERSION: v0.8.18
  BUILDER_SOURCE: releases
  BUILDER_HOST: https://d19elf31gohf1l.cloudfront.net
  PACKAGE_NAME: aws-crt-php
  LINUX_BASE_IMAGE: ubuntu-16-x64
  RUN: ${{ github.run_id }}-${{ github.run_number }}

jobs:
  php-5_5-linux-x64:
    name: php-linux-x64 (5.5)
    runs-on: ubuntu-latest
    steps:
    - name: Setup PHP with Xdebug
      uses: shivammathur/setup-php@v2
      with:
        coverage: xdebug
        php-version: 5.5
        ini-values: xdebug.overload_var_dump=0, memory_limit=4G, phar.readonly=false

    - name: Checkout
      uses: actions/checkout@v2
      with:
        submodules: recursive

    - name: Build for PHP 5.5
      env:
        CC: clang
        CXX: clang++
      run: |
        phpize
        ./configure
        # Normally, CRT uses the system's default libcrypto.so.
        # But in this CI run, PHP 5.5 is using a different older libcrypto.so, as PHP 5.5 cannot build with openssl >=1.1.1.
        # When an applications uses two different libcrypto.so at the same time, things tend to explode.
        # Therefore, in this CI run we build AWS-LC statically, and use its libcrypto.a instead.
        USE_OPENSSL=OFF make
        ./dev-scripts/run_tests.sh

  php-linux-x64:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        version:
          - "5.6"
          - "7.0"
          - "7.1"
          - "7.2"
          - "7.3"
          - "7.4"
          - "8.0"
          - "8.1"
          - "8.2"
    steps:
    - name: Setup PHP with Xdebug
      uses: shivammathur/setup-php@v2
      with:
        coverage: xdebug
        php-version: ${{matrix.version}}
        ini-values: xdebug.overload_var_dump=0, memory_limit=4G, phar.readonly=false

    - name: Checkout
      uses: actions/checkout@v2
      with:
        submodules: recursive

    - name: Run tests
      env:
        CC: clang
        CXX: clang++
      run: |
        phpize
        ./configure
        make
        ./dev-scripts/run_tests.sh

    # linux-arm:
    #   name: ARM (${{ matrix.arch }})
    #   runs-on: ubuntu-latest
    #   strategy:
    #     matrix:
    #       arch: [armv6, armv7, arm64]
    #   steps:
    #   - name: Build ${{ env.PACKAGE_NAME }}
    #     run: |
    #       python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')"
    #       chmod a+x builder
    #       ./builder build -p ${{ env.PACKAGE_NAME }} --target=linux-${{ matrix.arch }} --spec=downstream

  windows-vc16:
    runs-on: windows-2019
    defaults:
      run:
        shell: cmd # use CMD instead of powershell to catch error from bat script
    strategy:
      matrix:
        arch: [x64]
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: recursive
    - id: setup-php-sdk
      uses: cmb69/setup-php-sdk@v0.6
      with:
        version: '8.0'
        arch: ${{ matrix.arch }}
        ts: ts
        deps: openssl
    - uses: ilammy/msvc-dev-cmd@v1
      with:
        arch: ${{ matrix.arch }}
        toolset: ${{steps.setup-php-sdk.outputs.toolset}}
    # not sure why CMD can't do multiline run statements
    - run: phpize
    - run: .\configure --with-prefix=${{steps.setup-php-sdk.outputs.prefix}} --enable-awscrt=shared --enable-cli --enable-openssl
    - run: nmake
    - run: nmake generate-php-ini
    - run: .\dev-scripts\run_tests.bat ${{steps.setup-php-sdk.outputs.prefix}}\php

  # windows-vc14:
  #   runs-on: windows-latest
  #   strategy:
  #     matrix:
  #       arch: [x86, x64]
  #   steps:
  #   - uses: ilammy/msvc-dev-cmd@v1
  #     with:
  #       toolset: 14.0
  #       arch: ${{ matrix.arch }}
  #       uwp: false
  #       spectre: true
  #   - name: Build ${{ env.PACKAGE_NAME }} + consumers
  #     run: |
  #       python -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')"
  #       python builder.pyz build -p ${{ env.PACKAGE_NAME }} downstream

  macos:
    runs-on: macos-${{ matrix.version }}
    strategy:
      matrix:
        version: [13]
    steps:
      # Force PHP to 8.0
      # Doing this because tests fail in PHP 8.1 (default on macos Github Runner as of Dec 2021)
      # due to the old version of PHPUnit we're using.
      # We're using an old PHPUnit because it's compatible our min supported PHP 5.5.
      # Quick fix is to force PHP version back to 8.0, which can still run our tests without error.
      # A real solution is to get our tests working on all PHP versions
      # (maybe don't use PHPUnit, maybe raise our min supported PHP version so we can upgrade,
      # or maybe use PHPUnit-Polyfills so we can use a modern PHPUnit with old PHP)
      - name: Setup PHP 8.0
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.0'
      - name: Build PHP 8 extension and test
        run: |
          python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')"
          chmod a+x builder
          ./builder build -p ${{ env.PACKAGE_NAME }} --spec=downstream

  pecl-package-test:
    runs-on: ubuntu-latest
    steps:
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.0'

    - name: Checkout
      uses: actions/checkout@v2
      with:
        submodules: recursive

    - name: Test PECL package build
      run: |
        python3 dev-scripts/prepare_pecl_release.py --version 1.0.0
        sudo pecl install awscrt-1.0.0.tgz
