# SPDX-FileCopyrightText: 2024 Redict Contributors
# SPDX-FileCopyrightText: 2024 Salvatore Sanfilippo <antirez at gmail dot com>
#
# SPDX-License-Identifier: BSD-3-Clause
# SPDX-License-Identifier: LGPL-3.0-only

# Test for the SENTINEL CKQUORUM command

source "../tests/includes/init-tests.tcl"
set num_sentinels [llength $::sentinel_instances]

test "CKQUORUM reports OK and the right amount of Sentinels" {
    foreach_sentinel_id id {
        assert_match "*OK $num_sentinels usable*" [S $id SENTINEL CKQUORUM mymaster]
    }
}

test "CKQUORUM detects quorum cannot be reached" {
    set orig_quorum [expr {$num_sentinels/2+1}]
    S 0 SENTINEL SET mymaster quorum [expr {$num_sentinels+1}]
    catch {[S 0 SENTINEL CKQUORUM mymaster]} err
    assert_match "*NOQUORUM*" $err
    S 0 SENTINEL SET mymaster quorum $orig_quorum
}

test "CKQUORUM detects failover authorization cannot be reached" {
    set orig_quorum [expr {$num_sentinels/2+1}]
    S 0 SENTINEL SET mymaster quorum 1
    for {set i 0} {$i < $orig_quorum} {incr i} {
        kill_instance sentinel [expr {$i + 1}]
    }

    # We need to make sure that other sentinels are in `DOWN` state
    # from the point of view of S 0 before we executing `CKQUORUM`.
    wait_for_condition 300 50 {
        [catch {S 0 SENTINEL CKQUORUM mymaster}] == 1
    } else {
        fail "At least $orig_quorum sentinels did not enter the down state."
    }

    assert_error "*NOQUORUM*" {S 0 SENTINEL CKQUORUM mymaster}

    S 0 SENTINEL SET mymaster quorum $orig_quorum
    for {set i 0} {$i < $orig_quorum} {incr i} {
        restart_instance sentinel [expr {$i + 1}]
    }
}

