---
name: linux

on:
  pull_request:
    types: [opened, synchronize]
    paths-ignore:
      - '**.md'
      - '.mailmap'
      - 'ChangeLog*'
      - 'whatsnew*'
      - 'LICENSE'
  push:
    paths-ignore:
      - '**.md'
      - '.mailmap'
      - 'ChangeLog*'
      - 'whatsnew*'
      - 'LICENSE'

jobs:
  cmake:
    runs-on: ${{ matrix.os }}
    if: "!contains(github.event.head_commit.message, 'ci skip')"
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-18.04]
        EVENT_MATRIX:
          - DIST
          - NONE
          - DISABLE_OPENSSL
          - DISABLE_THREAD_SUPPORT
          - DISABLE_DEBUG_MODE
          - DISABLE_MM_REPLACEMENT
          - COMPILER_CLANG
          - TEST_EXPORT_STATIC
          - TEST_EXPORT_SHARED
          - ASAN
          - TSAN
          - UBSAN

    steps:
      - uses: actions/checkout@v2.0.0
      - name: Cache Build
        uses: actions/cache@v1.1.0
        with:
          path: build
          key: ${{ matrix.os }}-cmake-${{ matrix.EVENT_MATRIX }}-v2
      - name: Cache Dist Build
        uses: actions/cache@v1.1.0
        with:
          path: dist
          key: ${{ matrix.os }}-cmake-dist-${{ matrix.EVENT_MATRIX }}-v2

      - name: Build And Test
        shell: bash
        run: |
          if [ "${{ matrix.EVENT_MATRIX }}" == "DIST" ]; then
            ./autogen.sh
            mkdir -p dist
            cd dist
            ../configure
            rm -fr *.tar.gz
            make dist
            archive=$(echo *.tar.gz)
            tar -vxf $archive
            cd $(basename $archive .tar.gz)
          fi

          export TSAN_OPTIONS=suppressions=$PWD/extra/tsan.supp
          export LSAN_OPTIONS=suppressions=$PWD/extra/lsan.supp

          if [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_OPENSSL" ]; then
            EVENT_CMAKE_OPTIONS="-DEVENT__DISABLE_OPENSSL=ON"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_THREAD_SUPPORT" ]; then
            EVENT_CMAKE_OPTIONS="-DEVENT__DISABLE_THREAD_SUPPORT=ON"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_DEBUG_MODE" ]; then
            EVENT_CMAKE_OPTIONS="-DEVENT__DISABLE_DEBUG_MODE=ON"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_MM_REPLACEMENT" ]; then
            EVENT_CMAKE_OPTIONS="-DEVENT__DISABLE_MM_REPLACEMENT=ON"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "COMPILER_CLANG" ]; then
            EVENT_CMAKE_OPTIONS=""
            export CC=clang
          elif [ "${{ matrix.EVENT_MATRIX }}" == "TEST_EXPORT_STATIC" ]; then
            EVENT_CMAKE_OPTIONS="-DEVENT__LIBRARY_TYPE=STATIC -DEVENT__DISABLE_TESTS=ON -DEVENT__DISABLE_SAMPLES=ON"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "TEST_EXPORT_SHARED" ]; then
            EVENT_CMAKE_OPTIONS="-DEVENT__LIBRARY_TYPE=SHARED -DEVENT__DISABLE_TESTS=ON -DEVENT__DISABLE_SAMPLES=ON"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "ASAN" ]; then
            EVENT_CMAKE_OPTIONS="-DCMAKE_C_FLAGS=-fsanitize=address -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=debug"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "TSAN" ]; then
            EVENT_CMAKE_OPTIONS="-DCMAKE_C_FLAGS=-fsanitize=thread -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=debug"
          elif [ "${{ matrix.EVENT_MATRIX }}" == "UBSAN" ]; then
            EVENT_CMAKE_OPTIONS="-DCMAKE_C_FLAGS=-fsanitize=undefined -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=debug"
          else
            EVENT_CMAKE_OPTIONS=""
          fi

          #run build and test
          JOBS=20
          export CTEST_PARALLEL_LEVEL=$JOBS
          export CTEST_OUTPUT_ON_FAILURE=1
          mkdir -p build
          cd build
          echo [cmake]: cmake .. $EVENT_CMAKE_OPTIONS
          cmake .. $EVENT_CMAKE_OPTIONS || (rm -rf * && cmake .. $EVENT_CMAKE_OPTIONS)
          cmake --build .
          if [ "${{ matrix.EVENT_MATRIX }}" == "TEST_EXPORT_STATIC" ]; then
            sudo python3 ../test-export/test-export.py static
          elif [ "${{ matrix.EVENT_MATRIX }}" == "TEST_EXPORT_SHARED" ]; then
            sudo python3 ../test-export/test-export.py shared
          else
            cmake --build . --target verify
          fi

      - uses: actions/upload-artifact@v1
        if: failure()
        with:
          name: ${{ matrix.os }}-cmake-${{ matrix.EVENT_MATRIX }}-build
          path: build
      - uses: actions/upload-artifact@v1
        if: failure() && matrix.EVENT_MATRIX == 'DIST'
        with:
          name: ${{ matrix.os }}-cmake-${{ matrix.EVENT_MATRIX }}-dist
          path: dist

  autotools:
    runs-on: ${{ matrix.os }}
    if: "!contains(github.event.head_commit.message, 'ci skip')"
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-18.04]
        EVENT_MATRIX:
          - DIST
          - NONE
          - DISABLE_OPENSSL
          - DISABLE_THREAD_SUPPORT
          - DISABLE_DEBUG_MODE
          - DISABLE_MM_REPLACEMENT
          - COMPILER_CLANG

    steps:
      - uses: actions/checkout@v2.0.0
      - name: Cache Build
        uses: actions/cache@v1.1.0
        with:
          path: build
          key: ${{ matrix.os }}-autotools-${{ matrix.EVENT_MATRIX }}-v2
      - name: Cache Dist Build
        uses: actions/cache@v1.1.0
        with:
          path: dist
          key: ${{ matrix.os }}-autotools-dist-${{ matrix.EVENT_MATRIX }}-v2

      - name: Build And Test
        shell: bash
        run: |
          if [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_OPENSSL" ]; then
            EVENT_CONFIGURE_OPTIONS="--disable-openssl"

          elif [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_THREAD_SUPPORT" ]; then
            EVENT_CONFIGURE_OPTIONS="--disable-thread-support"

          elif [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_DEBUG_MODE" ]; then
            EVENT_CONFIGURE_OPTIONS="--disable-debug-mode"

          elif [ "${{ matrix.EVENT_MATRIX }}" == "DISABLE_MM_REPLACEMENT" ]; then
            EVENT_CONFIGURE_OPTIONS="--disable-malloc-replacement"

          elif [ "${{ matrix.EVENT_MATRIX }}" == "COMPILER_CLANG" ]; then
            EVENT_CONFIGURE_OPTIONS=""
            export CC=clang

          else
            EVENT_CONFIGURE_OPTIONS=""
          fi

          #run build and test
          JOBS=20
          ./autogen.sh

          if [ "${{ matrix.EVENT_MATRIX }}" == "DIST" ]; then
            mkdir -p dist
            cd dist
            rm -fr *.tar.gz
            ../configure $EVENT_CONFIGURE_OPTIONS
            make dist
            archive=$(echo *.tar.gz)
            tar -vxf $archive
            cd $(basename $archive .tar.gz)
          fi

          mkdir -p build
          cd build
          echo [configure]: ../configure $EVENT_CONFIGURE_OPTIONS
          ../configure $EVENT_CONFIGURE_OPTIONS
          make
          make -j $JOBS verify

      - uses: actions/upload-artifact@v1
        if: failure()
        with:
          name: ${{ matrix.os }}-autotools-${{ matrix.EVENT_MATRIX }}-build
          path: build
      - uses: actions/upload-artifact@v1
        if: failure() && matrix.EVENT_MATRIX == 'DIST'
        with:
          name: ${{ matrix.os }}-autotools-${{ matrix.EVENT_MATRIX }}-dist
          path: dist
