blob: 543afb1fabcc3653c1dd73b8cf0a9add1d5b8e27 [file] [log] [blame]
Skip Montanaro3bf99e32002-12-08 18:36:24 +00001import unittest
2import shelve
3import glob
4from test import test_support
Martin v. Löwis79c32082007-08-11 06:57:14 +00005from UserDict import DictMixin
6
7def L1(s):
8 return s.decode("latin-1")
9
10class byteskeydict(DictMixin):
11 "Mapping that supports bytes keys"
12
13 def __init__(self):
14 self.d = {}
15
16 def __getitem__(self, key):
17 return self.d[L1(key)]
18
19 def __setitem__(self, key, value):
20 self.d[L1(key)] = value
21
22 def __delitem__(self, key):
23 del self.d[L1(key)]
24
25 def iterkeys(self):
26 for k in self.d.keys():
27 yield k.decode("latin-1")
28
29 def keys(self):
30 return list(self.iterkeys())
31
32 def copy(self):
33 return byteskeydict(self.d)
34
Skip Montanaro3bf99e32002-12-08 18:36:24 +000035
36class TestCase(unittest.TestCase):
37
Guido van Rossum94b59bb2007-05-18 22:12:08 +000038 fn = "shelftemp.db"
Tim Peters6578dc92002-12-24 18:31:27 +000039
Guido van Rossum8d9db042007-05-18 21:57:09 +000040 def tearDown(self):
41 for f in glob.glob(self.fn+"*"):
Guido van Rossum94b59bb2007-05-18 22:12:08 +000042 test_support.unlink(f)
Guido van Rossum8d9db042007-05-18 21:57:09 +000043
Skip Montanaro3bf99e32002-12-08 18:36:24 +000044 def test_ascii_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000045 s = shelve.open(self.fn, protocol=0)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000046 try:
Skip Montanaro3bf99e32002-12-08 18:36:24 +000047 s['key1'] = (1,2,3,4)
48 self.assertEqual(s['key1'], (1,2,3,4))
Skip Montanaro3bf99e32002-12-08 18:36:24 +000049 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000050 s.close()
Skip Montanaro3bf99e32002-12-08 18:36:24 +000051
52 def test_binary_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000053 s = shelve.open(self.fn, protocol=1)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000054 try:
Skip Montanaro3bf99e32002-12-08 18:36:24 +000055 s['key1'] = (1,2,3,4)
56 self.assertEqual(s['key1'], (1,2,3,4))
Skip Montanaro3bf99e32002-12-08 18:36:24 +000057 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000058 s.close()
Skip Montanaro3bf99e32002-12-08 18:36:24 +000059
Martin v. Löwis153c9e42003-04-19 20:59:03 +000060 def test_proto2_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000061 s = shelve.open(self.fn, protocol=2)
Martin v. Löwis153c9e42003-04-19 20:59:03 +000062 try:
Martin v. Löwis153c9e42003-04-19 20:59:03 +000063 s['key1'] = (1,2,3,4)
64 self.assertEqual(s['key1'], (1,2,3,4))
Martin v. Löwis153c9e42003-04-19 20:59:03 +000065 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000066 s.close()
Martin v. Löwis153c9e42003-04-19 20:59:03 +000067
Skip Montanaro3bf99e32002-12-08 18:36:24 +000068 def test_in_memory_shelf(self):
Martin v. Löwis79c32082007-08-11 06:57:14 +000069 d1 = byteskeydict()
Raymond Hettinger1bc82f82004-12-05 03:58:17 +000070 s = shelve.Shelf(d1, protocol=0)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000071 s['key1'] = (1,2,3,4)
72 self.assertEqual(s['key1'], (1,2,3,4))
73 s.close()
Martin v. Löwis79c32082007-08-11 06:57:14 +000074 d2 = byteskeydict()
Raymond Hettinger1bc82f82004-12-05 03:58:17 +000075 s = shelve.Shelf(d2, protocol=1)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000076 s['key1'] = (1,2,3,4)
77 self.assertEqual(s['key1'], (1,2,3,4))
78 s.close()
79
80 self.assertEqual(len(d1), 1)
81 self.assertNotEqual(d1, d2)
82
Martin v. Löwis153c9e42003-04-19 20:59:03 +000083 def test_mutable_entry(self):
Martin v. Löwis79c32082007-08-11 06:57:14 +000084 d1 = byteskeydict()
Martin v. Löwis153c9e42003-04-19 20:59:03 +000085 s = shelve.Shelf(d1, protocol=2, writeback=False)
86 s['key1'] = [1,2,3,4]
87 self.assertEqual(s['key1'], [1,2,3,4])
88 s['key1'].append(5)
89 self.assertEqual(s['key1'], [1,2,3,4])
90 s.close()
91
Martin v. Löwis79c32082007-08-11 06:57:14 +000092 d2 = byteskeydict()
Martin v. Löwis153c9e42003-04-19 20:59:03 +000093 s = shelve.Shelf(d2, protocol=2, writeback=True)
94 s['key1'] = [1,2,3,4]
95 self.assertEqual(s['key1'], [1,2,3,4])
96 s['key1'].append(5)
97 self.assertEqual(s['key1'], [1,2,3,4,5])
98 s.close()
99
100 self.assertEqual(len(d1), 1)
101 self.assertEqual(len(d2), 1)
102
103
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000104from test import mapping_tests
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000105
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000106class TestShelveBase(mapping_tests.BasicTestMappingProtocol):
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000107 fn = "shelftemp.db"
108 counter = 0
109 def __init__(self, *args, **kw):
110 self._db = []
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000111 mapping_tests.BasicTestMappingProtocol.__init__(self, *args, **kw)
Walter Dörwald118f9312004-06-02 18:42:25 +0000112 type2test = shelve.Shelf
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000113 def _reference(self):
114 return {"key1":"value1", "key2":2, "key3":(1,2,3)}
115 def _empty_mapping(self):
116 if self._in_mem:
Martin v. Löwis79c32082007-08-11 06:57:14 +0000117 x= shelve.Shelf(byteskeydict(), **self._args)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000118 else:
119 self.counter+=1
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000120 x= shelve.open(self.fn+str(self.counter), **self._args)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000121 self._db.append(x)
122 return x
123 def tearDown(self):
124 for db in self._db:
125 db.close()
126 self._db = []
127 if not self._in_mem:
128 for f in glob.glob(self.fn+"*"):
Guido van Rossum94b59bb2007-05-18 22:12:08 +0000129 test_support.unlink(f)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000130
131class TestAsciiFileShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000132 _args={'protocol':0}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000133 _in_mem = False
134class TestBinaryFileShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000135 _args={'protocol':1}
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000136 _in_mem = False
137class TestProto2FileShelve(TestShelveBase):
138 _args={'protocol':2}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000139 _in_mem = False
140class TestAsciiMemShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000141 _args={'protocol':0}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000142 _in_mem = True
143class TestBinaryMemShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000144 _args={'protocol':1}
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000145 _in_mem = True
146class TestProto2MemShelve(TestShelveBase):
147 _args={'protocol':2}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000148 _in_mem = True
149
150def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000151 test_support.run_unittest(
152 TestAsciiFileShelve,
153 TestBinaryFileShelve,
154 TestProto2FileShelve,
155 TestAsciiMemShelve,
156 TestBinaryMemShelve,
157 TestProto2MemShelve,
158 TestCase
159 )
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000160
161if __name__ == "__main__":
162 test_main()