# This workflow builds & runs test cases in iceoryx

name: Build & Test

# Triggers the workflow on push or pull request events but only for the master branch
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master, release*, integration* ]

jobs:
  pre-flight-check:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
      - run: ./tools/scripts/clang_format.sh check

  build-test-ubuntu:
    runs-on: ubuntu-20.04
    needs: pre-flight-check
    steps:
      - uses: actions/checkout@v2
      - uses: egor-tensin/setup-gcc@v1
        with:
          version: 9
          platform: x64
      - uses: jwlawson/actions-setup-cmake@v1.12
        with:
          cmake-version: '3.16.3' # version used in Ubuntu 20.04 LTS
      - run: ./tools/ci/build-test-ubuntu.sh

  # uses macos to run freebsd in a virtualbox
  build-test-unix-with-freebsd:
    # prevent stuck jobs consuming macos runners for 6 hours
    timeout-minutes: 60
    needs: pre-flight-check
    runs-on: macos-12
    steps:
    - uses: actions/checkout@v2
      with:
        ref: 'master'
    - name: Unix (FreeBSD) test
      id: Test
      uses: vmactions/freebsd-vm@v0
      with:
        usesh: true
        copyback: false
        mem: 4096
        prepare: pkg install -y cmake git ncurses bash wget bison
        run: |
         git config --global --add safe.directory /Users/runner/work/iceoryx/iceoryx
         ./tools/ci/build-test-freebsd.sh

  build-test-windows:
    runs-on: windows-2019
    needs: pre-flight-check
    steps:
      - uses: actions/checkout@v2
      - run: ./tools/ci/build-test-windows.ps1
        shell: powershell

  run-integration-test:
    runs-on: ubuntu-20.04
    needs: pre-flight-check
    steps:
      - name: Setup ROS
        uses: ros-tooling/setup-ros@0.2.1
        with:
          required-ros-distributions: foxy
      - uses: actions/checkout@v2
      - run: ./tools/ci/run-integration-test.sh

  build-test-ubuntu-with-sanitizers-gcc-latest:
    runs-on: ubuntu-20.04
    needs: pre-flight-check
    steps:
      - uses: egor-tensin/setup-gcc@v1.2
        with:
          version: 11
          platform: x64
      - uses: actions/checkout@v2
      - run: ./tools/ci/build-test-ubuntu-with-sanitizers.sh gcc

  build-test-ubuntu-with-sanitizers-clang-latest:
    runs-on: ubuntu-20.04
    needs: pre-flight-check
    steps:
      - uses: egor-tensin/setup-clang@v1
        with:
          version: 13
          platform: x64
      - uses: actions/checkout@v2
      - run: ./tools/ci/build-test-ubuntu-with-sanitizers.sh clang

  build-test-macos-with-sanitizers:
    runs-on: macos-latest
    # prevent stuck jobs consuming macos runners for 6 hours
    timeout-minutes: 60
    needs: pre-flight-check
    steps:
      - uses: actions/checkout@v2
      - run: ./tools/ci/build-test-macos-with-sanitizers.sh

  # gcc 5.4 is compiler used in QNX 7.0
  build-test-ubuntu-with-gcc54:
    runs-on: ubuntu-18.04
    needs: pre-flight-check
    steps:
      - uses: actions/checkout@v2
      - run: ./tools/ci/build-test-ubuntu-with-gcc54.sh

  coverage-and-docs:
    runs-on: ubuntu-20.04
    needs: pre-flight-check
    steps:
      - uses: actions/checkout@v2
      - run: ./tools/ci/coverage-and-docs.sh

      - name: Archive generated doxygen
        uses: actions/upload-artifact@v2
        with:
          name: iceoryx-pdf
          path: |
            ./build/doc/*.pdf
          retention-days: 30

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v2
        with:
          file: ./lcov_results/unittest/lcov/iceoryx_lcov_result_unit.info
          name: iceoryx
          flags: unittests
          fail_ci_if_error: true

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v2
        with:
          file: ./lcov_results/unittest_timing/lcov/iceoryx_lcov_result_unit-timing.info
          name: iceoryx
          flags: unittests_timing
          fail_ci_if_error: true
