17db96d56Sopenharmony_cifrom test.support import import_helper 27db96d56Sopenharmony_cifrom test.support import os_helper 37db96d56Sopenharmony_ciimport_helper.import_module("dbm.ndbm") #skip if not supported 47db96d56Sopenharmony_ciimport os 57db96d56Sopenharmony_ciimport unittest 67db96d56Sopenharmony_ciimport dbm.ndbm 77db96d56Sopenharmony_cifrom dbm.ndbm import error 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciclass DbmTestCase(unittest.TestCase): 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci def setUp(self): 127db96d56Sopenharmony_ci self.filename = os_helper.TESTFN 137db96d56Sopenharmony_ci self.d = dbm.ndbm.open(self.filename, 'c') 147db96d56Sopenharmony_ci self.d.close() 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci def tearDown(self): 177db96d56Sopenharmony_ci for suffix in ['', '.pag', '.dir', '.db']: 187db96d56Sopenharmony_ci os_helper.unlink(self.filename + suffix) 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci def test_keys(self): 217db96d56Sopenharmony_ci self.d = dbm.ndbm.open(self.filename, 'c') 227db96d56Sopenharmony_ci self.assertEqual(self.d.keys(), []) 237db96d56Sopenharmony_ci self.d['a'] = 'b' 247db96d56Sopenharmony_ci self.d[b'bytes'] = b'data' 257db96d56Sopenharmony_ci self.d['12345678910'] = '019237410982340912840198242' 267db96d56Sopenharmony_ci self.d.keys() 277db96d56Sopenharmony_ci self.assertIn('a', self.d) 287db96d56Sopenharmony_ci self.assertIn(b'a', self.d) 297db96d56Sopenharmony_ci self.assertEqual(self.d[b'bytes'], b'data') 307db96d56Sopenharmony_ci # get() and setdefault() work as in the dict interface 317db96d56Sopenharmony_ci self.assertEqual(self.d.get(b'a'), b'b') 327db96d56Sopenharmony_ci self.assertIsNone(self.d.get(b'xxx')) 337db96d56Sopenharmony_ci self.assertEqual(self.d.get(b'xxx', b'foo'), b'foo') 347db96d56Sopenharmony_ci with self.assertRaises(KeyError): 357db96d56Sopenharmony_ci self.d['xxx'] 367db96d56Sopenharmony_ci self.assertEqual(self.d.setdefault(b'xxx', b'foo'), b'foo') 377db96d56Sopenharmony_ci self.assertEqual(self.d[b'xxx'], b'foo') 387db96d56Sopenharmony_ci self.d.close() 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci def test_empty_value(self): 417db96d56Sopenharmony_ci if dbm.ndbm.library == 'Berkeley DB': 427db96d56Sopenharmony_ci self.skipTest("Berkeley DB doesn't distinguish the empty value " 437db96d56Sopenharmony_ci "from the absent one") 447db96d56Sopenharmony_ci self.d = dbm.ndbm.open(self.filename, 'c') 457db96d56Sopenharmony_ci self.assertEqual(self.d.keys(), []) 467db96d56Sopenharmony_ci self.d['empty'] = '' 477db96d56Sopenharmony_ci self.assertEqual(self.d.keys(), [b'empty']) 487db96d56Sopenharmony_ci self.assertIn(b'empty', self.d) 497db96d56Sopenharmony_ci self.assertEqual(self.d[b'empty'], b'') 507db96d56Sopenharmony_ci self.assertEqual(self.d.get(b'empty'), b'') 517db96d56Sopenharmony_ci self.assertEqual(self.d.setdefault(b'empty'), b'') 527db96d56Sopenharmony_ci self.d.close() 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci def test_modes(self): 557db96d56Sopenharmony_ci for mode in ['r', 'rw', 'w', 'n']: 567db96d56Sopenharmony_ci try: 577db96d56Sopenharmony_ci self.d = dbm.ndbm.open(self.filename, mode) 587db96d56Sopenharmony_ci self.d.close() 597db96d56Sopenharmony_ci except error: 607db96d56Sopenharmony_ci self.fail() 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci def test_context_manager(self): 637db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'c') as db: 647db96d56Sopenharmony_ci db["ndbm context manager"] = "context manager" 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'r') as db: 677db96d56Sopenharmony_ci self.assertEqual(list(db.keys()), [b"ndbm context manager"]) 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci with self.assertRaises(dbm.ndbm.error) as cm: 707db96d56Sopenharmony_ci db.keys() 717db96d56Sopenharmony_ci self.assertEqual(str(cm.exception), 727db96d56Sopenharmony_ci "DBM object has already been closed") 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci def test_bytes(self): 757db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'c') as db: 767db96d56Sopenharmony_ci db[b'bytes key \xbd'] = b'bytes value \xbd' 777db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'r') as db: 787db96d56Sopenharmony_ci self.assertEqual(list(db.keys()), [b'bytes key \xbd']) 797db96d56Sopenharmony_ci self.assertTrue(b'bytes key \xbd' in db) 807db96d56Sopenharmony_ci self.assertEqual(db[b'bytes key \xbd'], b'bytes value \xbd') 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci def test_unicode(self): 837db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'c') as db: 847db96d56Sopenharmony_ci db['Unicode key \U0001f40d'] = 'Unicode value \U0001f40d' 857db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'r') as db: 867db96d56Sopenharmony_ci self.assertEqual(list(db.keys()), ['Unicode key \U0001f40d'.encode()]) 877db96d56Sopenharmony_ci self.assertTrue('Unicode key \U0001f40d'.encode() in db) 887db96d56Sopenharmony_ci self.assertTrue('Unicode key \U0001f40d' in db) 897db96d56Sopenharmony_ci self.assertEqual(db['Unicode key \U0001f40d'.encode()], 907db96d56Sopenharmony_ci 'Unicode value \U0001f40d'.encode()) 917db96d56Sopenharmony_ci self.assertEqual(db['Unicode key \U0001f40d'], 927db96d56Sopenharmony_ci 'Unicode value \U0001f40d'.encode()) 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci def test_write_readonly_file(self): 957db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'c') as db: 967db96d56Sopenharmony_ci db[b'bytes key'] = b'bytes value' 977db96d56Sopenharmony_ci with dbm.ndbm.open(self.filename, 'r') as db: 987db96d56Sopenharmony_ci with self.assertRaises(error): 997db96d56Sopenharmony_ci del db[b'not exist key'] 1007db96d56Sopenharmony_ci with self.assertRaises(error): 1017db96d56Sopenharmony_ci del db[b'bytes key'] 1027db96d56Sopenharmony_ci with self.assertRaises(error): 1037db96d56Sopenharmony_ci db[b'not exist key'] = b'not exist value' 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci @unittest.skipUnless(os_helper.TESTFN_NONASCII, 1067db96d56Sopenharmony_ci 'requires OS support of non-ASCII encodings') 1077db96d56Sopenharmony_ci def test_nonascii_filename(self): 1087db96d56Sopenharmony_ci filename = os_helper.TESTFN_NONASCII 1097db96d56Sopenharmony_ci for suffix in ['', '.pag', '.dir', '.db']: 1107db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename + suffix) 1117db96d56Sopenharmony_ci with dbm.ndbm.open(filename, 'c') as db: 1127db96d56Sopenharmony_ci db[b'key'] = b'value' 1137db96d56Sopenharmony_ci self.assertTrue(any(os.path.exists(filename + suffix) 1147db96d56Sopenharmony_ci for suffix in ['', '.pag', '.dir', '.db'])) 1157db96d56Sopenharmony_ci with dbm.ndbm.open(filename, 'r') as db: 1167db96d56Sopenharmony_ci self.assertEqual(list(db.keys()), [b'key']) 1177db96d56Sopenharmony_ci self.assertTrue(b'key' in db) 1187db96d56Sopenharmony_ci self.assertEqual(db[b'key'], b'value') 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci def test_nonexisting_file(self): 1217db96d56Sopenharmony_ci nonexisting_file = 'nonexisting-file' 1227db96d56Sopenharmony_ci with self.assertRaises(dbm.ndbm.error) as cm: 1237db96d56Sopenharmony_ci dbm.ndbm.open(nonexisting_file) 1247db96d56Sopenharmony_ci self.assertIn(nonexisting_file, str(cm.exception)) 1257db96d56Sopenharmony_ci self.assertEqual(cm.exception.filename, nonexisting_file) 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci def test_open_with_pathlib_path(self): 1287db96d56Sopenharmony_ci dbm.ndbm.open(os_helper.FakePath(self.filename), "c").close() 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci def test_open_with_bytes_path(self): 1317db96d56Sopenharmony_ci dbm.ndbm.open(os.fsencode(self.filename), "c").close() 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci def test_open_with_pathlib_bytes_path(self): 1347db96d56Sopenharmony_ci dbm.ndbm.open(os_helper.FakePath(os.fsencode(self.filename)), "c").close() 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ciif __name__ == '__main__': 1387db96d56Sopenharmony_ci unittest.main() 139