14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport shelve
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport glob
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import test_support
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotest_support.import_module('anydbm', deprecated=True)
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestCase(unittest.TestCase):
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    fn = "shelftemp" + os.extsep + "db"
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_close(self):
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d1 = {}
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = shelve.Shelf(d1, protocol=2, writeback=False)
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key1'] = [1,2,3,4]
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s['key1'], [1,2,3,4])
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(s), 1)
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.close()
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, len, s)
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s['key1']
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail('Closed shelf should not find a key')
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_ascii_file_shelf(self):
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = shelve.open(self.fn, protocol=0)
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s['key1'] = (1,2,3,4)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(s['key1'], (1,2,3,4))
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s.close()
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for f in glob.glob(self.fn+"*"):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                os.unlink(f)
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_binary_file_shelf(self):
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = shelve.open(self.fn, protocol=1)
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s['key1'] = (1,2,3,4)
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(s['key1'], (1,2,3,4))
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s.close()
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for f in glob.glob(self.fn+"*"):
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                os.unlink(f)
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_proto2_file_shelf(self):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = shelve.open(self.fn, protocol=2)
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s['key1'] = (1,2,3,4)
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(s['key1'], (1,2,3,4))
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s.close()
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for f in glob.glob(self.fn+"*"):
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                os.unlink(f)
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_in_memory_shelf(self):
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d1 = {}
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = shelve.Shelf(d1, protocol=0)
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key1'] = (1,2,3,4)
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s['key1'], (1,2,3,4))
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.close()
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d2 = {}
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = shelve.Shelf(d2, protocol=1)
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key1'] = (1,2,3,4)
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s['key1'], (1,2,3,4))
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.close()
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d1), 1)
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(d1, d2)
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_mutable_entry(self):
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d1 = {}
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = shelve.Shelf(d1, protocol=2, writeback=False)
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key1'] = [1,2,3,4]
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s['key1'], [1,2,3,4])
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key1'].append(5)
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s['key1'], [1,2,3,4])
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.close()
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d2 = {}
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = shelve.Shelf(d2, protocol=2, writeback=True)
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key1'] = [1,2,3,4]
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s['key1'], [1,2,3,4])
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key1'].append(5)
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s['key1'], [1,2,3,4,5])
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.close()
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d1), 1)
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d2), 1)
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_writeback_also_writes_immediately(self):
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Issue 5754
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = {}
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = shelve.Shelf(d, writeback=True)
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key'] = [1]
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p1 = d['key']  # Will give a KeyError if backing store not updated
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s['key'].append(2)
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.close()
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p2 = d['key']
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(p1, p2)  # Write creates new object in store
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import mapping_tests
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestShelveBase(mapping_tests.BasicTestMappingProtocol):
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    fn = "shelftemp.db"
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    counter = 0
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, *args, **kw):
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._db = []
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mapping_tests.BasicTestMappingProtocol.__init__(self, *args, **kw)
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    type2test = shelve.Shelf
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _reference(self):
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return {"key1":"value1", "key2":2, "key3":(1,2,3)}
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _empty_mapping(self):
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._in_mem:
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x= shelve.Shelf({}, **self._args)
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.counter+=1
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x= shelve.open(self.fn+str(self.counter), **self._args)
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._db.append(x)
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return x
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tearDown(self):
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for db in self._db:
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            db.close()
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._db = []
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self._in_mem:
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for f in glob.glob(self.fn+"*"):
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                test_support.unlink(f)
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestAsciiFileShelve(TestShelveBase):
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _args={'protocol':0}
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _in_mem = False
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestBinaryFileShelve(TestShelveBase):
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _args={'protocol':1}
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _in_mem = False
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestProto2FileShelve(TestShelveBase):
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _args={'protocol':2}
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _in_mem = False
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestAsciiMemShelve(TestShelveBase):
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _args={'protocol':0}
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _in_mem = True
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestBinaryMemShelve(TestShelveBase):
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _args={'protocol':1}
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _in_mem = True
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestProto2MemShelve(TestShelveBase):
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _args={'protocol':2}
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _in_mem = True
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_support.run_unittest(
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestAsciiFileShelve,
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestBinaryFileShelve,
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestProto2FileShelve,
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestAsciiMemShelve,
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestBinaryMemShelve,
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestProto2MemShelve,
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestCase
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    )
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
164