blob: 7ac75c5fea1b5e761a42a5a0073a33f80fa83f33 [file] [log] [blame]
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001from test import support
Kristján Valur Jónsson42a40c52009-04-01 11:28:47 +00002support.import_module("dbm.ndbm") #skip if not supported
Serhiy Storchaka6f600ff2018-02-26 16:02:22 +02003import os
Christian Heimesb186d002008-03-18 15:15:01 +00004import unittest
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00005import dbm.ndbm
6from dbm.ndbm import error
Roger E. Massefab8ab81996-12-20 22:36:52 +00007
Christian Heimesb186d002008-03-18 15:15:01 +00008class DbmTestCase(unittest.TestCase):
Roger E. Masse16f9fd21996-12-10 00:06:24 +00009
Christian Heimesb186d002008-03-18 15:15:01 +000010 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000011 self.filename = support.TESTFN
Georg Brandl0a7ac7d2008-05-26 10:29:35 +000012 self.d = dbm.ndbm.open(self.filename, 'c')
Christian Heimesb186d002008-03-18 15:15:01 +000013 self.d.close()
Fred Drake57a4e902000-09-18 17:56:58 +000014
Christian Heimesb186d002008-03-18 15:15:01 +000015 def tearDown(self):
16 for suffix in ['', '.pag', '.dir', '.db']:
Benjamin Petersonee8712c2008-05-20 21:35:26 +000017 support.unlink(self.filename + suffix)
Roger E. Masse16f9fd21996-12-10 00:06:24 +000018
Christian Heimesb186d002008-03-18 15:15:01 +000019 def test_keys(self):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +000020 self.d = dbm.ndbm.open(self.filename, 'c')
Serhiy Storchaka2e38cc32018-04-29 12:38:06 +030021 self.assertEqual(self.d.keys(), [])
Christian Heimesb186d002008-03-18 15:15:01 +000022 self.d['a'] = 'b'
Brett Cannon7317c1e2008-11-25 19:19:17 +000023 self.d[b'bytes'] = b'data'
Christian Heimesb186d002008-03-18 15:15:01 +000024 self.d['12345678910'] = '019237410982340912840198242'
25 self.d.keys()
Serhiy Storchaka9da33ab2013-10-24 23:59:28 +030026 self.assertIn('a', self.d)
Benjamin Peterson577473f2010-01-19 00:09:57 +000027 self.assertIn(b'a', self.d)
Brett Cannon7317c1e2008-11-25 19:19:17 +000028 self.assertEqual(self.d[b'bytes'], b'data')
Serhiy Storchaka2e38cc32018-04-29 12:38:06 +030029 # get() and setdefault() work as in the dict interface
30 self.assertEqual(self.d.get(b'a'), b'b')
31 self.assertIsNone(self.d.get(b'xxx'))
32 self.assertEqual(self.d.get(b'xxx', b'foo'), b'foo')
33 with self.assertRaises(KeyError):
34 self.d['xxx']
35 self.assertEqual(self.d.setdefault(b'xxx', b'foo'), b'foo')
36 self.assertEqual(self.d[b'xxx'], b'foo')
Christian Heimesb186d002008-03-18 15:15:01 +000037 self.d.close()
Neal Norwitze7629c82002-11-02 18:25:08 +000038
Serhiy Storchaka70af06c2018-04-29 15:45:03 +030039 def test_empty_value(self):
40 if dbm.ndbm.library == 'Berkeley DB':
41 self.skipTest("Berkeley DB doesn't distinguish the empty value "
42 "from the absent one")
43 self.d = dbm.ndbm.open(self.filename, 'c')
44 self.assertEqual(self.d.keys(), [])
45 self.d['empty'] = ''
46 self.assertEqual(self.d.keys(), [b'empty'])
47 self.assertIn(b'empty', self.d)
48 self.assertEqual(self.d[b'empty'], b'')
49 self.assertEqual(self.d.get(b'empty'), b'')
50 self.assertEqual(self.d.setdefault(b'empty'), b'')
51 self.d.close()
52
Christian Heimesb186d002008-03-18 15:15:01 +000053 def test_modes(self):
54 for mode in ['r', 'rw', 'w', 'n']:
55 try:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +000056 self.d = dbm.ndbm.open(self.filename, mode)
Christian Heimesb186d002008-03-18 15:15:01 +000057 self.d.close()
Georg Brandl0a7ac7d2008-05-26 10:29:35 +000058 except error:
Christian Heimesb186d002008-03-18 15:15:01 +000059 self.fail()
Neal Norwitze7629c82002-11-02 18:25:08 +000060
Nick Coghlanc610aba2013-11-17 15:59:51 +100061 def test_context_manager(self):
62 with dbm.ndbm.open(self.filename, 'c') as db:
63 db["ndbm context manager"] = "context manager"
64
65 with dbm.ndbm.open(self.filename, 'r') as db:
66 self.assertEqual(list(db.keys()), [b"ndbm context manager"])
67
68 with self.assertRaises(dbm.ndbm.error) as cm:
69 db.keys()
70 self.assertEqual(str(cm.exception),
71 "DBM object has already been closed")
72
Serhiy Storchaka6f600ff2018-02-26 16:02:22 +020073 def test_bytes(self):
74 with dbm.ndbm.open(self.filename, 'c') as db:
75 db[b'bytes key \xbd'] = b'bytes value \xbd'
76 with dbm.ndbm.open(self.filename, 'r') as db:
77 self.assertEqual(list(db.keys()), [b'bytes key \xbd'])
78 self.assertTrue(b'bytes key \xbd' in db)
79 self.assertEqual(db[b'bytes key \xbd'], b'bytes value \xbd')
80
81 def test_unicode(self):
82 with dbm.ndbm.open(self.filename, 'c') as db:
83 db['Unicode key \U0001f40d'] = 'Unicode value \U0001f40d'
84 with dbm.ndbm.open(self.filename, 'r') as db:
85 self.assertEqual(list(db.keys()), ['Unicode key \U0001f40d'.encode()])
86 self.assertTrue('Unicode key \U0001f40d'.encode() in db)
87 self.assertTrue('Unicode key \U0001f40d' in db)
88 self.assertEqual(db['Unicode key \U0001f40d'.encode()],
89 'Unicode value \U0001f40d'.encode())
90 self.assertEqual(db['Unicode key \U0001f40d'],
91 'Unicode value \U0001f40d'.encode())
92
Xiang Zhang4fb0b8b2018-12-12 20:46:55 +080093 def test_write_readonly_file(self):
94 with dbm.ndbm.open(self.filename, 'c') as db:
95 db[b'bytes key'] = b'bytes value'
96 with dbm.ndbm.open(self.filename, 'r') as db:
97 with self.assertRaises(error):
98 del db[b'not exist key']
99 with self.assertRaises(error):
100 del db[b'bytes key']
101 with self.assertRaises(error):
102 db[b'not exist key'] = b'not exist value'
103
Serhiy Storchaka6f600ff2018-02-26 16:02:22 +0200104 @unittest.skipUnless(support.TESTFN_NONASCII,
105 'requires OS support of non-ASCII encodings')
106 def test_nonascii_filename(self):
107 filename = support.TESTFN_NONASCII
108 for suffix in ['', '.pag', '.dir', '.db']:
109 self.addCleanup(support.unlink, filename + suffix)
110 with dbm.ndbm.open(filename, 'c') as db:
111 db[b'key'] = b'value'
112 self.assertTrue(any(os.path.exists(filename + suffix)
113 for suffix in ['', '.pag', '.dir', '.db']))
114 with dbm.ndbm.open(filename, 'r') as db:
115 self.assertEqual(list(db.keys()), [b'key'])
116 self.assertTrue(b'key' in db)
117 self.assertEqual(db[b'key'], b'value')
118
Zsolt Cserna9df346b2018-09-27 21:54:34 +0200119 def test_nonexisting_file(self):
120 nonexisting_file = 'nonexisting-file'
121 with self.assertRaises(dbm.ndbm.error) as cm:
122 dbm.ndbm.open(nonexisting_file)
123 self.assertIn(nonexisting_file, str(cm.exception))
124 self.assertEqual(cm.exception.filename, nonexisting_file)
Serhiy Storchaka6f600ff2018-02-26 16:02:22 +0200125
Nick Coghlanc610aba2013-11-17 15:59:51 +1000126
Christian Heimes180510d2008-03-03 19:15:45 +0000127if __name__ == '__main__':
Ezio Melottif79493b2013-03-01 11:23:28 +0200128 unittest.main()