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

Commit

Permalink
Fix handling of invalid expiry times
Browse files Browse the repository at this point in the history
This fixes #5 (zero expiry time should be treated as invalid) and #7
(key should not be set when expiry time is invalid).
  • Loading branch information
bmerry committed Jan 24, 2018
1 parent 0472a6e commit 4bd92c7
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 12 deletions.
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

0 comments on commit 4bd92c7

Please sign in to comment.