summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Prokazov <prokazov@users.noreply.github.com>2023-02-08 06:18:49 -0600
committerGitHub <noreply@github.com>2023-02-08 14:18:49 +0200
commit2b470cb76534eca04e181e1877a0674032f7e82a (patch)
tree8cdb8c1ce1c22fd135c8ed47efe6e26d53d4172a
parent5cb5712d283fa8fb300abc9d71a61c1a81de5643 (diff)
downloadredis-py-2b470cb76534eca04e181e1877a0674032f7e82a.tar.gz
Fix #2581 UnixDomainSocketConnection' object has no attribute '_command_packer' (#2583)
* Fix #2581 UnixDomainSocketConnection' object has no attribute '_command_packer' . Apparently there is no end-to-end tests for Unix sockets so automation didn't catch it. I assume that setting up domain sockets reliably in dockerized environment is not very trivial. Added test for pack_command specifically. * Figuring out why CI fails. Locally: " congratulations :)" * Fix the test. hiredis doesn't treat memoryviews differently.
-rw-r--r--redis/connection.py2
-rw-r--r--tests/test_connection.py44
2 files changed, 45 insertions, 1 deletions
diff --git a/redis/connection.py b/redis/connection.py
index 2461482..d35980c 100644
--- a/redis/connection.py
+++ b/redis/connection.py
@@ -1153,6 +1153,7 @@ class UnixDomainSocketConnection(Connection):
retry=None,
redis_connect_func=None,
credential_provider: Optional[CredentialProvider] = None,
+ command_packer=None,
):
"""
Initialize a new UnixDomainSocketConnection.
@@ -1202,6 +1203,7 @@ class UnixDomainSocketConnection(Connection):
self.set_parser(parser_class)
self._connect_callbacks = []
self._buffer_cutoff = 6000
+ self._command_packer = self._construct_command_packer(command_packer)
def repr_pieces(self):
pieces = [("path", self.path), ("db", self.db)]
diff --git a/tests/test_connection.py b/tests/test_connection.py
index e0b53cd..25b4118 100644
--- a/tests/test_connection.py
+++ b/tests/test_connection.py
@@ -7,7 +7,13 @@ import pytest
import redis
from redis.backoff import NoBackoff
-from redis.connection import Connection, HiredisParser, PythonParser
+from redis.connection import (
+ Connection,
+ HiredisParser,
+ PythonParser,
+ SSLConnection,
+ UnixDomainSocketConnection,
+)
from redis.exceptions import ConnectionError, InvalidResponse, TimeoutError
from redis.retry import Retry
from redis.utils import HIREDIS_AVAILABLE
@@ -163,3 +169,39 @@ def test_connection_parse_response_resume(r: redis.Redis, parser_class):
pytest.fail("didn't receive a response")
assert response
assert i > 0
+
+
+@pytest.mark.onlynoncluster
+@pytest.mark.parametrize(
+ "Class",
+ [
+ Connection,
+ SSLConnection,
+ UnixDomainSocketConnection,
+ ],
+)
+def test_pack_command(Class):
+ """
+ This test verifies that the pack_command works
+ on all supported connections. #2581
+ """
+ cmd = (
+ "HSET",
+ "foo",
+ "key",
+ "value1",
+ b"key_b",
+ b"bytes str",
+ b"key_i",
+ 67,
+ "key_f",
+ 3.14159265359,
+ )
+ expected = (
+ b"*10\r\n$4\r\nHSET\r\n$3\r\nfoo\r\n$3\r\nkey\r\n$6\r\nvalue1\r\n"
+ b"$5\r\nkey_b\r\n$9\r\nbytes str\r\n$5\r\nkey_i\r\n$2\r\n67\r\n$5"
+ b"\r\nkey_f\r\n$13\r\n3.14159265359\r\n"
+ )
+
+ actual = Class().pack_command(*cmd)[0]
+ assert actual == expected, f"actual = {actual}, expected = {expected}"