Skip to content

Commit 0b4c56c

Browse files
committed
[GROW-2938] add a test for invalid index returned from load balancer
1 parent 8a7897c commit 0b4c56c

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

tests/test_cluster.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import binascii
22
import datetime
3+
import random
34
import select
45
import socket
56
import socketserver
@@ -8,11 +9,12 @@
89
import warnings
910
from queue import LifoQueue, Queue
1011
from time import sleep
12+
from unittest import mock
1113
from unittest.mock import DEFAULT, Mock, call, patch
1214

1315
import pytest
1416

15-
from redis import Redis
17+
from redis import Redis, crc
1618
from redis.backoff import (
1719
ConstantBackoff,
1820
ExponentialBackoff,
@@ -26,7 +28,7 @@
2628
ClusterNode,
2729
NodesManager,
2830
RedisCluster,
29-
get_node_name,
31+
get_node_name, LoadBalancer,
3032
)
3133
from redis.commands import CommandsParser
3234
from redis.connection import BlockingConnectionPool, Connection, ConnectionPool
@@ -2654,6 +2656,25 @@ def test_allow_custom_queue_class(self, queue_class):
26542656
for node in rc.nodes_manager.nodes_cache.values():
26552657
assert node.redis_connection.connection_pool.queue_class == queue_class
26562658

2659+
@pytest.mark.parametrize("invalid_index", [-10, 10])
2660+
def test_return_primary_if_invalid_node_index_is_returned(self, invalid_index):
2661+
rc = get_mocked_redis_client(
2662+
url="redis://[email protected]:7000",
2663+
cluster_slots=default_cluster_slots,
2664+
)
2665+
random_slot = random.randint(default_cluster_slots[0][0], default_cluster_slots[0][1])
2666+
2667+
ports = set()
2668+
for _ in range(0, 10):
2669+
ports.add(rc.nodes_manager.get_node_from_slot(random_slot, read_from_replicas=True).port)
2670+
assert ports == {default_port, 7003}
2671+
2672+
ports = set()
2673+
with mock.patch.object(LoadBalancer, "get_server_index", return_value=invalid_index):
2674+
for _ in range(0, 10):
2675+
ports.add(rc.nodes_manager.get_node_from_slot(random_slot, read_from_replicas=True).port)
2676+
assert ports == {default_port}
2677+
26572678

26582679
@pytest.mark.onlycluster
26592680
class TestClusterPubSubObject:

0 commit comments

Comments
 (0)