Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 1 | from test import support |
Kristján Valur Jónsson | 42a40c5 | 2009-04-01 11:28:47 +0000 | [diff] [blame] | 2 | support.import_module("dbm.ndbm") #skip if not supported |
Serhiy Storchaka | 6f600ff | 2018-02-26 16:02:22 +0200 | [diff] [blame] | 3 | import os |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 4 | import unittest |
Georg Brandl | 0a7ac7d | 2008-05-26 10:29:35 +0000 | [diff] [blame] | 5 | import dbm.ndbm |
| 6 | from dbm.ndbm import error |
Roger E. Masse | fab8ab8 | 1996-12-20 22:36:52 +0000 | [diff] [blame] | 7 | |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 8 | class DbmTestCase(unittest.TestCase): |
Roger E. Masse | 16f9fd2 | 1996-12-10 00:06:24 +0000 | [diff] [blame] | 9 | |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 10 | def setUp(self): |
Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 11 | self.filename = support.TESTFN |
Georg Brandl | 0a7ac7d | 2008-05-26 10:29:35 +0000 | [diff] [blame] | 12 | self.d = dbm.ndbm.open(self.filename, 'c') |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 13 | self.d.close() |
Fred Drake | 57a4e90 | 2000-09-18 17:56:58 +0000 | [diff] [blame] | 14 | |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 15 | def tearDown(self): |
| 16 | for suffix in ['', '.pag', '.dir', '.db']: |
Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 17 | support.unlink(self.filename + suffix) |
Roger E. Masse | 16f9fd2 | 1996-12-10 00:06:24 +0000 | [diff] [blame] | 18 | |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 19 | def test_keys(self): |
Georg Brandl | 0a7ac7d | 2008-05-26 10:29:35 +0000 | [diff] [blame] | 20 | self.d = dbm.ndbm.open(self.filename, 'c') |
Serhiy Storchaka | 2e38cc3 | 2018-04-29 12:38:06 +0300 | [diff] [blame] | 21 | self.assertEqual(self.d.keys(), []) |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 22 | self.d['a'] = 'b' |
Brett Cannon | 7317c1e | 2008-11-25 19:19:17 +0000 | [diff] [blame] | 23 | self.d[b'bytes'] = b'data' |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 24 | self.d['12345678910'] = '019237410982340912840198242' |
| 25 | self.d.keys() |
Serhiy Storchaka | 9da33ab | 2013-10-24 23:59:28 +0300 | [diff] [blame] | 26 | self.assertIn('a', self.d) |
Benjamin Peterson | 577473f | 2010-01-19 00:09:57 +0000 | [diff] [blame] | 27 | self.assertIn(b'a', self.d) |
Brett Cannon | 7317c1e | 2008-11-25 19:19:17 +0000 | [diff] [blame] | 28 | self.assertEqual(self.d[b'bytes'], b'data') |
Serhiy Storchaka | 2e38cc3 | 2018-04-29 12:38:06 +0300 | [diff] [blame] | 29 | # 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 Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 37 | self.d.close() |
Neal Norwitz | e7629c8 | 2002-11-02 18:25:08 +0000 | [diff] [blame] | 38 | |
Serhiy Storchaka | 70af06c | 2018-04-29 15:45:03 +0300 | [diff] [blame] | 39 | 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 Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 53 | def test_modes(self): |
| 54 | for mode in ['r', 'rw', 'w', 'n']: |
| 55 | try: |
Georg Brandl | 0a7ac7d | 2008-05-26 10:29:35 +0000 | [diff] [blame] | 56 | self.d = dbm.ndbm.open(self.filename, mode) |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 57 | self.d.close() |
Georg Brandl | 0a7ac7d | 2008-05-26 10:29:35 +0000 | [diff] [blame] | 58 | except error: |
Christian Heimes | b186d00 | 2008-03-18 15:15:01 +0000 | [diff] [blame] | 59 | self.fail() |
Neal Norwitz | e7629c8 | 2002-11-02 18:25:08 +0000 | [diff] [blame] | 60 | |
Nick Coghlan | c610aba | 2013-11-17 15:59:51 +1000 | [diff] [blame] | 61 | 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 Storchaka | 6f600ff | 2018-02-26 16:02:22 +0200 | [diff] [blame] | 73 | 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 Zhang | 4fb0b8b | 2018-12-12 20:46:55 +0800 | [diff] [blame] | 93 | 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 Storchaka | 6f600ff | 2018-02-26 16:02:22 +0200 | [diff] [blame] | 104 | @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 Cserna | 9df346b | 2018-09-27 21:54:34 +0200 | [diff] [blame] | 119 | 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 Storchaka | 6f600ff | 2018-02-26 16:02:22 +0200 | [diff] [blame] | 125 | |
Nick Coghlan | c610aba | 2013-11-17 15:59:51 +1000 | [diff] [blame] | 126 | |
Christian Heimes | 180510d | 2008-03-03 19:15:45 +0000 | [diff] [blame] | 127 | if __name__ == '__main__': |
Ezio Melotti | f79493b | 2013-03-01 11:23:28 +0200 | [diff] [blame] | 128 | unittest.main() |