blob: cfdd67c26c5f51fcc35659d83c5bef847f17c4d6 [file] [log] [blame]
Skip Montanaro3bf99e32002-12-08 18:36:24 +00001import unittest
2import shelve
3import glob
Zackery Spytzdf592732020-10-29 03:44:35 -06004import pickle
5
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Hai Shia089d212020-07-06 17:15:08 +08007from test.support import os_helper
Raymond Hettinger57d1a882011-02-23 00:46:28 +00008from collections.abc import MutableMapping
Georg Brandl24420152008-05-26 16:32:26 +00009from test.test_dbm import dbm_iterator
Martin v. Löwis79c32082007-08-11 06:57:14 +000010
11def L1(s):
12 return s.decode("latin-1")
13
Raymond Hettingeredf3b732008-02-04 22:07:15 +000014class byteskeydict(MutableMapping):
Martin v. Löwis79c32082007-08-11 06:57:14 +000015 "Mapping that supports bytes keys"
16
17 def __init__(self):
18 self.d = {}
19
20 def __getitem__(self, key):
21 return self.d[L1(key)]
22
23 def __setitem__(self, key, value):
24 self.d[L1(key)] = value
25
26 def __delitem__(self, key):
27 del self.d[L1(key)]
28
Raymond Hettingeredf3b732008-02-04 22:07:15 +000029 def __len__(self):
30 return len(self.d)
31
Martin v. Löwis79c32082007-08-11 06:57:14 +000032 def iterkeys(self):
33 for k in self.d.keys():
Guido van Rossum83800a62007-08-29 02:57:31 +000034 yield k.encode("latin-1")
Martin v. Löwis79c32082007-08-11 06:57:14 +000035
Raymond Hettingeredf3b732008-02-04 22:07:15 +000036 __iter__ = iterkeys
37
Martin v. Löwis79c32082007-08-11 06:57:14 +000038 def keys(self):
39 return list(self.iterkeys())
40
41 def copy(self):
42 return byteskeydict(self.d)
43
Skip Montanaro3bf99e32002-12-08 18:36:24 +000044
45class TestCase(unittest.TestCase):
46
Guido van Rossum94b59bb2007-05-18 22:12:08 +000047 fn = "shelftemp.db"
Tim Peters6578dc92002-12-24 18:31:27 +000048
Guido van Rossum8d9db042007-05-18 21:57:09 +000049 def tearDown(self):
50 for f in glob.glob(self.fn+"*"):
Hai Shia089d212020-07-06 17:15:08 +080051 os_helper.unlink(f)
Guido van Rossum8d9db042007-05-18 21:57:09 +000052
Benjamin Petersond6313712008-07-31 16:23:04 +000053 def test_close(self):
54 d1 = {}
55 s = shelve.Shelf(d1, protocol=2, writeback=False)
56 s['key1'] = [1,2,3,4]
57 self.assertEqual(s['key1'], [1,2,3,4])
58 self.assertEqual(len(s), 1)
59 s.close()
60 self.assertRaises(ValueError, len, s)
61 try:
62 s['key1']
63 except ValueError:
64 pass
65 else:
66 self.fail('Closed shelf should not find a key')
67
Skip Montanaro3bf99e32002-12-08 18:36:24 +000068 def test_ascii_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000069 s = shelve.open(self.fn, protocol=0)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000070 try:
Skip Montanaro3bf99e32002-12-08 18:36:24 +000071 s['key1'] = (1,2,3,4)
72 self.assertEqual(s['key1'], (1,2,3,4))
Skip Montanaro3bf99e32002-12-08 18:36:24 +000073 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000074 s.close()
Skip Montanaro3bf99e32002-12-08 18:36:24 +000075
76 def test_binary_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000077 s = shelve.open(self.fn, protocol=1)
Skip Montanaro3bf99e32002-12-08 18:36:24 +000078 try:
Skip Montanaro3bf99e32002-12-08 18:36:24 +000079 s['key1'] = (1,2,3,4)
80 self.assertEqual(s['key1'], (1,2,3,4))
Skip Montanaro3bf99e32002-12-08 18:36:24 +000081 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000082 s.close()
Skip Montanaro3bf99e32002-12-08 18:36:24 +000083
Martin v. Löwis153c9e42003-04-19 20:59:03 +000084 def test_proto2_file_shelf(self):
Guido van Rossum8d9db042007-05-18 21:57:09 +000085 s = shelve.open(self.fn, protocol=2)
Martin v. Löwis153c9e42003-04-19 20:59:03 +000086 try:
Martin v. Löwis153c9e42003-04-19 20:59:03 +000087 s['key1'] = (1,2,3,4)
88 self.assertEqual(s['key1'], (1,2,3,4))
Martin v. Löwis153c9e42003-04-19 20:59:03 +000089 finally:
Guido van Rossum8d9db042007-05-18 21:57:09 +000090 s.close()
Martin v. Löwis153c9e42003-04-19 20:59:03 +000091
Skip Montanaro3bf99e32002-12-08 18:36:24 +000092 def test_in_memory_shelf(self):
Martin v. Löwis79c32082007-08-11 06:57:14 +000093 d1 = byteskeydict()
Serhiy Storchaka5b10b982019-03-05 10:06:26 +020094 with shelve.Shelf(d1, protocol=0) as s:
95 s['key1'] = (1,2,3,4)
96 self.assertEqual(s['key1'], (1,2,3,4))
Martin v. Löwis79c32082007-08-11 06:57:14 +000097 d2 = byteskeydict()
Serhiy Storchaka5b10b982019-03-05 10:06:26 +020098 with shelve.Shelf(d2, protocol=1) as s:
99 s['key1'] = (1,2,3,4)
100 self.assertEqual(s['key1'], (1,2,3,4))
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000101
102 self.assertEqual(len(d1), 1)
Guido van Rossum83800a62007-08-29 02:57:31 +0000103 self.assertEqual(len(d2), 1)
104 self.assertNotEqual(d1.items(), d2.items())
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000105
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000106 def test_mutable_entry(self):
Martin v. Löwis79c32082007-08-11 06:57:14 +0000107 d1 = byteskeydict()
Serhiy Storchaka5b10b982019-03-05 10:06:26 +0200108 with shelve.Shelf(d1, protocol=2, writeback=False) as s:
109 s['key1'] = [1,2,3,4]
110 self.assertEqual(s['key1'], [1,2,3,4])
111 s['key1'].append(5)
112 self.assertEqual(s['key1'], [1,2,3,4])
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000113
Martin v. Löwis79c32082007-08-11 06:57:14 +0000114 d2 = byteskeydict()
Serhiy Storchaka5b10b982019-03-05 10:06:26 +0200115 with shelve.Shelf(d2, protocol=2, writeback=True) as s:
116 s['key1'] = [1,2,3,4]
117 self.assertEqual(s['key1'], [1,2,3,4])
118 s['key1'].append(5)
119 self.assertEqual(s['key1'], [1,2,3,4,5])
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000120
121 self.assertEqual(len(d1), 1)
122 self.assertEqual(len(d2), 1)
123
Georg Brandl732324a2010-12-04 11:12:43 +0000124 def test_keyencoding(self):
125 d = {}
126 key = 'Pöp'
127 # the default keyencoding is utf-8
128 shelve.Shelf(d)[key] = [1]
129 self.assertIn(key.encode('utf-8'), d)
130 # but a different one can be given
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000131 shelve.Shelf(d, keyencoding='latin-1')[key] = [1]
132 self.assertIn(key.encode('latin-1'), d)
Georg Brandl732324a2010-12-04 11:12:43 +0000133 # with all consequences
134 s = shelve.Shelf(d, keyencoding='ascii')
135 self.assertRaises(UnicodeEncodeError, s.__setitem__, key, [1])
136
R. David Murrayddb3ed02010-02-11 02:42:19 +0000137 def test_writeback_also_writes_immediately(self):
138 # Issue 5754
139 d = {}
140 key = 'key'
141 encodedkey = key.encode('utf-8')
Serhiy Storchaka5b10b982019-03-05 10:06:26 +0200142 with shelve.Shelf(d, writeback=True) as s:
143 s[key] = [1]
144 p1 = d[encodedkey] # Will give a KeyError if backing store not updated
145 s['key'].append(2)
R. David Murrayddb3ed02010-02-11 02:42:19 +0000146 p2 = d[encodedkey]
147 self.assertNotEqual(p1, p2) # Write creates new object in store
148
Andrew Svetlovef08fb12012-10-06 13:52:19 +0300149 def test_with(self):
150 d1 = {}
151 with shelve.Shelf(d1, protocol=2, writeback=False) as s:
152 s['key1'] = [1,2,3,4]
153 self.assertEqual(s['key1'], [1,2,3,4])
154 self.assertEqual(len(s), 1)
155 self.assertRaises(ValueError, len, s)
156 try:
157 s['key1']
158 except ValueError:
159 pass
160 else:
161 self.fail('Closed shelf should not find a key')
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000162
Berker Peksag8faca612016-07-01 12:33:00 +0300163 def test_default_protocol(self):
164 with shelve.Shelf({}) as s:
Zackery Spytzdf592732020-10-29 03:44:35 -0600165 self.assertEqual(s._protocol, pickle.DEFAULT_PROTOCOL)
Berker Peksag8faca612016-07-01 12:33:00 +0300166
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000167from test import mapping_tests
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000168
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000169class TestShelveBase(mapping_tests.BasicTestMappingProtocol):
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000170 fn = "shelftemp.db"
171 counter = 0
172 def __init__(self, *args, **kw):
173 self._db = []
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000174 mapping_tests.BasicTestMappingProtocol.__init__(self, *args, **kw)
Walter Dörwald118f9312004-06-02 18:42:25 +0000175 type2test = shelve.Shelf
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000176 def _reference(self):
177 return {"key1":"value1", "key2":2, "key3":(1,2,3)}
178 def _empty_mapping(self):
179 if self._in_mem:
Martin v. Löwis79c32082007-08-11 06:57:14 +0000180 x= shelve.Shelf(byteskeydict(), **self._args)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000181 else:
182 self.counter+=1
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000183 x= shelve.open(self.fn+str(self.counter), **self._args)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000184 self._db.append(x)
185 return x
186 def tearDown(self):
187 for db in self._db:
188 db.close()
189 self._db = []
190 if not self._in_mem:
191 for f in glob.glob(self.fn+"*"):
Hai Shia089d212020-07-06 17:15:08 +0800192 os_helper.unlink(f)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000193
194class TestAsciiFileShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000195 _args={'protocol':0}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000196 _in_mem = False
197class TestBinaryFileShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000198 _args={'protocol':1}
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000199 _in_mem = False
200class TestProto2FileShelve(TestShelveBase):
201 _args={'protocol':2}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000202 _in_mem = False
203class TestAsciiMemShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000204 _args={'protocol':0}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000205 _in_mem = True
206class TestBinaryMemShelve(TestShelveBase):
Raymond Hettinger1bc82f82004-12-05 03:58:17 +0000207 _args={'protocol':1}
Martin v. Löwis153c9e42003-04-19 20:59:03 +0000208 _in_mem = True
209class TestProto2MemShelve(TestShelveBase):
210 _args={'protocol':2}
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000211 _in_mem = True
212
213def test_main():
Gregory P. Smith178fefb2007-08-24 21:59:45 +0000214 for module in dbm_iterator():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000215 support.run_unittest(
Gregory P. Smith178fefb2007-08-24 21:59:45 +0000216 TestAsciiFileShelve,
217 TestBinaryFileShelve,
218 TestProto2FileShelve,
219 TestAsciiMemShelve,
220 TestBinaryMemShelve,
221 TestProto2MemShelve,
222 TestCase
223 )
Skip Montanaro3bf99e32002-12-08 18:36:24 +0000224
225if __name__ == "__main__":
226 test_main()