diff options
Diffstat (limited to 'tests/conftest.py')
-rw-r--r-- | tests/conftest.py | 168 |
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 |