# 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.1
      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@v5
      id: runvcpkg
      with:
        vcpkgArguments: apr apr-util
        vcpkgDirectory: ${{ runner.workspace }}/vcpkg/
        vcpkgGitCommitId: ffa7fd27cfa29f206d1fd2ccfc722cad4aaeef3d
        vcpkgTriplet: x64-windows

    - name: 'run cmake'
      uses: lukka/run-cmake@v3
      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
