name: Daily

on:
  pull_request:
    branches:
      # any PR to a release branch.
      - '[0-9].[0-9]'
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:
    inputs:
      skipjobs:
        description: 'jobs to skip (delete the ones you wanna keep, do not leave empty)'
        default: 'valgrind,sanitizer,tls,freebsd,macos,alpine,32bit,iothreads,ubuntu,centos,malloc,specific,fortify,reply-schema,oldTC'
      skiptests:
        description: 'tests to skip (delete the ones you wanna keep, do not leave empty)'
        default: 'redis,modules,sentinel,cluster,unittest'
      test_args:
        description: 'extra test arguments'
        default: ''
      cluster_test_args:
        description: 'extra cluster / sentinel test arguments'
        default: ''
      use_repo:
        description: 'repo owner and name'
        default: 'redis/redis'
      use_git_ref:
        description: 'git branch or sha to use'
        default: 'unstable'


jobs:

  test-ubuntu-jemalloc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'ubuntu')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make REDIS_CFLAGS='-Werror -DREDIS_TEST'
    - name: testprep
      run: sudo apt-get install tcl8.6 tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
    - name: unittest
      if: true && !contains(github.event.inputs.skiptests, 'unittest')
      run: ./src/redis-server test all --accurate

  test-ubuntu-jemalloc-fortify:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'fortify')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        apt-get update && apt-get install -y make gcc g++
        make CC=gcc REDIS_CFLAGS='-Werror -DREDIS_TEST -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3'
    - name: testprep
      run: sudo apt-get install -y tcl8.6 tclx procps
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
    - name: unittest
      if: true && !contains(github.event.inputs.skiptests, 'unittest')
      run: ./src/redis-server test all --accurate

  test-ubuntu-libc-malloc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'malloc')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make MALLOC=libc REDIS_CFLAGS='-Werror'
    - name: testprep
      run: sudo apt-get install tcl8.6 tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-ubuntu-no-malloc-usable-size:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'malloc')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make MALLOC=libc CFLAGS=-DNO_MALLOC_USABLE_SIZE REDIS_CFLAGS='-Werror'
    - name: testprep
      run: sudo apt-get install tcl8.6 tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-ubuntu-32bit:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, '32bit')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        sudo apt-get update && sudo apt-get install libc6-dev-i386 g++ gcc-multilib g++-multilib
        make 32bit REDIS_CFLAGS='-Werror -DREDIS_TEST'
    - name: testprep
      run: sudo apt-get install tcl8.6 tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        make -C tests/modules 32bit # the script below doesn't have an argument, we must build manually ahead of time
        CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
    - name: unittest
      if: true && !contains(github.event.inputs.skiptests, 'unittest')
      run: ./src/redis-server test all --accurate

  test-ubuntu-tls:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'tls')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        make BUILD_TLS=yes REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        sudo apt-get install tcl8.6 tclx tcl-tls
        ./utils/gen-test-certs.sh
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: |
        ./runtest --accurate --verbose --dump-logs --tls --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs --tls --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: |
        ./runtest-sentinel --tls ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: |
        ./runtest-cluster --tls ${{github.event.inputs.cluster_test_args}}

  test-ubuntu-tls-no-tls:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'tls')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        make BUILD_TLS=yes REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        sudo apt-get install tcl8.6 tclx tcl-tls
        ./utils/gen-test-certs.sh
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: |
        ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: |
        ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: |
        ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-ubuntu-io-threads:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'iothreads')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        make REDIS_CFLAGS='-Werror'
    - name: testprep
      run: sudo apt-get install tcl8.6 tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --config io-threads 4 --accurate --verbose --tags network --dump-logs ${{github.event.inputs.test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster --config io-threads 4 ${{github.event.inputs.cluster_test_args}}

  test-ubuntu-reclaim-cache:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'specific')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        make REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        sudo apt-get install vmtouch
        mkdir /tmp/master 
        mkdir /tmp/slave
    - name: warm up
      run: |
        ./src/redis-server --daemonize yes --logfile /dev/null
        ./src/redis-benchmark -n 1 > /dev/null
        ./src/redis-cli save | grep OK > /dev/null
        vmtouch -v ./dump.rdb > /dev/null
    - name: test
      run: |
        echo "test SAVE doesn't increase cache"
        CACHE0=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
        echo "$CACHE0"
        ./src/redis-server --daemonize yes --logfile /dev/null --dir /tmp/master --port 8080 --repl-diskless-sync no --pidfile /tmp/master/redis.pid --rdbcompression no --enable-debug-command yes
        ./src/redis-cli -p 8080 debug populate 10000 k 102400
        ./src/redis-server --daemonize yes --logfile /dev/null --dir /tmp/slave --port 8081 --repl-diskless-load disabled --rdbcompression no
        ./src/redis-cli -p 8080 save > /dev/null
        VMOUT=$(vmtouch -v /tmp/master/dump.rdb)
        echo $VMOUT
        grep -q " 0%" <<< $VMOUT 
        CACHE=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
        echo "$CACHE"
        if [ "$(( $CACHE-$CACHE0 ))" -gt "8000000" ]; then exit 1; fi

        echo "test replication doesn't increase cache"
        ./src/redis-cli -p 8081 REPLICAOF 127.0.0.1 8080 > /dev/null
        while [ $(./src/redis-cli -p 8081 info replication | grep "master_link_status:down") ]; do sleep 1; done;
        sleep 1 # wait for the completion of cache reclaim bio
        VMOUT=$(vmtouch -v /tmp/master/dump.rdb)
        echo $VMOUT
        grep -q " 0%" <<< $VMOUT 
        VMOUT=$(vmtouch -v /tmp/slave/dump.rdb)
        echo $VMOUT
        grep -q " 0%" <<< $VMOUT 
        CACHE=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
        echo "$CACHE"
        if [ "$(( $CACHE-$CACHE0 ))" -gt "8000000" ]; then exit 1; fi
        
        echo "test reboot doesn't increase cache"
        PID=$(cat /tmp/master/redis.pid)
        kill -15 $PID
        while [ -x /proc/${PID} ]; do sleep 1; done
        ./src/redis-server --daemonize yes --logfile /dev/null --dir /tmp/master --port 8080
        while [ $(./src/redis-cli -p 8080 info persistence | grep "loading:1") ]; do sleep 1; done;
        sleep 1 # wait for the completion of cache reclaim bio
        VMOUT=$(vmtouch -v /tmp/master/dump.rdb)
        echo $VMOUT
        grep -q " 0%" <<< $VMOUT
        CACHE=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
        echo "$CACHE"
        if [ "$(( $CACHE-$CACHE0 ))" -gt "8000000" ]; then exit 1; fi

  test-valgrind-test:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'valgrind') && !contains(github.event.inputs.skiptests, 'redis')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make valgrind REDIS_CFLAGS='-Werror -DREDIS_TEST'
    - name: testprep
      run: |
        sudo apt-get update
        sudo apt-get install tcl8.6 tclx valgrind g++ -y
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}

  test-valgrind-misc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'valgrind') && !(contains(github.event.inputs.skiptests, 'modules') && contains(github.event.inputs.skiptests, 'unittest'))
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make valgrind REDIS_CFLAGS='-Werror -DREDIS_TEST'
    - name: testprep
      run: |
        sudo apt-get update
        sudo apt-get install tcl8.6 tclx valgrind -y
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}
    - name: unittest
      if: true && !contains(github.event.inputs.skiptests, 'unittest')
      run: |
        valgrind --track-origins=yes --suppressions=./src/valgrind.sup --show-reachable=no --show-possibly-lost=no --leak-check=full --log-file=err.txt ./src/redis-server test all --valgrind
        if grep -q 0x err.txt; then cat err.txt; exit 1; fi

  test-valgrind-no-malloc-usable-size-test:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'valgrind') && !contains(github.event.inputs.skiptests, 'redis')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make valgrind CFLAGS="-DNO_MALLOC_USABLE_SIZE -DREDIS_TEST" REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        sudo apt-get update
        sudo apt-get install tcl8.6 tclx valgrind g++ -y
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}

  test-valgrind-no-malloc-usable-size-misc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'valgrind') && !(contains(github.event.inputs.skiptests, 'modules') && contains(github.event.inputs.skiptests, 'unittest'))
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make valgrind CFLAGS="-DNO_MALLOC_USABLE_SIZE -DREDIS_TEST" REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        sudo apt-get update
        sudo apt-get install tcl8.6 tclx valgrind -y
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}
    - name: unittest
      if: true && !contains(github.event.inputs.skiptests, 'unittest')
      run: |
        valgrind --track-origins=yes --suppressions=./src/valgrind.sup --show-reachable=no --show-possibly-lost=no --leak-check=full --log-file=err.txt ./src/redis-server test all --valgrind
        if grep -q 0x err.txt; then cat err.txt; exit 1; fi

  test-sanitizer-address:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'sanitizer')
    timeout-minutes: 14400
    strategy:
      matrix:
        compiler: [ gcc, clang ]
    env:
      CC: ${{ matrix.compiler }}
    steps:
      - name: prep
        if: github.event_name == 'workflow_dispatch'
        run: |
          echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
          echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
          echo "skipjobs: ${{github.event.inputs.skipjobs}}"
          echo "skiptests: ${{github.event.inputs.skiptests}}"
          echo "test_args: ${{github.event.inputs.test_args}}"
          echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
      - uses: actions/checkout@v4
        with:
          repository: ${{ env.GITHUB_REPOSITORY }}
          ref: ${{ env.GITHUB_HEAD_REF }}
      - name: make
        run: make SANITIZER=address REDIS_CFLAGS='-DREDIS_TEST -Werror -DDEBUG_ASSERTIONS'
      - name: testprep
        run: |
          sudo apt-get update
          sudo apt-get install tcl8.6 tclx -y
      - name: test
        if: true && !contains(github.event.inputs.skiptests, 'redis')
        run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: module api test
        if: true && !contains(github.event.inputs.skiptests, 'modules')
        run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: sentinel tests
        if: true && !contains(github.event.inputs.skiptests, 'sentinel')
        run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
      - name: cluster tests
        if: true && !contains(github.event.inputs.skiptests, 'cluster')
        run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
      - name: unittest
        if: true && !contains(github.event.inputs.skiptests, 'unittest')
        run: ./src/redis-server test all

  test-sanitizer-memory:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'sanitizer')
    timeout-minutes: 14400
    env:
      CC: clang # MSan work only with clang
    steps:
      - name: prep
        if: github.event_name == 'workflow_dispatch'
        run: |
          echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
          echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
          echo "skipjobs: ${{github.event.inputs.skipjobs}}"
          echo "skiptests: ${{github.event.inputs.skiptests}}"
          echo "test_args: ${{github.event.inputs.test_args}}"
          echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
      - uses: actions/checkout@v4
        with:
          repository: ${{ env.GITHUB_REPOSITORY }}
          ref: ${{ env.GITHUB_HEAD_REF }}
      - name: make
        run: make SANITIZER=memory REDIS_CFLAGS='-DREDIS_TEST -Werror -DDEBUG_ASSERTIONS'
      - name: testprep
        run: |
          sudo apt-get update
          sudo apt-get install tcl8.6 tclx -y
      - name: test
        if: true && !contains(github.event.inputs.skiptests, 'redis')
        run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: module api test
        if: true && !contains(github.event.inputs.skiptests, 'modules')
        run: SANITIZER=memory CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: sentinel tests
        if: true && !contains(github.event.inputs.skiptests, 'sentinel')
        run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
      - name: cluster tests
        if: true && !contains(github.event.inputs.skiptests, 'cluster')
        run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
      - name: unittest
        if: true && !contains(github.event.inputs.skiptests, 'unittest')
        run: ./src/redis-server test all

  test-sanitizer-undefined:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'sanitizer')
    timeout-minutes: 14400
    strategy:
      matrix:
        compiler: [ gcc, clang ]
    env:
      CC: ${{ matrix.compiler }}
    steps:
      - name: prep
        if: github.event_name == 'workflow_dispatch'
        run: |
          echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
          echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
          echo "skipjobs: ${{github.event.inputs.skipjobs}}"
          echo "skiptests: ${{github.event.inputs.skiptests}}"
          echo "test_args: ${{github.event.inputs.test_args}}"
          echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
      - uses: actions/checkout@v4
        with:
          repository: ${{ env.GITHUB_REPOSITORY }}
          ref: ${{ env.GITHUB_HEAD_REF }}
      - name: make
        run: make SANITIZER=undefined REDIS_CFLAGS='-DREDIS_TEST -Werror' SKIP_VEC_SETS=yes LUA_DEBUG=yes # we (ab)use this flow to also check Lua C API violations
      - name: testprep
        run: |
          sudo apt-get update
          sudo apt-get install tcl8.6 tclx -y
      - name: test
        if: true && !contains(github.event.inputs.skiptests, 'redis')
        run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: module api test
        if: true && !contains(github.event.inputs.skiptests, 'modules')
        run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: sentinel tests
        if: true && !contains(github.event.inputs.skiptests, 'sentinel')
        run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
      - name: cluster tests
        if: true && !contains(github.event.inputs.skiptests, 'cluster')
        run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
      - name: unittest
        if: true && !contains(github.event.inputs.skiptests, 'unittest')
        run: ./src/redis-server test all --accurate

  test-sanitizer-thread:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'sanitizer')
    timeout-minutes: 14400
    strategy:
      matrix:
        compiler: [ gcc, clang ]
    env:
      CC: ${{ matrix.compiler }}
    steps:
      - name: prep
        if: github.event_name == 'workflow_dispatch'
        run: |
          echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
          echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
          echo "skipjobs: ${{github.event.inputs.skipjobs}}"
          echo "skiptests: ${{github.event.inputs.skiptests}}"
          echo "test_args: ${{github.event.inputs.test_args}}"
          echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
      - uses: actions/checkout@v4
        with:
          repository: ${{ env.GITHUB_REPOSITORY }}
          ref: ${{ env.GITHUB_HEAD_REF }}
      - name: make
        # TODO Investigate why jemalloc with clang TSan crash on start;
        # with gcc TSan, jemalloc works modulo sentinel tests hanging.
        run: make SANITIZER=thread USE_JEMALLOC=no REDIS_CFLAGS='-DREDIS_TEST -Werror -DDEBUG_ASSERTIONS'
      - name: testprep
        run: |
          sudo apt-get update
          sudo apt-get install tcl8.6 tclx -y
      - name: test
        if: true && !contains(github.event.inputs.skiptests, 'redis')
        run: ./runtest --tsan --clients 1 --config io-threads 4 --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: module api test
        if: true && !contains(github.event.inputs.skiptests, 'modules')
        run: CFLAGS='-Werror' ./runtest-moduleapi --tsan --clients 1 --config io-threads 4 --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
      - name: sentinel tests
        if: true && !contains(github.event.inputs.skiptests, 'sentinel')
        run: ./runtest-sentinel --config io-threads 2 ${{github.event.inputs.cluster_test_args}}
      - name: cluster tests
        if: true && !contains(github.event.inputs.skiptests, 'cluster')
        run: ./runtest-cluster --config io-threads 2 ${{github.event.inputs.cluster_test_args}}

  test-centos-jemalloc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'centos')
    container: quay.io/centos/centos:stream9
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        dnf -y install which gcc make g++
        make REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        dnf -y install epel-release
        dnf -y install tcl tcltls procps-ng /usr/bin/kill
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-centos-tls-module:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'tls')
    container: quay.io/centos/centos:stream9
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        dnf -y install which gcc make openssl-devel openssl g++
        make BUILD_TLS=module REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        dnf -y install epel-release
        dnf -y install tcl tcltls procps-ng /usr/bin/kill
        ./utils/gen-test-certs.sh
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: |
        ./runtest --accurate --verbose --dump-logs --tls-module --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs --tls-module --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: |
        ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: |
        ./runtest-cluster --tls-module ${{github.event.inputs.cluster_test_args}}

  test-centos-tls-module-no-tls:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'tls')
    container: quay.io/centos/centos:stream9
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        dnf -y install which gcc make openssl-devel openssl g++
        make BUILD_TLS=module REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        dnf -y install epel-release
        dnf -y install tcl tcltls procps-ng /usr/bin/kill
        ./utils/gen-test-certs.sh
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: |
        ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: |
        ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: |
        ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-macos-latest:
    runs-on: macos-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'macos') && !(contains(github.event.inputs.skiptests, 'redis') && contains(github.event.inputs.skiptests, 'modules'))
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make REDIS_CFLAGS='-Werror'
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --clients 1 --no-latency --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --clients 1 --no-latency --dump-logs ${{github.event.inputs.test_args}}

  test-macos-latest-sentinel:
    runs-on: macos-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'macos') && !contains(github.event.inputs.skiptests, 'sentinel')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make REDIS_CFLAGS='-Werror'
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}

  test-macos-latest-cluster:
    runs-on: macos-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'macos') && !contains(github.event.inputs.skiptests, 'cluster')
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make REDIS_CFLAGS='-Werror'
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  build-macos:
    strategy:
      matrix:
        os: [macos-13, macos-15]
    runs-on: ${{ matrix.os }}
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'macos')
    timeout-minutes: 14400
    steps:
    - uses: maxim-lobanov/setup-xcode@v1
      with:
        xcode-version: latest
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make REDIS_CFLAGS='-Werror -DREDIS_TEST'

  test-freebsd:
    runs-on: macos-13
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'freebsd')
    timeout-minutes: 14400
    env:
      CC: clang
      CXX: clang++
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: test
      uses: cross-platform-actions/action@v0.22.0
      with:
        operating_system: freebsd
        environment_variables: MAKE
        version: 13.2
        shell: bash
        run: |
          sudo pkg install -y bash gmake lang/tcl86 lang/tclx gcc
          gmake
          ./runtest --single unit/keyspace --single unit/auth --single unit/networking --single unit/protocol

  test-alpine-jemalloc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'alpine')
    container: alpine:latest
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
          apk add build-base
          make REDIS_CFLAGS='-Werror'
    - name: testprep
      run: apk add tcl procps tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-alpine-libc-malloc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'alpine')
    container: alpine:latest
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
          apk add build-base
          make REDIS_CFLAGS='-Werror' USE_JEMALLOC=no CFLAGS=-DUSE_MALLOC_USABLE_SIZE
    - name: testprep
      run: apk add tcl procps tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  reply-schemas-validator:
    runs-on: ubuntu-latest
    timeout-minutes: 14400
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'reply-schema')
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make REDIS_CFLAGS='-Werror -DLOG_REQ_RES'
    - name: testprep
      run: sudo apt-get install tcl8.6 tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --log-req-res --no-latency --dont-clean --force-resp3 --tags -slow --verbose --dump-logs  ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --log-req-res --no-latency --dont-clean --force-resp3 --dont-pre-clean --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel --log-req-res --dont-clean --force-resp3 ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster --log-req-res --dont-clean --force-resp3 ${{github.event.inputs.cluster_test_args}}
    - name: Install Python dependencies
      uses: py-actions/py-dependency-install@v4
      with:
        path: "./utils/req-res-validator/requirements.txt"
    - name: validator
      run: ./utils/req-res-log-validator.py --verbose --fail-missing-reply-schemas ${{ (!contains(github.event.inputs.skiptests, 'redis') && !contains(github.event.inputs.skiptests, 'module') && !contains(github.event.inputs.sentinel, 'redis') && !contains(github.event.inputs.skiptests, 'cluster')) && github.event.inputs.test_args == '' && github.event.inputs.cluster_test_args == '' && '--fail-commands-not-all-hit' || '' }}

  test-old-chain-jemalloc:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'oldTC')
    container: ubuntu:20.04
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        apt-get update
        apt-get install -y gnupg2
        echo "deb http://archive.ubuntu.com/ubuntu/ xenial main" >> /etc/apt/sources.list
        echo "deb http://archive.ubuntu.com/ubuntu/ xenial universe" >> /etc/apt/sources.list
        apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
        apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
        apt-get update
        apt-get install -y make gcc-4.8 g++-4.8
        update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
        update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
        make CC=gcc REDIS_CFLAGS='-Werror'
    - name: testprep
      run: apt-get install -y tcl tcltls tclx
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-old-chain-tls-module:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'tls') && !contains(github.event.inputs.skipjobs, 'oldTC')
    container: ubuntu:20.04
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        apt-get update
        apt-get install -y gnupg2
        echo "deb http://archive.ubuntu.com/ubuntu/ xenial main" >> /etc/apt/sources.list
        echo "deb http://archive.ubuntu.com/ubuntu/ xenial universe" >> /etc/apt/sources.list
        apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
        apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
        apt-get update
        apt-get install -y make gcc-4.8 g++-4.8 openssl libssl-dev
        update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
        update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
        make CC=gcc CXX=g++ BUILD_TLS=module REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        apt-get install -y tcl tcltls tclx
        ./utils/gen-test-certs.sh
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: |
        ./runtest --accurate --verbose --dump-logs --tls-module --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs --tls-module --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: |
        ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: |
        ./runtest-cluster --tls-module ${{github.event.inputs.cluster_test_args}}

  test-old-chain-tls-module-no-tls:
    runs-on: ubuntu-latest
    if: |
      (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
      !contains(github.event.inputs.skipjobs, 'tls') && !contains(github.event.inputs.skipjobs, 'oldTC')
    container: ubuntu:20.04
    timeout-minutes: 14400
    steps:
    - name: prep
      if: github.event_name == 'workflow_dispatch'
      run: |
        echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
        echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
        echo "skipjobs: ${{github.event.inputs.skipjobs}}"
        echo "skiptests: ${{github.event.inputs.skiptests}}"
        echo "test_args: ${{github.event.inputs.test_args}}"
        echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
    - uses: actions/checkout@v4
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        apt-get update
        apt-get install -y gnupg2 
        echo "deb http://archive.ubuntu.com/ubuntu/ xenial main" >> /etc/apt/sources.list
        echo "deb http://archive.ubuntu.com/ubuntu/ xenial universe" >> /etc/apt/sources.list
        apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
        apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
        apt-get update
        apt-get install -y make gcc-4.8 g++-4.8 openssl libssl-dev
        update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
        update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
        make BUILD_TLS=module CC=gcc REDIS_CFLAGS='-Werror'
    - name: testprep
      run: |
        apt-get install -y tcl tcltls tclx
        ./utils/gen-test-certs.sh
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: |
        ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        CFLAGS='-Werror' ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: sentinel tests
      if: true && !contains(github.event.inputs.skiptests, 'sentinel')
      run: |
        ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
    - name: cluster tests
      if: true && !contains(github.event.inputs.skiptests, 'cluster')
      run: |
        ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
