14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest 24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import TESTFN, run_unittest, unlink, import_module 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaogdbm = import_module('gdbm') 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofilename = TESTFN 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestGdbm(unittest.TestCase): 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setUp(self): 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g = None 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tearDown(self): 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.g is not None: 164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g.close() 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(filename) 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_key_methods(self): 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g = gdbm.open(filename, 'c') 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(self.g.keys(), []) 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g['a'] = 'b' 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g['12345678910'] = '019237410982340912840198242' 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao key_set = set(self.g.keys()) 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(key_set, frozenset(['a', '12345678910'])) 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(self.g.has_key('a')) 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao key = self.g.firstkey() 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while key: 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertIn(key, key_set) 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao key_set.remove(key) 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao key = self.g.nextkey(key) 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(KeyError, lambda: self.g['xxx']) 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_error_conditions(self): 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Try to open a non-existent database. 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unlink(filename) 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(gdbm.error, gdbm.open, filename, 'r') 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Try to access a closed database. 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g = gdbm.open(filename, 'c') 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g.close() 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(gdbm.error, lambda: self.g['a']) 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # try pass an invalid open flag 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close()) 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_flags(self): 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Test the flag parameter open() by trying all supported flag modes. 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao all = set(gdbm.open_flags) 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Test standard flags (presumably "crwn"). 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao modes = all - set('fsu') 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for mode in sorted(modes): 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g = gdbm.open(filename, mode) 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g.close() 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Test additional flags (presumably "fsu"). 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao flags = all - set('crwn') 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for mode in modes: 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for flag in flags: 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g = gdbm.open(filename, mode + flag) 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g.close() 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_reorganize(self): 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g = gdbm.open(filename, 'c') 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao size0 = os.path.getsize(filename) 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g['x'] = 'x' * 10000 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao size1 = os.path.getsize(filename) 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(size0 < size1) 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del self.g['x'] 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # 'size' is supposed to be the same even after deleting an entry. 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(os.path.getsize(filename), size1) 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.g.reorganize() 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao size2 = os.path.getsize(filename) 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertTrue(size1 > size2 >= size0) 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main(): 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao run_unittest(TestGdbm) 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__': 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao test_main() 83