name: Build and test

on:
  push:
    paths-ignore:
    - 'docker'
    - 'site/**'
    branches:
    - main
  pull_request:
    paths-ignore:
    - 'docker'
    - 'site/**'
    branches:
    - main

# Cancel previous PR build and test
concurrency:
  group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.event.number || github.sha }}
  cancel-in-progress: true

jobs:
  build:
    name: "Java ${{ matrix.java }} and ${{ matrix.cxx }} on ${{ matrix.os }}"
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-20.04
          - ubuntu-22.04
          - macos-11
          - macos-12
          - macos-13
        java:
          - 8
          - 11
          - 17
        cxx:
          - clang++
        include:
          - os: ubuntu-20.04
            java: 8
            cxx: g++
          - os: ubuntu-20.04
            java: 21-ea
            cxx: g++
    env:
      MAVEN_OPTS: -Xmx2g
      MAVEN_SKIP_RC: true
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Cache Maven local repository
      uses: actions/cache@v2
      with:
        path: ~/.m2/repository
        key: ${{ matrix.java }}-maven-${{ hashFiles('**/pom.xml') }}
        restore-keys: |
          ${{ matrix.java }}-maven-
    - name: Install Java ${{ matrix.java }}
      uses: actions/setup-java@v3
      with:
        distribution: temurin
        java-version: ${{ matrix.java }}
    - name: "Test"
      run: |
        mkdir -p ~/.m2
        mkdir build
        cd build
        if [ "${{ matrix.os }}" = "ubuntu-20.04" ]; then
          cmake -DANALYZE_JAVA=ON -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} -DSTOP_BUILD_ON_WARNING=OFF ..
        else
          cmake -DANALYZE_JAVA=ON -DOPENSSL_ROOT_DIR=`brew --prefix openssl@1.1` ..
        fi
        make package test-out
    - name: Step on failure
      if: ${{ failure() }}
      run: |
        cat /home/runner/work/orc/orc/build/java/rat.txt

  windows:
    name: "C++ ${{ matrix.simd }} Test on Windows"
    runs-on: windows-2019
    strategy:
      fail-fast: false
      matrix:
        simd:
          - General
          - AVX512
    env:
      ORC_USER_SIMD_LEVEL: AVX512
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Add msbuild to PATH
      uses: microsoft/setup-msbuild@v1.1
      with:
        msbuild-architecture: x64
    - name: "Test"
      shell: bash
      run: |
        mkdir build
        cd build
        if [ "${{ matrix.simd }}" = "General" ]; then
          cmake .. -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Debug -DBUILD_LIBHDFSPP=OFF -DBUILD_TOOLS=OFF -DBUILD_JAVA=OFF
        else
          cmake .. -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Debug -DBUILD_LIBHDFSPP=OFF -DBUILD_TOOLS=OFF -DBUILD_JAVA=OFF -DBUILD_ENABLE_AVX512=ON
        fi
        cmake --build . --config Debug
        ctest -C Debug --output-on-failure

  simdUbuntu:
    name: "SIMD programming using C++ intrinsic functions on ${{ matrix.os }}"
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-22.04
        cxx:
          - clang++
    env:
      ORC_USER_SIMD_LEVEL: AVX512
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: "Test"
      run: |
        mkdir -p ~/.m2
        mkdir build
        cd build
        cmake -DBUILD_JAVA=OFF -DBUILD_ENABLE_AVX512=ON ..
        make package test-out

  doc:
    name: "Javadoc generation"
    runs-on: ubuntu-20.04
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Install Java 8
      uses: actions/setup-java@v3
      with:
        distribution: temurin
        java-version: 8
    - name: "javadoc"
      run: |
        mkdir -p ~/.m2
        cd java
        mvn install -DskipTests
        mvn javadoc:javadoc

  formatting-check:
    name: "C++ format check"
    runs-on: ubuntu-20.04
    strategy:
      matrix:
        path:
          - 'c++'
          - 'tools'
    steps:
    - uses: actions/checkout@v3
    - name: Run clang-format style check for C++ code
      uses: jidicula/clang-format-action@v4.9.0
      with:
        clang-format-version: '13'
        check-path: ${{ matrix.path }}

  license-check:
    name: "License Check"
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Check license header
        uses: apache/skywalking-eyes@main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          config: .github/.licenserc.yaml

