name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main, async-changes ]

jobs:
  cmake_test:
    name: CMake test (without otlp-exporter)
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_cmake.sh
        sudo ./ci/setup_ci_environment.sh
    - name: run cmake tests (without otlp-exporter)
      run: |
        sudo ./ci/setup_thrift.sh
        ./ci/do_ci.sh cmake.test

  cmake_absel_stl_test:
    name: CMake test (with abseil)
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_cmake.sh
        sudo ./ci/setup_ci_environment.sh
    - name: run cmake tests (enable abseil-cpp)
      run: |
        sudo ./ci/install_abseil.sh
        ./ci/do_ci.sh cmake.abseil.test

  cmake_gcc_48_test:
    name: CMake gcc 4.8 (without otlp exporter)
    runs-on: ubuntu-18.04
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_gcc48.sh
    - name: setup cmake
      run: |
        sudo CC=/usr/bin/gcc-4.8 CXX=/usr/bin/g++-4.8 ./ci/setup_cmake.sh
    - name: run tests
      run: ./ci/do_ci.sh cmake.legacy.test
      env:
        CC: /usr/bin/gcc-4.8
        CXX: /usr/bin/g++-4.8

  cmake_gcc_48_otlp_exporter_test:
    name: CMake gcc 4.8 (with otlp exporter)
    runs-on: ubuntu-18.04
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_gcc48.sh
    - name: setup cmake
      run: |
        sudo CC=/usr/bin/gcc-4.8 CXX=/usr/bin/g++-4.8 ./ci/setup_cmake.sh
    - name: setup grpc
      run: |
        sudo CC=/usr/bin/gcc-4.8 CXX=/usr/bin/g++-4.8 ./ci/setup_grpc.sh -v 4.8
    - name: run tests
      run: ./ci/do_ci.sh cmake.legacy.exporter.otprotocol.test
      env:
        CC: /usr/bin/gcc-4.8
        CXX: /usr/bin/g++-4.8

  cmake_test_cxx20:
    name: CMake C++20 test
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/setup_cmake.sh
    - name: run tests
      run: ./ci/do_ci.sh cmake.c++20.test
    - name: run tests (enable stl)
      run: ./ci/do_ci.sh cmake.c++20.stl.test

  cmake_otprotocol_test:
    name: CMake test (with otlp-exporter)
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_cmake.sh
        sudo ./ci/setup_ci_environment.sh
    - name: run otlp exporter tests
      run: |
        sudo ./ci/setup_grpc.sh
        ./ci/do_ci.sh cmake.exporter.otprotocol.test

  plugin_test:
    name: Plugin -> CMake
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_cmake.sh
        sudo ./ci/setup_ci_environment.sh
    - name: run tests
      run: ./ci/do_ci.sh cmake.test_example_plugin

  bazel_test:
    name: Bazel
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_test
    - name: setup
      run: |
        sudo ./ci/setup_thrift.sh dependencies_only
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.test

  bazel_with_abseil:
    name: Bazel with external abseil
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_test
    - name: setup
      run: |
        sudo ./ci/setup_thrift.sh dependencies_only
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.with_abseil

  bazel_valgrind:
    name: Bazel valgrind
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_valgrind
    - name: setup
      run: |
        sudo ./ci/setup_thrift.sh dependencies_only
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.valgrind

  bazel_noexcept:
    name: Bazel noexcept
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_noexcept
    - name: setup
      run: |
        sudo ./ci/setup_thrift.sh dependencies_only
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.noexcept

  bazel_nortti:
    name: Bazel nortti
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_nortti
    - name: setup
      run: |
        sudo ./ci/setup_thrift.sh dependencies_only
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.nortti

  bazel_asan:
    name: Bazel asan config
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_asan
    - name: setup
      run: |
        sudo ./ci/setup_thrift.sh dependencies_only
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.asan

  bazel_tsan:
    name: Bazel tsan config
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_tsan
    - name: setup
      run: |
        sudo ./ci/setup_thrift.sh dependencies_only
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.tsan

  bazel_osx:
    name: Bazel on MacOS
    runs-on: macos-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /Users/runner/.cache/bazel
        key: bazel_osx
    - name: run tests
      run: ./ci/do_ci.sh bazel.macos.test

  benchmark:
    name: Benchmark
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@v3
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_benchmark
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: |
        env BENCHMARK_DIR=/benchmark
        ./ci/do_ci.sh benchmark
    - name: Upload benchmark results
      uses: actions/upload-artifact@v2
      with:
        name: benchmark_reports
        path: /home/runner/benchmark

  format:
    name: Format
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: setup
      run: sudo ./ci/install_format_tools.sh
    - name: run tests
      run: ./ci/do_ci.sh format


  windows:
    name: CMake -> exporter proto
    runs-on: windows-2019
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_cmake.ps1
        ./ci/setup_windows_ci_environment.ps1
        ./ci/install_windows_protobuf.ps1
    - name: run cmake test
      run: ./ci/do_ci.ps1 cmake.test
    - name: run otprotocol test
      run: ./ci/do_ci.ps1 cmake.exporter.otprotocol.test

  windows_bazel:
    name: Bazel Windows
    runs-on: windows-2019
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_thrift.ps1
        ./ci/install_windows_bazelisk.ps1
    - name: run tests
      run: ./ci/do_ci.ps1 bazel.build

  windows_plugin_test:
    name: Plugin -> CMake Windows
    runs-on: windows-2019
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_cmake.ps1
        ./ci/setup_windows_ci_environment.ps1
    - name: run tests
      run: ./ci/do_ci.ps1 cmake.test_example_plugin

  code_coverage:
    name: Code coverage
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo ./ci/setup_cmake.sh
        sudo ./ci/setup_ci_environment.sh
    - name: run tests and generate report
      run: ./ci/do_ci.sh code.coverage
    - name: upload report
      uses: codecov/codecov-action@v3
      with:
        file: /home/runner/build/coverage.info

  markdown-lint:
    runs-on: ubuntu-latest

    steps:
    - name: check out code
      uses: actions/checkout@v3

    - name: install markdownlint-cli
      run: sudo npm install -g markdownlint-cli

    - name: run markdownlint
      run: markdownlint .

  misspell:
    runs-on: ubuntu-latest
    steps:
    - name: check out code
      uses: actions/checkout@v3
    - name: install misspell
      run: |
        curl -L -o ./install-misspell.sh https://git.io/misspell
        sh ./install-misspell.sh
    - name: run misspell
      run: ./bin/misspell -error .

  docfx_check:
    name: DocFX check
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v3
    - name: install docfx
      run: choco install docfx -y --version=2.58.5
    - name: run ./ci/docfx.cmd
      shell: cmd
      run: ./ci/docfx.cmd
