143 lines
5.1 KiB
Python
143 lines
5.1 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# This library is free software, distributed under the terms of
|
|
# the GNU Lesser General Public License Version 3, or any later version.
|
|
# See the COPYING file included in this archive
|
|
|
|
import unittest
|
|
import time
|
|
|
|
import lbrynet.dht.datastore
|
|
import lbrynet.dht.constants
|
|
|
|
import hashlib
|
|
|
|
class DictDataStoreTest(unittest.TestCase):
|
|
""" Basic tests case for the reference DataStore API and implementation """
|
|
def setUp(self):
|
|
self.ds = lbrynet.dht.datastore.DictDataStore()
|
|
h = hashlib.sha1()
|
|
h.update('g')
|
|
hashKey = h.digest()
|
|
h2 = hashlib.sha1()
|
|
h2.update('dried')
|
|
hashKey2 = h2.digest()
|
|
h3 = hashlib.sha1()
|
|
h3.update('Boozoo Bajou - 09 - S.I.P.mp3')
|
|
hashKey3 = h3.digest()
|
|
#self.cases = (('a', 'hello there\nthis is a test'),
|
|
# (hashKey3, '1 2 3 4 5 6 7 8 9 0'))
|
|
self.cases = ((hashKey, 'test1test1test1test1test1t'),
|
|
(hashKey, 'test2'),
|
|
(hashKey, 'test3test3test3test3test3test3test3test3'),
|
|
(hashKey2, 'test4'),
|
|
(hashKey3, 'test5'),
|
|
(hashKey3, 'test6'))
|
|
|
|
def testReadWrite(self):
|
|
# Test write ability
|
|
for key, value in self.cases:
|
|
try:
|
|
now = int(time.time())
|
|
self.ds.addPeerToBlob(key, value, now, now, 'node1')
|
|
except Exception:
|
|
import traceback
|
|
self.fail('Failed writing the following data: key: "%s" '
|
|
'data: "%s"\n The error was: %s:' %
|
|
(key, value, traceback.format_exc(5)))
|
|
|
|
# Verify writing (test query ability)
|
|
for key, value in self.cases:
|
|
try:
|
|
self.failUnless(self.ds.hasPeersForBlob(key),
|
|
'Key "%s" not found in DataStore! DataStore key dump: %s' %
|
|
(key, self.ds.keys()))
|
|
except Exception:
|
|
import traceback
|
|
self.fail(
|
|
'Failed verifying that the following key exists: "%s"\n The error was: %s:' %
|
|
(key, traceback.format_exc(5)))
|
|
|
|
# Read back the data
|
|
for key, value in self.cases:
|
|
self.failUnless(value in self.ds.getPeersForBlob(key),
|
|
'DataStore returned invalid data! Expected "%s", got "%s"' %
|
|
(value, self.ds.getPeersForBlob(key)))
|
|
|
|
def testNonExistentKeys(self):
|
|
for key, value in self.cases:
|
|
self.failIf(key in self.ds.keys(), 'DataStore reports it has non-existent key: "%s"' %
|
|
key)
|
|
|
|
def testExpires(self):
|
|
now = int(time.time())
|
|
|
|
h1 = hashlib.sha1()
|
|
h1.update('test1')
|
|
key1 = h1.digest()
|
|
h2 = hashlib.sha1()
|
|
h2.update('test2')
|
|
key2 = h2.digest()
|
|
td = lbrynet.dht.constants.dataExpireTimeout - 100
|
|
td2 = td + td
|
|
self.ds.addPeerToBlob(h1, 'val1', now - td, now - td, '1')
|
|
self.ds.addPeerToBlob(h1, 'val2', now - td2, now - td2, '2')
|
|
self.ds.addPeerToBlob(h2, 'val3', now - td2, now - td2, '3')
|
|
self.ds.addPeerToBlob(h2, 'val4', now, now, '4')
|
|
self.ds.removeExpiredPeers()
|
|
self.failUnless(
|
|
'val1' in self.ds.getPeersForBlob(h1),
|
|
'DataStore deleted an unexpired value! Value %s, publish time %s, current time %s' %
|
|
('val1', str(now - td), str(now)))
|
|
self.failIf(
|
|
'val2' in self.ds.getPeersForBlob(h1),
|
|
'DataStore failed to delete an expired value! '
|
|
'Value %s, publish time %s, current time %s' %
|
|
('val2', str(now - td2), str(now)))
|
|
self.failIf(
|
|
'val3' in self.ds.getPeersForBlob(h2),
|
|
'DataStore failed to delete an expired value! '
|
|
'Value %s, publish time %s, current time %s' %
|
|
('val3', str(now - td2), str(now)))
|
|
self.failUnless(
|
|
'val4' in self.ds.getPeersForBlob(h2),
|
|
'DataStore deleted an unexpired value! Value %s, publish time %s, current time %s' %
|
|
('val4', str(now), str(now)))
|
|
|
|
# # First write with fake values
|
|
# for key, value in self.cases:
|
|
# except Exception:
|
|
#
|
|
# # write this stuff a second time, with the real values
|
|
# for key, value in self.cases:
|
|
# except Exception:
|
|
#
|
|
# # Read back the data
|
|
# for key, value in self.cases:
|
|
|
|
# # First some values
|
|
# for key, value in self.cases:
|
|
# except Exception:
|
|
#
|
|
#
|
|
# # Delete an item from the data
|
|
|
|
# # First some values with metadata
|
|
# for key, value in self.cases:
|
|
# except Exception:
|
|
#
|
|
# # Read back the meta-data
|
|
# for key, value in self.cases:
|
|
|
|
|
|
|
|
|
|
def suite():
|
|
suite = unittest.TestSuite()
|
|
suite.addTest(unittest.makeSuite(DictDataStoreTest))
|
|
return suite
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# If this module is executed from the commandline, run all its tests
|
|
unittest.TextTestRunner().run(suite())
|