2014-07-14 18:48:33 +04:00
|
|
|
# coding: utf-8
|
|
|
|
# Test Cases for bit commands
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
import sys
|
|
|
|
import datetime, time
|
|
|
|
sys.path.append('..')
|
|
|
|
|
|
|
|
import ledis
|
|
|
|
from ledis._compat import b
|
|
|
|
from ledis import ResponseError
|
|
|
|
|
|
|
|
|
|
|
|
l = ledis.Ledis(port=6380)
|
|
|
|
|
|
|
|
|
|
|
|
def current_time():
|
|
|
|
return datetime.datetime.now()
|
|
|
|
|
|
|
|
|
|
|
|
class TestCmdBit(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
l.bdelete('a')
|
|
|
|
l.bdelete('non_exists_key')
|
|
|
|
|
|
|
|
def test_bget(self):
|
|
|
|
"bget is the same as get in K/V commands"
|
|
|
|
l.bmsetbit('a', 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 0)
|
|
|
|
assert l.bget('a') == b('\x7f')
|
|
|
|
|
|
|
|
def test_bdelete(self):
|
|
|
|
l.bsetbit('a', 0, 1)
|
|
|
|
assert l.bdelete('a')
|
|
|
|
assert not l.bdelete('non_exists_key')
|
|
|
|
|
|
|
|
def test_get_set_bit(self):
|
|
|
|
assert not l.bgetbit('a', 5)
|
|
|
|
assert not l.bsetbit('a', 5, True)
|
|
|
|
assert l.bgetbit('a', 5)
|
|
|
|
|
|
|
|
assert not l.bsetbit('a', 4, False)
|
|
|
|
assert not l.bgetbit('a', 4)
|
|
|
|
|
|
|
|
assert not l.bsetbit('a', 4, True)
|
|
|
|
assert l.bgetbit('a', 4)
|
|
|
|
|
|
|
|
assert l.bsetbit('a', 5, True)
|
|
|
|
assert l.bgetbit('a', 5)
|
|
|
|
|
|
|
|
def test_bmsetbit(self):
|
|
|
|
assert l.bmsetbit('a', 0, 1, 2, 1, 3, 1) == 3
|
|
|
|
|
|
|
|
def test_bcount(self):
|
|
|
|
l.bsetbit('a', 5, 1)
|
|
|
|
assert l.bcount('a') == 1
|
|
|
|
l.bsetbit('a', 6, 1)
|
|
|
|
assert l.bcount('a') == 2
|
|
|
|
l.bsetbit('a', 5, 0)
|
|
|
|
assert l.bcount('a') == 1
|
|
|
|
l.bmsetbit('a', 10, 1, 20, 1, 30, 1, 40, 1)
|
|
|
|
assert l.bcount('a') == 5
|
2014-07-21 05:52:53 +04:00
|
|
|
assert l.bcount('a', 0, 10) == 2
|
|
|
|
assert l.bcount('a', 20, 30) == 2
|
|
|
|
assert l.bcount('a', 10, 10) == 1
|
2014-07-14 18:48:33 +04:00
|
|
|
|
|
|
|
def test_bopt_not_empty_string(self):
|
|
|
|
l.bopt('not', 'r', 'a')
|
|
|
|
assert l.bget('r') is None
|
|
|
|
|
2014-07-21 05:52:53 +04:00
|
|
|
def test_bopt(self):
|
|
|
|
l.bmsetbit('a1', 10, 1, 30, 1, 50, 1, 70, 1, 90, 1)
|
|
|
|
l.bmsetbit('a2', 20, 1, 40, 1, 60, 1, 80, 1, 100, 1)
|
|
|
|
assert l.bopt('and', 'res1', 'a1', 'a2') == 101
|
|
|
|
assert l.bcount('res1') == 0
|
|
|
|
|
|
|
|
assert l.bopt('or', 'res2', 'a1', 'a2') == 101
|
|
|
|
assert l.bcount('res2') == 10
|
|
|
|
|
|
|
|
assert l.bopt('xor', 'res3', 'a1', 'a2') == 101
|
|
|
|
assert l.bcount('res3') == 10
|
|
|
|
|
|
|
|
assert l.bopt('not', 'res4', 'a1') == 91
|
|
|
|
assert l.bcount('res4') == 86
|
2014-07-14 18:48:33 +04:00
|
|
|
|
|
|
|
def test_bexpire(self):
|
|
|
|
assert not l.bexpire('a', 100)
|
|
|
|
l.bsetbit('a', 1, True)
|
|
|
|
assert l.bexpire('a', 100)
|
|
|
|
assert 0 < l.bttl('a') <= 100
|
|
|
|
assert l.bpersist('a')
|
|
|
|
assert l.bttl('a') == -1
|
|
|
|
|
|
|
|
def test_bexpireat_datetime(self):
|
|
|
|
expire_at = current_time() + datetime.timedelta(minutes=1)
|
|
|
|
l.bsetbit('a', 1, True)
|
|
|
|
assert l.bexpireat('a', expire_at)
|
|
|
|
assert 0 < l.bttl('a') <= 61
|
|
|
|
|
|
|
|
def test_bexpireat_unixtime(self):
|
|
|
|
expire_at = current_time() + datetime.timedelta(minutes=1)
|
|
|
|
l.bsetbit('a', 1, True)
|
|
|
|
expire_at_seconds = int(time.mktime(expire_at.timetuple()))
|
|
|
|
assert l.bexpireat('a', expire_at_seconds)
|
|
|
|
assert 0 < l.bttl('a') <= 61
|
|
|
|
|
|
|
|
def test_bexpireat_no_key(self):
|
|
|
|
expire_at = current_time() + datetime.timedelta(minutes=1)
|
|
|
|
assert not l.bexpireat('a', expire_at)
|
|
|
|
|
|
|
|
def test_bttl_and_bpersist(self):
|
|
|
|
l.bsetbit('a', 1, True)
|
|
|
|
l.bexpire('a', 100)
|
|
|
|
assert 0 < l.bttl('a') <= 100
|
|
|
|
assert l.bpersist('a')
|
|
|
|
assert l.bttl('a') == -1
|