10a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom test.test_support import TESTFN, run_unittest, unlink, import_module 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaogdbm = import_module('gdbm') 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofilename = TESTFN 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass TestGdbm(unittest.TestCase): 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def setUp(self): 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g = None 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def tearDown(self): 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.g is not None: 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g.close() 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao unlink(filename) 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_key_methods(self): 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g = gdbm.open(filename, 'c') 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(self.g.keys(), []) 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g['a'] = 'b' 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g['12345678910'] = '019237410982340912840198242' 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key_set = set(self.g.keys()) 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(key_set, frozenset(['a', '12345678910'])) 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(self.g.has_key('a')) 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key = self.g.firstkey() 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while key: 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn(key, key_set) 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key_set.remove(key) 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key = self.g.nextkey(key) 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, lambda: self.g['xxx']) 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_error_conditions(self): 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Try to open a non-existent database. 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao unlink(filename) 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(gdbm.error, gdbm.open, filename, 'r') 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Try to access a closed database. 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g = gdbm.open(filename, 'c') 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g.close() 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(gdbm.error, lambda: self.g['a']) 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # try pass an invalid open flag 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close()) 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_flags(self): 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test the flag parameter open() by trying all supported flag modes. 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao all = set(gdbm.open_flags) 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test standard flags (presumably "crwn"). 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao modes = all - set('fsu') 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for mode in sorted(modes): 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g = gdbm.open(filename, mode) 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g.close() 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test additional flags (presumably "fsu"). 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao flags = all - set('crwn') 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for mode in modes: 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for flag in flags: 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g = gdbm.open(filename, mode + flag) 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g.close() 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_reorganize(self): 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g = gdbm.open(filename, 'c') 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao size0 = os.path.getsize(filename) 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g['x'] = 'x' * 10000 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao size1 = os.path.getsize(filename) 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(size0 < size1) 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del self.g['x'] 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # 'size' is supposed to be the same even after deleting an entry. 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(os.path.getsize(filename), size1) 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.g.reorganize() 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao size2 = os.path.getsize(filename) 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(size1 > size2 >= size0) 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_main(): 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao run_unittest(TestGdbm) 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == '__main__': 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao test_main() 83