name: CI

on: [push, pull_request]

concurrency:
  group: ci-${{ github.head_ref || github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  test-ubuntu-latest:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: make
        # Fail build if there are warnings
        # build with TLS just for compilation coverage
        run: make all-with-unit-tests SERVER_CFLAGS='-Werror' BUILD_TLS=yes
      - name: test
        run: |
          sudo apt-get install tcl8.6 tclx
          ./runtest --verbose --tags -slow --dump-logs
      - name: module api test
        run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs
      - name: validate commands.def up to date
        run: |
          touch src/commands/ping.json
          make commands.def
          dirty=$(git diff)
          if [[ ! -z  $dirty ]]; then echo $dirty; exit 1; fi
      - name: unit tests
        run: |
          ./src/valkey-unit-tests

  test-sanitizer-address:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: make
        # build with TLS module just for compilation coverage
        run: make SANITIZER=address SERVER_CFLAGS='-Werror' BUILD_TLS=module
      - name: testprep
        run: sudo apt-get install tcl8.6 tclx -y
      - name: test
        run: ./runtest --verbose --tags -slow --dump-logs
      - name: module api test
        run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs

  test-rdma:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: make
        run: |
          sudo apt-get install librdmacm-dev libibverbs-dev
          make BUILD_RDMA=module
      - name: clone-rxe-kmod
        run: |
          mkdir -p tests/rdma/rxe
          git clone https://github.com/pizhenwei/rxe.git tests/rdma/rxe
          make -C tests/rdma/rxe
      - name: clear-kernel-log
        run: sudo dmesg -c > /dev/null
      - name: test
        run: sudo ./runtest-rdma --install-rxe
      - name: show-kernel-log
        run: sudo dmesg -c

  build-debian-old:
    runs-on: ubuntu-latest
    container: debian:bullseye
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: make
        run: |
          apt-get update && apt-get install -y build-essential
          make SERVER_CFLAGS='-Werror'

  build-macos-latest:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: make
        run: make SERVER_CFLAGS='-Werror'

  build-32bit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: make
        run: |
          sudo apt-get update && sudo apt-get install libc6-dev-i386
          make SERVER_CFLAGS='-Werror' 32bit

  build-libc-malloc:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: make
        run: make SERVER_CFLAGS='-Werror' MALLOC=libc

  build-almalinux8-jemalloc:
    runs-on: ubuntu-latest
    container: almalinux:8
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: make
        run: |
          dnf -y install epel-release gcc make procps-ng which
          make -j SERVER_CFLAGS='-Werror'

  format-yaml:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Set up Go
        uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
        with:
          go-version: "1.22.4"

      - name: Setup YAML formatter
        run: |
          go install github.com/google/yamlfmt/cmd/yamlfmt@latest

      - name: Run yamlfmt
        id: yamlfmt
        run: |
          yamlfmt -lint -conf .config/format.yml .
          # Capture the diff output
          DIFF=$(git diff)
          if [ ! -z "$DIFF" ]; then
            # Encode the diff in Base64 to ensure it's handled as a single line
            ENCODED_DIFF=$(echo "$DIFF" | base64 -w 0)
            echo "diff=$ENCODED_DIFF" >> $GITHUB_OUTPUT
          fi
        shell: bash

      - name: Check for formatting changes
        if: ${{ steps.yamlfmt.outputs.diff }}
        run: |
          echo "ERROR: YAML file is not formatted properly. Here is the diff: "
          # Decode the Base64 diff to display it
          echo "${{ steps.clang-format.outputs.diff }}" | base64 --decode
          exit 1
        shell: bash
