blob: b2ed87d5875edef27f1464e273eda7c77d0b436b [file] [log] [blame]
Skip Montanaro3bf99e32002-12-08 18:36:24 +00001import unittest
2import shelve
3import glob
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Raymond Hettingeredf3b732008-02-04 22:07:15 +00005from collections import MutableMapping
Georg Brandl24420152008-05-26 16:32:26 +00006from test.test_dbm import dbm_iterator
Martin v. Löwis79c32082007-08-11 06:57:14 +00007
8def L1(s):
9 return s.decode("latin-1")
10
Raymond Hettingeredf3b732008-02-04 22:07:15 +000011class byteskeydict(MutableMapping):
Martin v. Löwis79c32082007-08-11 06:57:14 +000012 "Mapping that supports bytes keys"
13
14 def __init__(self):
15 self.d = {}
16
17 def __getitem__(self, key):
18 return self.d[L1(key)]
19
20 def __setitem__(self, key, value):
21 self.d[L1(key)] = value
22
23 def __delitem__(self, key):
24 del self.d[L1(key)]
25
Raymond Hettingeredf3b732008-02-04 22:07:15 +000026 def __len__(self):
27 return len(self.d)
28
Martin v. Löwis79c32082007-08-11 06:57:14 +000029 def iterkeys(self):
30 for k in self.d.keys():
Guido van Rossum83800a62007-08-29 02:57:31 +000031 yield k.encode("latin-1")
Martin v. Löwis79c32082007-08-11 06:57:14 +000032
Raymond Hettingeredf3b732008-02-04 22:07:15 +000033 __iter__ = iterkeys
34
Martin v. Löwis79c32082007-08-11 06:57:14 +000035 def keys(self):
36 return list(self.iterkeys())
37
38 def copy(self):
39 return byteskeydict(self.d)
40
Skip Montanaro3bf99e32002-12-08 18:36:24 +000041
42class TestCase(unittest.TestCase):
43
Guido van Rossum94b59bb2007-05-18 22:12:08 +000044 fn = "shelftemp.db"
Tim Peters6578dc92002-12-24 18:31:27 +000045
Guido van Rossum8d9db042007-05-18 21:57:09 +000046 def tearDown(self):
47 for f in glob.glob(self.fn+"*"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000048 support.unlink(f)
Guido van Rossum8d9db042007-05-18 21:57:09 +000049
Skip Montanaro3bf99e32002-12-08 18:36:24 +000050 def test_ascii_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000051 s = shelve.open(self.fn, protocol=0)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000052 try:
Skip Montanaro3bf99e32002-12-08 18:36:24 +000053 s['key1'] = (1,2,3,4)
54 self.assertEqual(s['key1'], (1,2,3,4))
Skip Montanaro3bf99e32002-12-08 18:36:24 +000055 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000056 s.close()
Skip Montanaro3bf99e32002-12-08 18:36:24 +000057
58 def test_binary_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000059 s = shelve.open(self.fn, protocol=1)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000060 try:
Skip Montanaro3bf99e32002-12-08 18:36:24 +000061 s['key1'] = (1,2,3,4)
62 self.assertEqual(s['key1'], (1,2,3,4))
Skip Montanaro3bf99e32002-12-08 18:36:24 +000063 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000064 s.close()
Skip Montanaro3bf99e32002-12-08 18:36:24 +000065
Martin v. Löwis153c9e42003-04-19 20:59:03 +000066 def test_proto2_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000067 s = shelve.open(self.fn, protocol=2)
Martin v. Löwis153c9e42003-04-19 20:59:03 +000068 try:
Martin v. Löwis153c9e42003-04-19 20:59:03 +000069 s['key1'] = (1,2,3,4)
70 self.assertEqual(s['key1'], (1,2,3,4))
Martin v. Löwis153c9e42003-04-19 20:59:03 +000071 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000072 s.close()
Martin v. Löwis153c9e42003-04-19 20:59:03 +000073
Skip Montanaro3bf99e32002-12-08 18:36:24 +000074 def test_in_memory_shelf(self):
Martin v. Löwis79c32082007-08-11 06:57:14 +000075 d1 = byteskeydict()
Raymond Hettinger1bc82f82004-12-05 03:58:17 +000076 s = shelve.Shelf(d1, protocol=0)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000077 s['key1'] = (1,2,3,4)
78 self.assertEqual(s['key1'], (1,2,3,4))
79 s.close()
Martin v. Löwis79c32082007-08-11 06:57:14 +000080 d2 = byteskeydict()
Raymond Hettinger1bc82f82004-12-05 03:58:17 +000081 s = shelve.Shelf(d2, protocol=1)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000082 s['key1'] = (1,2,3,4)
83 self.assertEqual(s['key1'], (1,2,3,4))
84 s.close()
85
86 self.assertEqual(len(d1), 1)
Guido van Rossum83800a62007-08-29 02:57:31 +000087 self.assertEqual(len(d2), 1)
88 self.assertNotEqual(d1.items(), d2.items())
Skip Montanaro3bf99e32002-12-08 18:36:24 +000089
Martin v. Löwis153c9e42003-04-19 20:59:03 +000090 def test_mutable_entry(self):
Martin v. Löwis79c32082007-08-11 06:57:14 +000091 d1 = byteskeydict()
Martin v. Löwis153c9e42003-04-19 20:59:03 +000092 s = shelve.Shelf(d1, protocol=2, writeback=False)
93 s['key1'] = [1,2,3,4]
94 self.assertEqual(s['key1'], [1,2,3,4])
95 s['key1'].append(5)
96 self.assertEqual(s['key1'], [1,2,3,4])
97 s.close()
98
Martin v. Löwis79c32082007-08-11 06:57:14 +000099 d2 = byteskeydict()
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000100 s = shelve.Shelf(d2, protocol=2, writeback=True)
101 s['key1'] = [1,2,3,4]
102 self.assertEqual(s['key1'], [1,2,3,4])
103 s['key1'].append(5)
104 self.assertEqual(s['key1'], [1,2,3,4,5])
105 s.close()
106
107 self.assertEqual(len(d1), 1)
108 self.assertEqual(len(d2), 1)
109
110
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000111from test import mapping_tests
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000112
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000113class TestShelveBase(mapping_tests.BasicTestMappingProtocol):
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000114 fn = "shelftemp.db"
115 counter = 0
116 def __init__(self, *args, **kw):
117 self._db = []
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000118 mapping_tests.BasicTestMappingProtocol.__init__(self, *args, **kw)
Walter Dörwald118f9312004-06-02 18:42:25 +0000119 type2test = shelve.Shelf
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000120 def _reference(self):
121 return {"key1":"value1", "key2":2, "key3":(1,2,3)}
122 def _empty_mapping(self):
123 if self._in_mem:
Martin v. Löwis79c32082007-08-11 06:57:14 +0000124 x= shelve.Shelf(byteskeydict(), **self._args)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000125 else:
126 self.counter+=1
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000127 x= shelve.open(self.fn+str(self.counter), **self._args)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000128 self._db.append(x)
129 return x
130 def tearDown(self):
131 for db in self._db:
132 db.close()
133 self._db = []
134 if not self._in_mem:
135 for f in glob.glob(self.fn+"*"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000136 support.unlink(f)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000137
138class TestAsciiFileShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000139 _args={'protocol':0}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000140 _in_mem = False
141class TestBinaryFileShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000142 _args={'protocol':1}
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000143 _in_mem = False
144class TestProto2FileShelve(TestShelveBase):
145 _args={'protocol':2}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000146 _in_mem = False
147class TestAsciiMemShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000148 _args={'protocol':0}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000149 _in_mem = True
150class TestBinaryMemShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000151 _args={'protocol':1}
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000152 _in_mem = True
153class TestProto2MemShelve(TestShelveBase):
154 _args={'protocol':2}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000155 _in_mem = True
156
157def test_main():
Gregory P. Smith178fefb2007-08-24 21:59:45 +0000158 for module in dbm_iterator():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000159 support.run_unittest(
Gregory P. Smith178fefb2007-08-24 21:59:45 +0000160 TestAsciiFileShelve,
161 TestBinaryFileShelve,
162 TestProto2FileShelve,
163 TestAsciiMemShelve,
164 TestBinaryMemShelve,
165 TestProto2MemShelve,
166 TestCase
167 )
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000168
169if __name__ == "__main__":
170 test_main()