Skip to content

Commit

Permalink
Add unit tests for storage interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
bauerj committed Nov 6, 2016
1 parent 2dfd695 commit d34e0ed
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
Empty file added tests/__init__.py
Empty file.
69 changes: 69 additions & 0 deletions tests/test_storage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import gc
import pytest
import os

from server.storage import Storage, open_db
from lib.util import subclasses

# Find out which db engines to test
# Those that are not installed will be skipped
db_engines = []
for c in subclasses(Storage):
try:
c.import_module()
except ImportError:
db_engines.append(pytest.mark.skip(c.__name__))
else:
db_engines.append(c.__name__)


@pytest.fixture(params=db_engines)
def db(tmpdir, request):
cwd = os.getcwd()
os.chdir(str(tmpdir))
db = open_db("db", request.param)
os.chdir(cwd)
yield db
# Make sure all the locks and handles are closed
del db
gc.collect()


def test_put_get(db):
db.put(b"x", b"y")
assert db.get(b"x") == b"y"


def test_batch(db):
db.put(b"a", b"1")
with db.write_batch() as b:
b.put(b"a", b"2")
assert db.get(b"a") == b"1"
assert db.get(b"a") == b"2"


def test_iterator(db):
"""
The iterator should contain all key/value pairs starting with prefix ordered
by key.
"""
for i in range(5):
db.put(b"abc" + str.encode(str(i)), str.encode(str(i)))
db.put(b"abc", b"")
db.put(b"a", b"xyz")
db.put(b"abd", b"x")
assert list(db.iterator(prefix=b"abc")) == [(b"abc", b"")] + [
(b"abc" + str.encode(str(i)), str.encode(str(i))) for
i in range(5)
]


def test_iterator_reverse(db):
for i in range(5):
db.put(b"abc" + str.encode(str(i)), str.encode(str(i)))
db.put(b"a", b"xyz")
db.put(b"abd", b"x")
assert list(db.iterator(prefix=b"abc", reverse=True)) == [
(b"abc" + str.encode(str(i)), str.encode(str(i))) for
i in reversed(range(5))
]

0 comments on commit d34e0ed

Please sign in to comment.