# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: log4cxx

on: [push, pull_request]

jobs:
  job:
    name: ${{ matrix.os }}-${{ matrix.cxx }}-build-and-test
    runs-on: ${{ matrix.os }}
    timeout-minutes: 38
    strategy:
      fail-fast: false
      matrix:
        name: [ubuntu18-gcc, ubuntu18-clang, osx, windows-2019]
        include:
          - name: windows-2019
            os: windows-2019
            cxx: cl.exe
            cc: cl.exe
          - name: ubuntu18-gcc
            os: ubuntu-18.04
            cxx: g++
            cc: gcc
          - name: ubuntu18-clang
            os: ubuntu-18.04
            cxx: clang++
            cc: clang
          - name: osx
            os: macos-latest
            cxx: clang++
            cc: clang

    steps:
    - uses: actions/checkout@v2

    - uses: lukka/set-shell-env@v1
      with:
        CXX: ${{ matrix.cxx }}
        CC: ${{ matrix.cc }}

    - name: 'Configure Dependencies - Ubuntu'
      if: matrix.name == 'ubuntu18-gcc' || matrix.name == 'ubuntu18-clang'
      run: |
        sudo apt-get update
        sudo apt-get install -y libapr1-dev libaprutil1-dev
        # note: sqlext.h exists on github VM, purge for now as we don't link correctly...
        sudo apt-get purge unixodbc-dev

    - name: 'Restore Prebuilt Dependencies - Windows'
      id: restore-vcpkg-cache
      if: matrix.name == 'windows-2019' || matrix.name == 'windows-2016'
      uses: actions/cache@v2
      with:
        path: ${{ runner.workspace }}/vcpkg
        key: ${{ runner.os }}-${{ matrix.name }}-cache

    - name: 'Configure Dependencies - Windows'
      if: matrix.name == 'windows-2019' || matrix.name == 'windows-2016'
      uses: lukka/run-vcpkg@v2
      id: runvcpkg
      with:
        vcpkgArguments: apr apr-util
        vcpkgDirectory: ${{ runner.workspace }}/vcpkg/
        vcpkgGitCommitId: ffa7fd27cfa29f206d1fd2ccfc722cad4aaeef3d
        vcpkgTriplet: x64-windows

    - name: 'run cmake'
      uses: lukka/run-cmake@v2
      with:
        cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
        buildDirectory: ${{ runner.workspace }}/build
        useVcpkgToolchainFile: true
        cmakeAppendedArgs: '-DLOG4CXX_TEST_PROGRAM_PATH=C:\msys64\usr\bin'

    - name: run unit tests
      shell: pwsh
      run: |
        cd ${{ runner.workspace }}/build
        ctest -C Debug --output-on-failure -V
