# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [main, develop]
  pull_request:
    branches: [main, develop]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

  # # Run tests every month
  # schedule:
  #   - cron: '0 0 1 * *'

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  linux:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - name: "Ubuntu OpenMPI g++"
            CC_COMPILER: gcc
            CXX_COMPILER: g++
            container: "ubuntu_gcc_openmpi"
            MPIEXEC_PREFLAGS: "--allow-run-as-root --oversubscribe"
            USE_SANITIZER: Address""
            ASAN_OPTIONS: "ASAN_OPTIONS=detect_leaks=0" # issue probably with openmpi
            CMAKE_BUILD_TYPE: Release
            DOCKER_OPTIONS: " "
            CODE_COVERAGE: "OFF"

          - name: "Ubuntu OpenMPI clang++"
            CC_COMPILER: clang
            CXX_COMPILER: clang++
            container: "ubuntu_clang_openmpi"
            MPIEXEC_PREFLAGS: "--allow-run-as-root --oversubscribe"
            USE_SANITIZER: ""
            CMAKE_BUILD_TYPE: Release
            DOCKER_OPTIONS: " "
            CODE_COVERAGE: "OFF"

          - name: "Ubuntu MPICH g++"
            CC_COMPILER: gcc
            CXX_COMPILER: g++
            container: "ubuntu_gcc_mpich"
            MPIEXEC_PREFLAGS: ""
            USE_SANITIZER: "Address"
            ASAN_OPTIONS: ""
            CMAKE_BUILD_TYPE: Debug
            DOCKER_OPTIONS: " "
            CODE_COVERAGE: "ON"

          - name: "Ubuntu MPICH clang++"
            CC_COMPILER: clang
            CXX_COMPILER: clang++
            container: "ubuntu_clang_mpich"
            MPIEXEC_PREFLAGS: ""
            USE_SANITIZER: "Address"
            ASAN_OPTIONS: ""
            CMAKE_BUILD_TYPE: Debug
            DOCKER_OPTIONS: " "
            CODE_COVERAGE: "OFF"

          # Hangs up on github
          # - name: "Debian OpenMPI g++"
          #   CC_COMPILER: gcc
          #   CXX_COMPILER: g++
          #   container: "debian_openmpi"
          #   MPIEXEC_PREFLAGS: "--allow-run-as-root --oversubscribe"
          #   USE_SANITIZER: "Address"
          #   ASAN_OPTIONS: "ASAN_OPTIONS=detect_leaks=0" # issue probably with openmpi
          #   CMAKE_BUILD_TYPE: Debug
          #   DOCKER_OPTIONS: " "
          #   CODE_COVERAGE: "OFF"
          #   # DOCKER_OPTIONS: "--cap-add SYS_PTRACE"
          # - name: "Debian OpenMPI clang++"
          #   CC_COMPILER: clang
          #   CXX_COMPILER: clang++
          #   container: "debian_openmpi"
          #   MPIEXEC_PREFLAGS: "--allow-run-as-root --oversubscribe"
          #   USE_SANITIZER: ""
          #   CMAKE_BUILD_TYPE: Debug
          #   DOCKER_OPTIONS: " "
          #   CODE_COVERAGE: "OFF"
          # DOCKER_OPTIONS: "--cap-add SYS_PTRACE"

          - name: "Debian MPICH g++"
            CC_COMPILER: gcc
            CXX_COMPILER: g++
            container: "debian_gcc_mpich"
            MPIEXEC_PREFLAGS: ""
            USE_SANITIZER: "Address"
            ASAN_OPTIONS: ""
            CMAKE_BUILD_TYPE: Debug
            DOCKER_OPTIONS: " "
            CODE_COVERAGE: "OFF"

          - name: "Debian MPICH clang++"
            CC_COMPILER: clang
            CXX_COMPILER: clang++
            container: "debian_clang_mpich"
            MPIEXEC_PREFLAGS: ""
            USE_SANITIZER: "Address"
            ASAN_OPTIONS: ""
            CMAKE_BUILD_TYPE: Debug
            DOCKER_OPTIONS: " "
            CODE_COVERAGE: "OFF"

    container:
      image: pierremarchand/htool_testing_environments:${{ matrix.container }}
      options: --user root ${{ matrix.DOCKER_OPTIONS }}
      env:
        OMPI_CC: ${{ matrix.CC_COMPILER }}
        OMPI_CXX: ${{ matrix.CXX_COMPILER }}
        CC: ${{ matrix.CC_COMPILER }}
        CXX: ${{ matrix.CXX_COMPILER }}

    name: CI (${{ matrix.name }})

    # Steps represent a sequence of tasks that will be executed as part of the job
    if: "!contains(github.event.head_commit.message, '[ci skip]')"
    steps:
      - name: Checkout htool
        uses: actions/checkout@v2
        with:
          path: "htool"
          fetch-depth: 0 # to get tags
      - name: Checkout hpddm
        uses: actions/checkout@v2
        with:
          repository: hpddm/hpddm
          ref: d19056d0e3010b905fca5b73f5c48a766b8a042d
          path: "hpddm"

      - name: Build tests
        run: |
          cd htool && mkdir build && cd build
          cmake -DHTOOL_WITH_EXAMPLES=1 -DMPIEXEC_PREFLAGS="${{ matrix.MPIEXEC_PREFLAGS }}" -DUSE_SANITIZER=${{ matrix.USE_SANITIZER }} -DCMAKE_BUILD_TYPE=${{ matrix.CMAKE_BUILD_TYPE }} -DCODE_COVERAGE=${{ matrix.CODE_COVERAGE }} ../
          make -j2 build-tests

      - name: Run tests
        run: |
          cd htool/build
          export OMP_NUM_THREADS=2
          ${{ matrix.ASAN_OPTIONS }} ctest --output-on-failure

      - name: Build examples
        run: |
          cd htool/build
          make -j2 build-examples

      - name: Build documentation
        run: |
          cd htool/build
          make doc

      - name: Check format
        run: |
          cd htool/build
          make format
          make cmake-format
          git diff --exit-code

      - name: Generate coverage reports
        if: matrix.CODE_COVERAGE == 'ON'
        run: |
          cd htool/
          lcov --capture --base-directory ./ --directory build/ --output-file coverage.info
          lcov --remove  coverage.info '/usr/*' '*/hpddm/*' --output-file  coverage.info

      - name: Upload coverage to Codecov
        if: matrix.CODE_COVERAGE == 'ON'
        uses: codecov/codecov-action@v2
        with:
          file: htool/coverage.info
