1
# Copyright (c) 2001-2008 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
Test cases for dirdbm module.
8
import os, shutil, glob
10
from twisted.trial import unittest
11
from twisted.persisted import dirdbm
15
class DirDbmTestCase(unittest.TestCase):
18
self.path = self.mktemp()
19
self.dbm = dirdbm.open(self.path)
20
self.items = (('abc', 'foo'), ('/lalal', '\000\001'), ('\000\012', 'baz'))
24
k = "//==".decode("base64")
27
self.assertEquals(self.dbm[k], "a")
30
def testRebuildInteraction(self):
31
from twisted.persisted import dirdbm
32
from twisted.python import rebuild
34
s = dirdbm.Shelf('dirdbm.rebuild.test')
36
rebuild.rebuild(dirdbm)
46
for k, v in self.items:
54
for k, v in self.items:
55
assert d.has_key(k), "has_key() failed"
56
assert d[k] == v, "database has wrong value"
58
# check non existent key
64
assert 0, "didn't raise KeyError on non-existent key"
66
# check keys(), values() and items()
67
dbkeys = list(d.keys())
68
dbvalues = list(d.values())
69
dbitems = list(d.items())
73
items = list(self.items)
75
assert keys == dbkeys, ".keys() output didn't match: %s != %s" % (repr(keys), repr(dbkeys))
76
assert values == dbvalues, ".values() output didn't match: %s != %s" % (repr(values), repr(dbvalues))
77
assert items == dbitems, "items() didn't match: %s != %s" % (repr(items), repr(dbitems))
79
copyPath = self.mktemp()
80
d2 = d.copyTo(copyPath)
82
copykeys = list(d.keys())
83
copyvalues = list(d.values())
84
copyitems = list(d.items())
89
assert dbkeys == copykeys, ".copyTo().keys() didn't match: %s != %s" % (repr(dbkeys), repr(copykeys))
90
assert dbvalues == copyvalues, ".copyTo().values() didn't match: %s != %s" % (repr(dbvalues), repr(copyvalues))
91
assert dbitems == copyitems, ".copyTo().items() didn't match: %s != %s" % (repr(dbkeys), repr(copyitems))
94
assert len(d2.keys()) == len(d2.values()) == len(d2.items()) == 0, ".clear() failed"
95
shutil.rmtree(copyPath)
98
for k, v in self.items:
100
assert not d.has_key(k), "has_key() even though we deleted it"
101
assert len(d.keys()) == 0, "database has keys"
102
assert len(d.values()) == 0, "database has values"
103
assert len(d.items()) == 0, "database has items"
106
def testModificationTime(self):
108
# the mtime value for files comes from a different place than the
109
# gettimeofday() system call. On linux, gettimeofday() can be
110
# slightly ahead (due to clock drift which gettimeofday() takes into
111
# account but which open()/write()/close() do not), and if we are
112
# close to the edge of the next second, time.time() can give a value
113
# which is larger than the mtime which results from a subsequent
114
# write(). I consider this a kernel bug, but it is beyond the scope
115
# of this test. Thus we keep the range of acceptability to 3 seconds time.
118
self.assert_(abs(time.time() - self.dbm.getModificationTime("k")) <= 3)
121
def testRecovery(self):
122
"""DirDBM: test recovery from directory after a faked crash"""
123
k = self.dbm._encode("key1")
124
f = open(os.path.join(self.path, k + ".rpl"), "wb")
128
k2 = self.dbm._encode("key2")
129
f = open(os.path.join(self.path, k2), "wb")
132
f = open(os.path.join(self.path, k2 + ".rpl"), "wb")
136
f = open(os.path.join(self.path, "aa.new"), "wb")
140
dbm = dirdbm.DirDBM(self.path)
141
assert dbm["key1"] == "value"
142
assert dbm["key2"] == "correct"
143
assert not glob.glob(os.path.join(self.path, "*.new"))
144
assert not glob.glob(os.path.join(self.path, "*.rpl"))
147
def test_nonStringKeys(self):
149
L{dirdbm.DirDBM} operations only support string keys: other types
150
should raise a C{AssertionError}. This really ought to be a
151
C{TypeError}, but it'll stay like this for backward compatibility.
153
self.assertRaises(AssertionError, self.dbm.__setitem__, 2, "3")
155
self.assertRaises(AssertionError, self.dbm.__setitem__, "2", 3)
156
except unittest.FailTest:
157
# dirdbm.Shelf.__setitem__ supports non-string values
158
self.assertIsInstance(self.dbm, dirdbm.Shelf)
159
self.assertRaises(AssertionError, self.dbm.__getitem__, 2)
160
self.assertRaises(AssertionError, self.dbm.__delitem__, 2)
161
self.assertRaises(AssertionError, self.dbm.has_key, 2)
162
self.assertRaises(AssertionError, self.dbm.__contains__, 2)
163
self.assertRaises(AssertionError, self.dbm.getModificationTime, 2)
167
class ShelfTestCase(DirDbmTestCase):
170
self.path = self.mktemp()
171
self.dbm = dirdbm.Shelf(self.path)
172
self.items = (('abc', 'foo'), ('/lalal', '\000\001'), ('\000\012', 'baz'),
173
('int', 12), ('float', 12.0), ('tuple', (None, 12)))
176
testCases = [DirDbmTestCase, ShelfTestCase]