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,tls,freebsd,macos,alpine,32bit'
      skiptests:
        description: 'tests to skip (delete the ones you wanna keep, do not leave empty)'
        default: 'redis,modules,sentinel,cluster'
      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.repository == 'redis/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 "skipping: ${{github.event.inputs.skipjobs}} and ${{github.event.inputs.skiptests}}"
    - uses: actions/checkout@v2
      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: ./runtest-moduleapi --verbose ${{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
      run: ./src/redis-server test all

  test-ubuntu-libc-malloc:
    runs-on: ubuntu-latest
    if: github.repository == 'redis/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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make MALLOC=libc
    - 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: ./runtest-moduleapi --verbose ${{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.repository == 'redis/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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make MALLOC=libc CFLAGS=-DNO_MALLOC_USABLE_SIZE
    - 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: ./runtest-moduleapi --verbose ${{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.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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        sudo apt-get update && sudo apt-get install libc6-dev-i386
        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
        ./runtest-moduleapi --verbose ${{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
      run: ./src/redis-server test all

  test-ubuntu-tls:
    runs-on: ubuntu-latest
    if: 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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        make BUILD_TLS=yes
    - 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 --tls --dump-logs ${{github.event.inputs.test_args}}
        ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        ./runtest-moduleapi --verbose --tls ${{github.event.inputs.test_args}}
        ./runtest-moduleapi --verbose ${{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}}
        ./runtest-sentinel ${{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}}
        ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-ubuntu-io-threads:
    runs-on: ubuntu-latest
    if: 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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        make
    - 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 --config io-threads-do-reads yes --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 --config io-threads-do-reads yes ${{github.event.inputs.cluster_test_args}}

  test-valgrind:
    runs-on: ubuntu-latest
    if: github.repository == 'redis/redis' && !contains(github.event.inputs.skipjobs, 'valgrind')
    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
    - uses: actions/checkout@v2
      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: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --valgrind --verbose --clients 1 --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 ${{github.event.inputs.test_args}}
    - name: 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
        if grep -q 0x err.txt; then cat err.txt; exit 1; fi

  test-valgrind-no-malloc-usable-size:
    runs-on: ubuntu-latest
    if: github.repository == 'redis/redis' && !contains(github.event.inputs.skipjobs, 'valgrind')
    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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make valgrind CFLAGS="-DNO_MALLOC_USABLE_SIZE"
    - name: testprep
      run: |
        sudo apt-get update
        sudo apt-get install tcl8.6 tclx valgrind -y
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --valgrind --verbose --clients 1 --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 ${{github.event.inputs.test_args}}

  test-centos7-jemalloc:
    runs-on: ubuntu-latest
    if: github.repository == 'redis/redis'
    container: centos:7
    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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        yum -y install gcc make
        make
    - name: testprep
      run: yum -y install which tcl 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: ./runtest-moduleapi --verbose ${{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-centos7-tls:
    runs-on: ubuntu-latest
    if: github.repository == 'redis/redis' && !contains(github.event.inputs.skipjobs, 'tls')
    container: centos:7
    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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: |
        yum -y install centos-release-scl epel-release
        yum -y install devtoolset-7 openssl-devel openssl
        scl enable devtoolset-7 "make BUILD_TLS=yes"
    - name: testprep
      run: |
        yum -y install tcl tcltls tclx
        ./utils/gen-test-certs.sh
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: |
        ./runtest --accurate --verbose --tls --dump-logs ${{github.event.inputs.test_args}}
        ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: |
        ./runtest-moduleapi --verbose --tls ${{github.event.inputs.test_args}}
        ./runtest-moduleapi --verbose ${{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}}
        ./runtest-sentinel ${{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}}
        ./runtest-cluster ${{github.event.inputs.cluster_test_args}}

  test-macos-latest:
    runs-on: macos-latest
    if: github.repository == 'redis/redis' && !contains(github.event.inputs.skipjobs, 'macos')
    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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: make
      run: make
    - name: test
      if: true && !contains(github.event.inputs.skiptests, 'redis')
      run: ./runtest --accurate --verbose --no-latency --dump-logs ${{github.event.inputs.test_args}}
    - name: module api test
      if: true && !contains(github.event.inputs.skiptests, 'modules')
      run: ./runtest-moduleapi --verbose ${{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-freebsd:
    runs-on: macos-latest
    if: github.repository == 'redis/redis' && !contains(github.event.inputs.skipjobs, 'freebsd')
    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
    - uses: actions/checkout@v2
      with:
        repository: ${{ env.GITHUB_REPOSITORY }}
        ref: ${{ env.GITHUB_HEAD_REF }}
    - name: test
      uses: vmactions/freebsd-vm@v0.1.4
      with:
        usesh: true
        sync: rsync
        prepare: pkg install -y bash gmake lang/tcl86 lang/tclx
        run: >
          gmake || exit 1 ;
          if echo "${{github.event.inputs.skiptests}}" | grep -vq redis ; then ./runtest --accurate --verbose --no-latency --dump-logs ${{github.event.inputs.test_args}} || exit 1 ; fi ;
          if echo "${{github.event.inputs.skiptests}}" | grep -vq modules ; then MAKE=gmake ./runtest-moduleapi --verbose ${{github.event.inputs.test_args}} || exit 1 ; fi ;
          if echo "${{github.event.inputs.skiptests}}" | grep -vq sentinel ; then ./runtest-sentinel ${{github.event.inputs.cluster_test_args}} || exit 1 ; fi ;
          if echo "${{github.event.inputs.skiptests}}" | grep -vq cluster ; then ./runtest-cluster ${{github.event.inputs.cluster_test_args}} || exit 1 ; fi ;

  test-alpine-jemalloc:
    runs-on: ubuntu-latest
    if: 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
    - uses: actions/checkout@v2
      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: ./runtest-moduleapi --verbose ${{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.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
    - uses: actions/checkout@v2
      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: ./runtest-moduleapi --verbose ${{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}}
