summaryrefslogtreecommitdiff
path: root/tests/conftest.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/conftest.py')
-rw-r--r--tests/conftest.py168
1 files changed, 91 insertions, 77 deletions
diff --git a/tests/conftest.py b/tests/conftest.py
index 8ed39ab..24783c0 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,15 +1,16 @@
-from redis.backoff import NoBackoff
-from redis.retry import Retry
-import pytest
import random
-import redis
import time
from distutils.version import LooseVersion
-from redis.connection import parse_url
-from redis.exceptions import RedisClusterException
from unittest.mock import Mock
from urllib.parse import urlparse
+import pytest
+
+import redis
+from redis.backoff import NoBackoff
+from redis.connection import parse_url
+from redis.exceptions import RedisClusterException
+from redis.retry import Retry
REDIS_INFO = {}
default_redis_url = "redis://localhost:6379/9"
@@ -19,29 +20,37 @@ default_cluster_nodes = 6
def pytest_addoption(parser):
- parser.addoption('--redis-url', default=default_redis_url,
- action="store",
- help="Redis connection string,"
- " defaults to `%(default)s`")
-
- parser.addoption('--redismod-url', default=default_redismod_url,
- action="store",
- help="Connection string to redis server"
- " with loaded modules,"
- " defaults to `%(default)s`")
-
- parser.addoption('--redis-cluster-nodes', default=default_cluster_nodes,
- action="store",
- help="The number of cluster nodes that need to be "
- "available before the test can start,"
- " defaults to `%(default)s`")
+ parser.addoption(
+ "--redis-url",
+ default=default_redis_url,
+ action="store",
+ help="Redis connection string," " defaults to `%(default)s`",
+ )
+
+ parser.addoption(
+ "--redismod-url",
+ default=default_redismod_url,
+ action="store",
+ help="Connection string to redis server"
+ " with loaded modules,"
+ " defaults to `%(default)s`",
+ )
+
+ parser.addoption(
+ "--redis-cluster-nodes",
+ default=default_cluster_nodes,
+ action="store",
+ help="The number of cluster nodes that need to be "
+ "available before the test can start,"
+ " defaults to `%(default)s`",
+ )
def _get_info(redis_url):
client = redis.Redis.from_url(redis_url)
info = client.info()
cmds = [command.upper() for command in client.command().keys()]
- if 'dping' in cmds:
+ if "dping" in cmds:
info["enterprise"] = True
else:
info["enterprise"] = False
@@ -102,42 +111,39 @@ def wait_for_cluster_creation(redis_url, cluster_nodes, timeout=20):
available_nodes = 0 if client is None else len(client.get_nodes())
raise RedisClusterException(
f"The cluster did not become available after {timeout} seconds. "
- f"Only {available_nodes} nodes out of {cluster_nodes} are available")
+ f"Only {available_nodes} nodes out of {cluster_nodes} are available"
+ )
def skip_if_server_version_lt(min_version):
redis_version = REDIS_INFO["version"]
check = LooseVersion(redis_version) < LooseVersion(min_version)
- return pytest.mark.skipif(
- check,
- reason=f"Redis version required >= {min_version}")
+ return pytest.mark.skipif(check, reason=f"Redis version required >= {min_version}")
def skip_if_server_version_gte(min_version):
redis_version = REDIS_INFO["version"]
check = LooseVersion(redis_version) >= LooseVersion(min_version)
- return pytest.mark.skipif(
- check,
- reason=f"Redis version required < {min_version}")
+ return pytest.mark.skipif(check, reason=f"Redis version required < {min_version}")
def skip_unless_arch_bits(arch_bits):
- return pytest.mark.skipif(REDIS_INFO["arch_bits"] != arch_bits,
- reason=f"server is not {arch_bits}-bit")
+ return pytest.mark.skipif(
+ REDIS_INFO["arch_bits"] != arch_bits, reason=f"server is not {arch_bits}-bit"
+ )
def skip_ifmodversion_lt(min_version: str, module_name: str):
try:
modules = REDIS_INFO["modules"]
except KeyError:
- return pytest.mark.skipif(True,
- reason="Redis server does not have modules")
+ return pytest.mark.skipif(True, reason="Redis server does not have modules")
if modules == []:
return pytest.mark.skipif(True, reason="No redis modules found")
for j in modules:
- if module_name == j.get('name'):
- version = j.get('ver')
+ if module_name == j.get("name"):
+ version = j.get("ver")
mv = int(min_version.replace(".", ""))
check = version < mv
return pytest.mark.skipif(check, reason="Redis module version")
@@ -155,9 +161,9 @@ def skip_ifnot_redis_enterprise(func):
return pytest.mark.skipif(check, reason="Not running in redis enterprise")
-def _get_client(cls, request, single_connection_client=True, flushdb=True,
- from_url=None,
- **kwargs):
+def _get_client(
+ cls, request, single_connection_client=True, flushdb=True, from_url=None, **kwargs
+):
"""
Helper for fixtures or tests that need a Redis client
@@ -181,6 +187,7 @@ def _get_client(cls, request, single_connection_client=True, flushdb=True,
if single_connection_client:
client = client.client()
if request:
+
def teardown():
if not cluster_mode:
if flushdb:
@@ -194,6 +201,7 @@ def _get_client(cls, request, single_connection_client=True, flushdb=True,
client.connection_pool.disconnect()
else:
cluster_teardown(client, flushdb)
+
request.addfinalizer(teardown)
return client
@@ -201,11 +209,11 @@ def _get_client(cls, request, single_connection_client=True, flushdb=True,
def cluster_teardown(client, flushdb):
if flushdb:
try:
- client.flushdb(target_nodes='primaries')
+ client.flushdb(target_nodes="primaries")
except redis.ConnectionError:
# handle cases where a test disconnected a client
# just manually retry the flushdb
- client.flushdb(target_nodes='primaries')
+ client.flushdb(target_nodes="primaries")
client.close()
client.disconnect_connection_pools()
@@ -214,9 +222,10 @@ def cluster_teardown(client, flushdb):
# an index on db != 0 raises a ResponseError in redis
@pytest.fixture()
def modclient(request, **kwargs):
- rmurl = request.config.getoption('--redismod-url')
- with _get_client(redis.Redis, request, from_url=rmurl,
- decode_responses=True, **kwargs) as client:
+ rmurl = request.config.getoption("--redismod-url")
+ with _get_client(
+ redis.Redis, request, from_url=rmurl, decode_responses=True, **kwargs
+ ) as client:
yield client
@@ -250,56 +259,61 @@ def _gen_cluster_mock_resp(r, response):
@pytest.fixture()
def mock_cluster_resp_ok(request, **kwargs):
r = _get_client(redis.Redis, request, **kwargs)
- return _gen_cluster_mock_resp(r, 'OK')
+ return _gen_cluster_mock_resp(r, "OK")
@pytest.fixture()
def mock_cluster_resp_int(request, **kwargs):
r = _get_client(redis.Redis, request, **kwargs)
- return _gen_cluster_mock_resp(r, '2')
+ return _gen_cluster_mock_resp(r, "2")
@pytest.fixture()
def mock_cluster_resp_info(request, **kwargs):
r = _get_client(redis.Redis, request, **kwargs)
- response = ('cluster_state:ok\r\ncluster_slots_assigned:16384\r\n'
- 'cluster_slots_ok:16384\r\ncluster_slots_pfail:0\r\n'
- 'cluster_slots_fail:0\r\ncluster_known_nodes:7\r\n'
- 'cluster_size:3\r\ncluster_current_epoch:7\r\n'
- 'cluster_my_epoch:2\r\ncluster_stats_messages_sent:170262\r\n'
- 'cluster_stats_messages_received:105653\r\n')
+ response = (
+ "cluster_state:ok\r\ncluster_slots_assigned:16384\r\n"
+ "cluster_slots_ok:16384\r\ncluster_slots_pfail:0\r\n"
+ "cluster_slots_fail:0\r\ncluster_known_nodes:7\r\n"
+ "cluster_size:3\r\ncluster_current_epoch:7\r\n"
+ "cluster_my_epoch:2\r\ncluster_stats_messages_sent:170262\r\n"
+ "cluster_stats_messages_received:105653\r\n"
+ )
return _gen_cluster_mock_resp(r, response)
@pytest.fixture()
def mock_cluster_resp_nodes(request, **kwargs):
r = _get_client(redis.Redis, request, **kwargs)
- response = ('c8253bae761cb1ecb2b61857d85dfe455a0fec8b 172.17.0.7:7006 '
- 'slave aa90da731f673a99617dfe930306549a09f83a6b 0 '
- '1447836263059 5 connected\n'
- '9bd595fe4821a0e8d6b99d70faa660638a7612b3 172.17.0.7:7008 '
- 'master - 0 1447836264065 0 connected\n'
- 'aa90da731f673a99617dfe930306549a09f83a6b 172.17.0.7:7003 '
- 'myself,master - 0 0 2 connected 5461-10922\n'
- '1df047e5a594f945d82fc140be97a1452bcbf93e 172.17.0.7:7007 '
- 'slave 19efe5a631f3296fdf21a5441680f893e8cc96ec 0 '
- '1447836262556 3 connected\n'
- '4ad9a12e63e8f0207025eeba2354bcf4c85e5b22 172.17.0.7:7005 '
- 'master - 0 1447836262555 7 connected 0-5460\n'
- '19efe5a631f3296fdf21a5441680f893e8cc96ec 172.17.0.7:7004 '
- 'master - 0 1447836263562 3 connected 10923-16383\n'
- 'fbb23ed8cfa23f17eaf27ff7d0c410492a1093d6 172.17.0.7:7002 '
- 'master,fail - 1447829446956 1447829444948 1 disconnected\n'
- )
+ response = (
+ "c8253bae761cb1ecb2b61857d85dfe455a0fec8b 172.17.0.7:7006 "
+ "slave aa90da731f673a99617dfe930306549a09f83a6b 0 "
+ "1447836263059 5 connected\n"
+ "9bd595fe4821a0e8d6b99d70faa660638a7612b3 172.17.0.7:7008 "
+ "master - 0 1447836264065 0 connected\n"
+ "aa90da731f673a99617dfe930306549a09f83a6b 172.17.0.7:7003 "
+ "myself,master - 0 0 2 connected 5461-10922\n"
+ "1df047e5a594f945d82fc140be97a1452bcbf93e 172.17.0.7:7007 "
+ "slave 19efe5a631f3296fdf21a5441680f893e8cc96ec 0 "
+ "1447836262556 3 connected\n"
+ "4ad9a12e63e8f0207025eeba2354bcf4c85e5b22 172.17.0.7:7005 "
+ "master - 0 1447836262555 7 connected 0-5460\n"
+ "19efe5a631f3296fdf21a5441680f893e8cc96ec 172.17.0.7:7004 "
+ "master - 0 1447836263562 3 connected 10923-16383\n"
+ "fbb23ed8cfa23f17eaf27ff7d0c410492a1093d6 172.17.0.7:7002 "
+ "master,fail - 1447829446956 1447829444948 1 disconnected\n"
+ )
return _gen_cluster_mock_resp(r, response)
@pytest.fixture()
def mock_cluster_resp_slaves(request, **kwargs):
r = _get_client(redis.Redis, request, **kwargs)
- response = ("['1df047e5a594f945d82fc140be97a1452bcbf93e 172.17.0.7:7007 "
- "slave 19efe5a631f3296fdf21a5441680f893e8cc96ec 0 "
- "1447836789290 3 connected']")
+ response = (
+ "['1df047e5a594f945d82fc140be97a1452bcbf93e 172.17.0.7:7007 "
+ "slave 19efe5a631f3296fdf21a5441680f893e8cc96ec 0 "
+ "1447836789290 3 connected']"
+ )
return _gen_cluster_mock_resp(r, response)
@@ -315,15 +329,15 @@ def wait_for_command(client, monitor, command):
# if we find a command with our key before the command we're waiting
# for, something went wrong
redis_version = REDIS_INFO["version"]
- if LooseVersion(redis_version) >= LooseVersion('5.0.0'):
+ if LooseVersion(redis_version) >= LooseVersion("5.0.0"):
id_str = str(client.client_id())
else:
- id_str = f'{random.randrange(2 ** 32):08x}'
- key = f'__REDIS-PY-{id_str}__'
+ id_str = f"{random.randrange(2 ** 32):08x}"
+ key = f"__REDIS-PY-{id_str}__"
client.get(key)
while True:
monitor_response = monitor.next_command()
- if command in monitor_response['command']:
+ if command in monitor_response["command"]:
return monitor_response
- if key in monitor_response['command']:
+ if key in monitor_response["command"]:
return None