Skip to content
This repository was archived by the owner on Sep 11, 2019. It is now read-only.

Fix handling of invalid expiry times #8

Merged
merged 1 commit into from
Jan 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 9 additions & 10 deletions fakenewsredis.py
Original file line number Diff line number Diff line change
Expand Up @@ -510,26 +510,25 @@ def renamenx(self, src, dst):
def set(self, name, value, ex=None, px=None, nx=False, xx=False):
if (not nx and not xx) or (nx and self._db.get(name, None) is None) \
or (xx and not self._db.get(name, None) is None):
self._db[name] = to_bytes(value)
if ex is not None:
if isinstance(ex, timedelta):
ex = ex.seconds + ex.days * 24 * 3600
if ex < 0:
if ex <= 0:
raise ResponseError('invalid expire time in SETEX')
if ex > 0:
self._db.expire(name, datetime.now() +
timedelta(seconds=ex))
self._db[name] = to_bytes(value)
self._db.expire(name, datetime.now() +
timedelta(seconds=ex))
elif px is not None:
if isinstance(px, timedelta):
ms = int(px.microseconds / 1000)
px = (px.seconds + px.days * 24 * 3600) * 1000 + ms
if px < 0:
if px <= 0:
raise ResponseError('invalid expire time in SETEX')
if px > 0:
self._db.expire(name, datetime.now() +
timedelta(milliseconds=px))
self._db[name] = to_bytes(value)
self._db.expire(name, datetime.now() +
timedelta(milliseconds=px))
else:
self._db.persist(name)
self._db[name] = to_bytes(value)
return True
else:
return None
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Flake8 3.0.0 does not support Python 2.6.
flake8<3.0.0
nose==1.3.4
redis==2.10.5
redis==2.10.6
20 changes: 19 additions & 1 deletion test_fakenewsredis.py
Original file line number Diff line number Diff line change
Expand Up @@ -501,26 +501,44 @@ def test_set_px_using_timedelta(self):
def test_set_raises_wrong_ex(self):
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', ex=-100)
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', ex=0)
self.assertFalse(self.redis.exists('foo'))

def test_set_using_timedelta_raises_wrong_ex(self):
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', ex=timedelta(seconds=-100))
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', ex=timedelta(seconds=0))
self.assertFalse(self.redis.exists('foo'))

def test_set_raises_wrong_px(self):
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', px=-100)
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', px=0)
self.assertFalse(self.redis.exists('foo'))

def test_set_using_timedelta_raises_wrong_px(self):
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', px=timedelta(milliseconds=-100))
with self.assertRaises(ResponseError):
self.redis.set('foo', 'bar', px=timedelta(milliseconds=0))
self.assertFalse(self.redis.exists('foo'))

def test_setex_raises_wrong_ex(self):
with self.assertRaises(ResponseError):
self.redis.setex('foo', -100, 'bar')
with self.assertRaises(ResponseError):
self.redis.setex('foo', 0, 'bar')
self.assertFalse(self.redis.exists('foo'))

def test_setex_using_timedelta_raises_wrong_ex(self):
with self.assertRaises(ResponseError):
self.redis.setex('foo', timedelta(seconds=-100), 'bar')
with self.assertRaises(ResponseError):
self.redis.setex('foo', timedelta(seconds=-100), 'bar')
self.assertFalse(self.redis.exists('foo'))

def test_setnx(self):
self.assertEqual(self.redis.setnx('foo', 'bar'), True)
Expand Down Expand Up @@ -3142,7 +3160,7 @@ def test_set_xx_set_value_when_exists(self):

@attr('slow')
def test_set_ex_should_expire_value(self):
self.redis.set('foo', 'bar', ex=0)
self.redis.set('foo', 'bar')
self.assertEqual(self.redis.get('foo'), b'bar')
self.redis.set('foo', 'bar', ex=1)
sleep(2)
Expand Down