Add store test, move store to subdir module
This commit is contained in:
parent
bdebeb6010
commit
51c8124a28
5
chainqueue/store/__init__.py
Normal file
5
chainqueue/store/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from .base import (
|
||||||
|
to_key,
|
||||||
|
from_key,
|
||||||
|
Store,
|
||||||
|
)
|
70
chainqueue/store/fs.py
Normal file
70
chainqueue/store/fs.py
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# external imports
|
||||||
|
from leveldir.hex import HexDir
|
||||||
|
|
||||||
|
logg = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class IndexStore(HexDir):
|
||||||
|
|
||||||
|
def __init__(self, root_path, digest_bytes=32):
|
||||||
|
os.path.join(root_path, 'contents')
|
||||||
|
self.store = HexDir(root_path, digest_bytes)
|
||||||
|
|
||||||
|
|
||||||
|
def put(self, k, v):
|
||||||
|
kb = bytes.fromhex(k)
|
||||||
|
vb = v.encode('utf-8')
|
||||||
|
self.store.add(kb, vb)
|
||||||
|
|
||||||
|
|
||||||
|
def get(self, k):
|
||||||
|
fp = self.store.to_filepath(k)
|
||||||
|
f = open(fp, 'rb')
|
||||||
|
v = f.read()
|
||||||
|
f.close()
|
||||||
|
return v.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
class CounterStore:
|
||||||
|
|
||||||
|
def __init__(self, root_path):
|
||||||
|
try:
|
||||||
|
os.stat(root_path)
|
||||||
|
except FileNotFoundError:
|
||||||
|
os.makedirs(root_path)
|
||||||
|
|
||||||
|
fp = os.path.join(root_path, '.counter')
|
||||||
|
f = None
|
||||||
|
try:
|
||||||
|
f = open(fp, 'rb+')
|
||||||
|
except FileNotFoundError:
|
||||||
|
logg.debug('counter not found, creating new in {}'.format(fp))
|
||||||
|
f = open(fp, 'wb+')
|
||||||
|
f.write(b'\x00' * 8)
|
||||||
|
f.close()
|
||||||
|
f = open(fp, 'rb+')
|
||||||
|
|
||||||
|
v = f.read(8)
|
||||||
|
self.count = int.from_bytes(v, byteorder='big')
|
||||||
|
logg.info('counter starts at {}'.format(self.count))
|
||||||
|
|
||||||
|
f.seek(0)
|
||||||
|
|
||||||
|
self.f = f
|
||||||
|
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.f.close()
|
||||||
|
|
||||||
|
|
||||||
|
def next(self):
|
||||||
|
c = self.count
|
||||||
|
self.count += 1
|
||||||
|
v = self.count.to_bytes(8, 'big')
|
||||||
|
self.f.write(v)
|
||||||
|
self.f.seek(0)
|
||||||
|
return c
|
@ -1,6 +1,7 @@
|
|||||||
# standard imports
|
# standard imports
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
|
import shutil
|
||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
from shep.store.file import SimpleFileStoreFactory
|
from shep.store.file import SimpleFileStoreFactory
|
||||||
@ -13,22 +14,10 @@ from chainqueue import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
# test imports
|
# test imports
|
||||||
from tests.common import MockCounter
|
from tests.common import (
|
||||||
|
MockCounter,
|
||||||
|
MockContentStore,
|
||||||
|
)
|
||||||
class MockContentStore:
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.store = {}
|
|
||||||
|
|
||||||
|
|
||||||
def put(self, k, v):
|
|
||||||
self.store[k] = v
|
|
||||||
|
|
||||||
|
|
||||||
def get(self, k):
|
|
||||||
return self.store.get(k)
|
|
||||||
|
|
||||||
|
|
||||||
class TestShepBase(unittest.TestCase):
|
class TestShepBase(unittest.TestCase):
|
||||||
@ -41,3 +30,7 @@ class TestShepBase(unittest.TestCase):
|
|||||||
counter = MockCounter()
|
counter = MockCounter()
|
||||||
chain_spec = ChainSpec('foo', 'bar', 42, 'baz')
|
chain_spec = ChainSpec('foo', 'bar', 42, 'baz')
|
||||||
self.store = Store(chain_spec, self.state, content_store, counter)
|
self.store = Store(chain_spec, self.state, content_store, counter)
|
||||||
|
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
shutil.rmtree(self.path)
|
||||||
|
@ -79,7 +79,6 @@ class MockCacheTokenTx(CacheTokenTx):
|
|||||||
z = h.digest()
|
z = h.digest()
|
||||||
tx_hash = z.hex()
|
tx_hash = z.hex()
|
||||||
|
|
||||||
#tx = CacheTokenTx(normalizer=self.normalizer)
|
|
||||||
self.init(tx_hash, nonce, sender, recipient, value)
|
self.init(tx_hash, nonce, sender, recipient, value)
|
||||||
self.set('src_token', token)
|
self.set('src_token', token)
|
||||||
self.set('dst_token', token)
|
self.set('dst_token', token)
|
||||||
@ -90,4 +89,15 @@ class MockCacheTokenTx(CacheTokenTx):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
class MockContentStore:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.store = {}
|
||||||
|
|
||||||
|
|
||||||
|
def put(self, k, v):
|
||||||
|
self.store[k] = v
|
||||||
|
|
||||||
|
|
||||||
|
def get(self, k):
|
||||||
|
return self.store.get(k)
|
||||||
|
@ -18,6 +18,7 @@ from tests.common import (
|
|||||||
MockCounter,
|
MockCounter,
|
||||||
MockTokenCache,
|
MockTokenCache,
|
||||||
MockCacheTokenTx,
|
MockCacheTokenTx,
|
||||||
|
MockContentStore,
|
||||||
)
|
)
|
||||||
from tests.base_shep import TestShepBase
|
from tests.base_shep import TestShepBase
|
||||||
|
|
||||||
@ -25,20 +26,6 @@ logging.basicConfig(level=logging.DEBUG)
|
|||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
class MockContentStore:
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.store = {}
|
|
||||||
|
|
||||||
|
|
||||||
def put(self, k, v):
|
|
||||||
self.store[k] = v
|
|
||||||
|
|
||||||
|
|
||||||
def get(self, k):
|
|
||||||
return self.store.get(k)
|
|
||||||
|
|
||||||
|
|
||||||
class TestIntegrateBase(TestShepBase):
|
class TestIntegrateBase(TestShepBase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
52
tests/test_store.py
Normal file
52
tests/test_store.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import tempfile
|
||||||
|
import unittest
|
||||||
|
import logging
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
# external imports
|
||||||
|
|
||||||
|
# local imports
|
||||||
|
from chainqueue.store.fs import (
|
||||||
|
IndexStore,
|
||||||
|
CounterStore,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
class TestStoreImplementations(unittest.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.path = tempfile.mkdtemp()
|
||||||
|
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
shutil.rmtree(self.path)
|
||||||
|
|
||||||
|
|
||||||
|
def test_basic_index(self):
|
||||||
|
store = IndexStore(self.path)
|
||||||
|
hx = os.urandom(32).hex()
|
||||||
|
data = 'foo_bar_baz'
|
||||||
|
store.put(hx, data)
|
||||||
|
r = store.get(hx)
|
||||||
|
self.assertEqual(data, r)
|
||||||
|
|
||||||
|
|
||||||
|
def test_basic_counter(self):
|
||||||
|
store = CounterStore(self.path)
|
||||||
|
v = store.next()
|
||||||
|
self.assertEqual(v, 0)
|
||||||
|
v = store.next()
|
||||||
|
self.assertEqual(v, 1)
|
||||||
|
|
||||||
|
store = CounterStore(self.path)
|
||||||
|
v = store.next()
|
||||||
|
self.assertEqual(v, 2)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
Loading…
Reference in New Issue
Block a user