Files
scylladb/test/redis/test_strings.py
Takuya ASADA 7a6ee9858f redis: fix large message handling
If the message is larger than current buffer size, we need to consume
more data until we reach to tail of the message.
To do so, we need to return nullptr when it's not on the tail.

Fixes #7273
2021-01-25 10:26:37 +09:00

247 lines
7.1 KiB
Python

#
# Copyright (C) 2019 pengjian.uestc @ gmail.com
#
#
# This file is part of Scylla.
#
# Scylla is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Scylla is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Scylla. If not, see <http://www.gnu.org/licenses/>.
#
import pytest
import redis
import logging
import re
import time
from util import random_string, connect
logger = logging.getLogger('redis-test')
def test_set_get_delete(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = random_string(10)
assert r.set(key, val) == True
assert r.get(key) == val
assert r.delete(key) == 1
assert r.get(key) == None
def test_get(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
r.delete(key)
assert r.get(key) == None
def test_del_existent_key(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = random_string(10)
r.set(key, val)
assert r.get(key) == val
assert r.delete(key) == 1
@pytest.mark.xfail(reason="DEL command does not support to return number of deleted keys")
def test_del_non_existent_key(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
r.delete(key)
assert r.delete(key) == 0
def test_set_empty_string(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = ""
r.set(key, val)
assert r.get(key) == val
r.delete(key)
def test_set_large_string(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = random_string(4096)
r.set(key, val)
assert r.get(key) == val
r.delete(key)
def test_ping(redis_host, redis_port):
r = connect(redis_host, redis_port)
assert r.ping() == True
def test_echo(redis_host, redis_port):
r = connect(redis_host, redis_port)
assert r.echo('hello world') == 'hello world'
def test_select(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = random_string(4096)
r.set(key, val)
assert r.get(key) == val
logger.debug('Switch to database 1')
assert r.execute_command('SELECT 1') == 'OK'
assert r.get(key) == None
logger.debug('Switch back to default database 0')
assert r.execute_command('SELECT 0') == 'OK'
assert r.get(key) == val
r.delete(key)
assert r.get(key) == None
def test_select_invalid_db(redis_host, redis_port):
r = connect(redis_host, redis_port)
logger.debug('Assume that user will not set redis_database_count to be bigger as 100')
invalid_db_idx = 100
logger.debug('Try to switch to invalid database {}'.format(invalid_db_idx))
try:
query = 'SELECT {}'.format(invalid_db_idx)
r.execute_command(query)
raise Exception('Expect that `{}` does not work'.format(query))
except redis.exceptions.ResponseError as ex:
assert str(ex) == 'DB index is out of range'
def test_exists_existent_key(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = random_string(10)
r.set(key, val)
assert r.get(key) == val
assert r.exists(key) == 1
def test_exists_non_existent_key(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
r.delete(key)
assert r.exists(key) == 0
def test_exists_multiple_existent_key(redis_host, redis_port):
r = connect(redis_host, redis_port)
key1 = random_string(10)
val1 = random_string(10)
key2 = random_string(10)
val2 = random_string(10)
key3 = random_string(10)
val3 = random_string(10)
key4 = random_string(10)
r.set(key1, val1)
r.set(key2, val2)
r.set(key3, val3)
r.delete(key4)
assert r.get(key1) == val1
assert r.get(key2) == val2
assert r.get(key3) == val3
assert r.get(key4) == None
assert r.exists(key1, key2, key3, key4) == 3
def test_exists_lots_of_keys(redis_host, redis_port):
r = connect(redis_host, redis_port)
keys = []
for i in range(0, 30):
k = random_string(11)
v = random_string(10)
r.set(k, v)
keys.append(k)
assert r.exists(*keys) == len(keys)
def test_setex_ttl(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = random_string(10)
assert r.setex(key, 100, val) == True
time.sleep(1)
assert r.ttl(key) == 99
def test_set_ex(redis_host, redis_port):
r = connect(redis_host, redis_port)
key = random_string(10)
val = random_string(10)
assert r.execute_command('SET', key, val, 'EX', 100)
time.sleep(1)
assert r.ttl(key) == 99
def test_lolwut(redis_host, redis_port):
pattern1 = r'''
^⠀⡤⠤⠤⠤⠤⠤⠤⠤⡄
⠀⡇⠀⠀⠀⠀⠀⠀⠀⡇
⠀⡇⠀⠀⠀⠀⠀⠀⠀⡇
⠀⡇⠀⠀⠀⠀⠀⠀⠀⡇
⠀⡧⠤⠤⠤⠤⠤⠤⠤⡇
⠀⡇⠀⠀⠀⠀⠀⠀⠀⡇
⠀⡇⠀⠀⠀⠀⠀⠀⠀⡇
⠀⡇⠀⠀⠀⠀⠀⠀⠀⡇
⠀⠧⠤⠤⠤⠤⠤⠤⠤⠇
Georg Nees - schotter, plotter on paper, 1968\. Redis ver\. [0-9]+\.[0-9]+\.[0-9]+
'''[1:-1]
pattern2 = r'''
^⠀⡤⠤⠤⠤⡤⠤⠤⠤⡄
⠀⡇⠀⠀⠀⡇⠀⠀⠀⡇
⠀⡧⠤⠤⠤⡧⠤⠤⠤⡇
⠀⡇⠀⠀⠀⡇⠀⠀⠀⡇
⠀⠧⠤⠤⠤⠧⠤⠤⠤⠇
Georg Nees - schotter, plotter on paper, 1968\. Redis ver\. [0-9]+\.[0-9]+\.[0-9]+
'''[1:-1]
pattern3 = r'''
^⠀⡤⠤⡤⠤⡤⠤⡤⠤⡄
⠀⡧⠤⡧⠤⡧⠤⡧⠤⡇
⠀⠧⠤⠧⠤⠧⠤⠧⠤⠇
Georg Nees - schotter, plotter on paper, 1968\. Redis ver\. [0-9]+\.[0-9]+\.[0-9]+
'''[1:-1]
r = connect(redis_host, redis_port)
res = r.execute_command('LOLWUT', 10, 1, 2)
assert re.match(pattern1, res)
res = r.execute_command('LOLWUT', 10, 2, 2)
assert re.match(pattern2, res)
res = r.execute_command('LOLWUT', 10, 4, 2)
assert re.match(pattern3, res)
def test_strlen(redis_host, redis_port):
r = connect(redis_host, redis_port)
key1 = random_string(10)
val1 = random_string(10)
key2 = random_string(10)
val2 = random_string(1000)
key3 = random_string(10)
assert r.set(key1, val1) == True
assert r.set(key2, val2) == True
r.delete(key3)
assert r.strlen(key1) == 10
assert r.strlen(key2) == 1000
assert r.strlen(key3) == 0
@pytest.mark.xfail(reason="types on redis does not implemented yet")
def test_strlen_wrongtype(redis_host, redis_port):
r = connect(redis_host, redis_port)
key1 = random_string(10)
val1 = random_string(10)
val2 = random_string(10)
assert r.rpush(key1, val1)
assert r.rpush(key1, val2)
try:
r.strlen(key1)
except redis.exceptions.ResponseError as ex:
assert str(ex) == 'WRONGTYPE Operation against a key holding the wrong kind of value'