name: CI
on: [push, workflow_dispatch, pull_request] # Trigger for every push as well as for every pull request. Yes, this will run stuff twice in case we create a PR from inside this repo. I'm open for better solutions, where I do not have to specify each brach individually for the 'push' trigger.

env:
  # Enable verbose output.
  # Repeat up to 5 times to deal with flaky tests.
  CTEST_OPTIONS: "--repeat until-pass:5 --output-on-failure"
  # The OpenSSL path for CI runs. Found via 'brew info openssl'.
  MACOS_OPENSSL_ROOT_DIR: "/opt/homebrew/Cellar/openssl@3/3.3.0"

jobs:
  ubuntu-clang-openssl:
    strategy:
      matrix:
        container: ["ubuntu:latest", "ubuntu:rolling"]
        systemCurl: [ON, OFF]
        buildType: [Debug, Release]
    runs-on: ubuntu-latest
    container: ${{ matrix.container }}
    steps:
    - name: Update package list
      run: apt update
    - name: Install Dependencies
      run: apt install -y git libssl-dev cmake build-essential clang libcurl4-openssl-dev libpsl-dev meson libunistring-dev
      env:
        DEBIAN_FRONTEND: noninteractive
    - name: Setup cmake
      uses: jwlawson/actions-setup-cmake@v1.14
      with:
        cmake-version: '3.22.x'
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_OPENSSL_BACKEND: ON
        CPR_USE_SYSTEM_CURL: ${{ matrix.systemCurl }}
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: clang
        cxx: clang++
        build-type: ${{ matrix.buildType }}
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  ubuntu-gcc-openssl:
    strategy:
      matrix:
        container: ["ubuntu:latest", "ubuntu:rolling"]
        systemCurl: [ON, OFF]
        buildType: [Debug, Release]
    runs-on: ubuntu-latest
    container: ${{ matrix.container }}
    steps:
    - name: Update package list
      run: apt update
    - name: Install Dependencies
      run: apt install -y git libssl-dev cmake build-essential libcurl4-openssl-dev libpsl-dev meson libunistring-dev
      env:
        DEBIAN_FRONTEND: noninteractive
    - name: Setup cmake
      uses: jwlawson/actions-setup-cmake@v1.14
      with:
        cmake-version: '3.22.x'
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_OPENSSL_BACKEND: ON
        CPR_USE_SYSTEM_CURL: ${{ matrix.systemCurl }}
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: gcc
        cxx: g++
        build-type: ${{ matrix.buildType }}
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  ubuntu-gcc-mbedtls:
    runs-on: ubuntu-latest
    steps:
    - name: Update package list
      run: sudo apt update
    - name: Install Dependencies
      run: sudo apt install -y git libssl-dev libmbedtls-dev cmake build-essential libpsl-dev meson libunistring-dev
      env:
        DEBIAN_FRONTEND: noninteractive
    - name: Setup cmake
      uses: jwlawson/actions-setup-cmake@v1.14
      with:
        cmake-version: '3.22.x'
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_MBEDTLS_BACKEND: ON
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: gcc
        cxx: g++
        build-type: Release
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  fedora-clang-openssl:
    runs-on: ubuntu-latest
    container: "fedora:latest"
    steps:
    - name: Update package list
      run: dnf update -y
    - name: Install Dependencies
      run: dnf install -y gcc clang git gcc gdb make openssl-devel libcurl-devel cmake libpsl-devel libunistring-devel meson
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_OPENSSL_BACKEND: ON
        CPR_USE_SYSTEM_CURL: OFF
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: clang
        cxx: clang++
        build-type: Release
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  fedora-gcc-openssl:
    strategy:
      matrix:
        systemCurl: [ON, OFF]
        buildType: [Debug, Release]
    runs-on: ubuntu-latest
    container: "fedora:latest"
    steps:
    - name: Update package list
      run: dnf update -y
    - name: Install Dependencies
      run: dnf install -y gcc clang git gcc gdb make openssl-devel libcurl-devel cmake libpsl-devel libunistring-devel meson
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_OPENSSL_BACKEND: ON
        CPR_USE_SYSTEM_CURL: ${{ matrix.systemCurl }}
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: gcc
        cxx: g++
        build-type: ${{ matrix.buildType }}
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  fedora-gcc-ssl-sanitizer:
    strategy:
      matrix:
        buildType: [UdefSan, LeakSan, AddrSan] # ThreadSan is disabled for now until all problems are resolved: https://github.com/libcpr/cpr/issues/451
    runs-on: ubuntu-latest
    container: "fedora:latest" # Use fedora for an up to date version of all sanitizers
    steps:
    - name: Update package list
      run: dnf update -y
    - name: Install Dependencies
      run: dnf install -y gcc clang git gcc gdb make openssl-devel libasan libubsan liblsan libtsan cmake libpsl-devel libunistring-devel meson
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: gcc
        cxx: g++
        build-type: ${{ matrix.buildType }}
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  windows-msvc-ssl:
    strategy:
      matrix:
        buildType: [Debug, Release]
    runs-on: windows-latest
    steps:
    - uses: actions/setup-python@v1
    - name: Install meson
      run: pip install meson
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CMAKE_GENERATOR: "Visual Studio 17 2022"
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: OFF
        CURL_USE_LIBPSL: OFF
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        build-type: ${{ matrix.buildType }}
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  windows-msvc-openssl:
    runs-on: windows-latest
    steps:
    - uses: actions/setup-python@v1
    - name: Install meson
      run: pip install meson
    - name: Install OpenSSL
      run: choco install openssl -y
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CMAKE_GENERATOR: "Visual Studio 17 2022"
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_OPENSSL_BACKEND: ON
        CURL_USE_LIBPSL: OFF
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        build-type: Release
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}
  
  macos-clang-ssl:
    strategy:
      matrix:
        buildType: [Debug, Release]
    runs-on: macos-latest
    steps:
    - name: Install libpsl
      run: brew install libpsl
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: OFF
        CPR_USE_SYSTEM_LIB_PSL: ON
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: clang
        cxx: clang++
        build-type: ${{ matrix.buildType }}
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  macos-clang-darwinssl:
    runs-on: macos-latest
    steps:
    - name: Install libpsl
      run: brew install libpsl
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: OFF
        CPR_FORCE_DARWINSSL_BACKEND: ON
        CPR_USE_SYSTEM_LIB_PSL: ON
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: clang
        cxx: clang++
        build-type: Release
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}

  macos-clang-openssl:
    runs-on: macos-latest
    steps:
    - name: Install OpenSSL
      run: brew install openssl
    - name: Install libpsl
      run: brew install libpsl
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_OPENSSL_BACKEND: ON
        CPR_USE_SYSTEM_LIB_PSL: ON
        OPENSSL_ROOT_DIR: "${{ env.MACOS_OPENSSL_ROOT_DIR }}"
        OPENSSL_LIBRARIES: "${{ env.MACOS_OPENSSL_ROOT_DIR }}/lib"
        LDFLAGS: "-L${{ env.MACOS_OPENSSL_ROOT_DIR }}/lib"
        CPPFLAGS: "-I${{ env.MACOS_OPENSSL_ROOT_DIR }}/include"
        PKG_CONFIG_PATH: "${{ env.MACOS_OPENSSL_ROOT_DIR }}/lib/pkgconfig"
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: clang
        cxx: clang++
        build-type: Release
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}
  
  macos-clang-openssl-boost:
    runs-on: macos-latest
    steps:
    - name: Install Boost
      run: brew install boost
    - name: Install OpenSSL
      run: brew install openssl
    - name: Install libpsl
      run: brew install libpsl
    - name: Checkout
      uses: actions/checkout@v3
    - name: "Build & Test"
      env:
        CPR_BUILD_TESTS: ON
        CPR_BUILD_TESTS_SSL: ON
        CPR_FORCE_OPENSSL_BACKEND: ON
        CPR_USE_BOOST_FILESYSTEM: ON
        CPR_USE_SYSTEM_LIB_PSL: ON
        OPENSSL_ROOT_DIR: "${{ env.MACOS_OPENSSL_ROOT_DIR }}"
        OPENSSL_LIBRARIES: "${{ env.MACOS_OPENSSL_ROOT_DIR }}/lib"
        LDFLAGS: "-L${{ env.MACOS_OPENSSL_ROOT_DIR }}/lib"
        CPPFLAGS: "-I${{ env.MACOS_OPENSSL_ROOT_DIR }}/include"
        PKG_CONFIG_PATH: "${{ env.MACOS_OPENSSL_ROOT_DIR }}/lib/pkgconfig"
      uses: ashutoshvarma/action-cmake-build@master
      with:
        build-dir: ${{ github.workspace }}/build
        source-dir: ${{ github.workspace }}
        cc: clang
        cxx: clang++
        build-type: Release
        run-test: true
        ctest-options: ${{ env.CTEST_OPTIONS }}