name: ci-tests

on:
  # push:
  # branches: [ main ]
  pull_request:
    branches: [main]
  workflow_dispatch:

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 2
      - uses: actions/setup-python@v3
      - name: Install dependencies
        run: |
          python -m pip install pre-commit
          python -m pip freeze --local
      - uses: actions/cache@v3
        with:
          path: ~/.cache/pre-commit
          key: pre-commit|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }}
      - name: Run pre-commit checks
        run: pre-commit run --show-diff-on-failure --color=always --from-ref HEAD^ --to-ref HEAD
        shell: bash
  build:
    # The CMake configure and build commands are platform agnostic and should work equally
    # well on Windows or Mac.  You can convert this to a matrix build if you need
    # cross-platform coverage.
    # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
    runs-on: ubuntu-latest
    strategy:
      matrix:
        # Test of these containers
        container: ["ubuntu-dev:20", "alpine-dev:latest"]
        build-type: [Debug, Release]
        compiler: [{ cxx: g++, c: gcc }]
        cxx_flags: ["-Werror"]
        include:
          - container: "alpine-dev:latest"
            build-type: Debug
            compiler: { cxx: clang++, c: clang }
            cxx_flags: ""
    timeout-minutes: 60
    env:
      SCCACHE_GHA_ENABLED: "true"
      SCCACHE_CACHE_SIZE: 6G
      SCCACHE_ERROR_LOG: /tmp/sccache_log.txt
      SCCACHE_LOG: debug

    container:
      image: ghcr.io/romange/${{ matrix.container }}
      credentials:
        username: ${{ github.repository_owner }}
        password: ${{ secrets.GITHUB_TOKEN }}

    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
      - name: Install dependencies
        run: |
          uname -a
          cmake --version
          mkdir -p ${GITHUB_WORKSPACE}/build

      - name: Run sccache-cache
        uses: mozilla-actions/sccache-action@v0.0.3

      - name: Configure Cache Env
        uses: actions/github-script@v6
        with:
          script: |
            core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
            core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '')

      - name: Configure CMake
        # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
        # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
        run: |
          cmake -B ${GITHUB_WORKSPACE}/build \
            -DCMAKE_BUILD_TYPE=${{matrix.build-type}} \
            -GNinja \
            -DCMAKE_C_COMPILER="${{matrix.compiler.c}}" \
            -DCMAKE_CXX_COMPILER="${{matrix.compiler.cxx}}" \
            -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -DCMAKE_C_COMPILER_LAUNCHER=sccache \
            -DCMAKE_CXX_FLAGS="${{matrix.cxx_flags}}" \
            -L
          cd ${GITHUB_WORKSPACE}/build && pwd
          du -hcs _deps/
      - name: Build
        run: |
          cd ${GITHUB_WORKSPACE}/build
          ninja src/all
          ${SCCACHE_PATH} --show-stats | tee $GITHUB_STEP_SUMMARY

      - name: C++ Unit Tests
        if: ${{ false }}
        run: |
          cd ${GITHUB_WORKSPACE}/build
          echo Run ctest -V -L DFLY
          GLOG_logtostderr=1 GLOG_vmodule=rdb_load=1,rdb_save=1,snapshot=1 ctest -V -L DFLY

          echo "Running tests with --force_epoll"

          # Create a rule that automatically prints stacktrace upon segfault
          cat > ./init.gdb <<EOF
          catch signal SIGSEGV
          command
          bt
          end
          EOF

          gdb -ix ./init.gdb --batch -ex r --args ./dragonfly_test --force_epoll
          FLAGS_force_epoll=true ctest -V -L DFLY

          echo "Finished running tests with --force_epoll"

          echo "Running tests with --cluster_mode=emulated"
          FLAGS_cluster_mode=emulated ctest -V -L DFLY

          echo "Running tests with both --cluster_mode=emulated & --lock_on_hashtags"
          FLAGS_cluster_mode=emulated FLAGS_lock_on_hashtags=true ctest -V -L DFLY

          ./dragonfly_test
          ./multi_test --multi_exec_mode=1
          ./multi_test --multi_exec_mode=3
          # GLOG_logtostderr=1 GLOG_vmodule=transaction=1,engine_shard_set=1 CTEST_OUTPUT_ON_FAILURE=1 ninja server/test
      - name: Run regression tests
        if: matrix.container == 'ubuntu-dev:20'
        uses: ./.github/actions/regression-tests
        with:
          dfly-executable: dragonfly
          run-only-on-ubuntu-latest: true
          build-folder-name: build
          filter: "not slow"
      - name: Upload cache log
        uses: actions/upload-artifact@v3
        with:
          name: sccache_log.txt
          path: /tmp/sccache_log.txt

  lint-test-chart:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Set up Helm
        uses: azure/setup-helm@v3

      - uses: actions/setup-python@v4
        with:
          python-version: "3.9"
          check-latest: true

      - name: Chart Rendering Tests
        run: |
          go test -v ./contrib/charts/dragonfly/...

      - name: Set up chart-testing
        uses: helm/chart-testing-action@v2.3.1

      - name: Run chart-testing (list-changed)
        id: list-changed
        run: |
          changed=$(ct list-changed --config .ct.yaml)
          if [[ -n "$changed" ]]; then
            echo "changed=true" >> $GITHUB_OUTPUT
          fi

      - name: Run chart-testing (lint)
        run: |
          ct \
            lint \
            --config .ct.yaml \
            ${{github.event_name == 'workflow_dispatch' && '--all'}} ;

      - if: steps.list-changed.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
        name: Create kind cluster
        uses: helm/kind-action@v1.5.0

      - if: steps.list-changed.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
        name: Getting cluster ready
        run: |
          kubectl label nodes chart-testing-control-plane key/node-kind=high-memory

      - name: Run chart-testing (install)
        run: |
          ct \
            install \
            --config .ct.yaml \
            --debug \
            --helm-extra-set-args "--set=image.repository=ghcr.io/${{ github.repository }},probes=null" \
            ${{github.event_name == 'workflow_dispatch' && '--all'}} ;
