test_dbm_ndbm.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. from test.support import import_helper
  2. from test.support import os_helper
  3. import_helper.import_module("dbm.ndbm") #skip if not supported
  4. import os
  5. import unittest
  6. import dbm.ndbm
  7. from dbm.ndbm import error
  8. class DbmTestCase(unittest.TestCase):
  9. def setUp(self):
  10. self.filename = os_helper.TESTFN
  11. self.d = dbm.ndbm.open(self.filename, 'c')
  12. self.d.close()
  13. def tearDown(self):
  14. for suffix in ['', '.pag', '.dir', '.db']:
  15. os_helper.unlink(self.filename + suffix)
  16. def test_keys(self):
  17. self.d = dbm.ndbm.open(self.filename, 'c')
  18. self.assertEqual(self.d.keys(), [])
  19. self.d['a'] = 'b'
  20. self.d[b'bytes'] = b'data'
  21. self.d['12345678910'] = '019237410982340912840198242'
  22. self.d.keys()
  23. self.assertIn('a', self.d)
  24. self.assertIn(b'a', self.d)
  25. self.assertEqual(self.d[b'bytes'], b'data')
  26. # get() and setdefault() work as in the dict interface
  27. self.assertEqual(self.d.get(b'a'), b'b')
  28. self.assertIsNone(self.d.get(b'xxx'))
  29. self.assertEqual(self.d.get(b'xxx', b'foo'), b'foo')
  30. with self.assertRaises(KeyError):
  31. self.d['xxx']
  32. self.assertEqual(self.d.setdefault(b'xxx', b'foo'), b'foo')
  33. self.assertEqual(self.d[b'xxx'], b'foo')
  34. self.d.close()
  35. def test_empty_value(self):
  36. if dbm.ndbm.library == 'Berkeley DB':
  37. self.skipTest("Berkeley DB doesn't distinguish the empty value "
  38. "from the absent one")
  39. self.d = dbm.ndbm.open(self.filename, 'c')
  40. self.assertEqual(self.d.keys(), [])
  41. self.d['empty'] = ''
  42. self.assertEqual(self.d.keys(), [b'empty'])
  43. self.assertIn(b'empty', self.d)
  44. self.assertEqual(self.d[b'empty'], b'')
  45. self.assertEqual(self.d.get(b'empty'), b'')
  46. self.assertEqual(self.d.setdefault(b'empty'), b'')
  47. self.d.close()
  48. def test_modes(self):
  49. for mode in ['r', 'rw', 'w', 'n']:
  50. try:
  51. self.d = dbm.ndbm.open(self.filename, mode)
  52. self.d.close()
  53. except error:
  54. self.fail()
  55. def test_context_manager(self):
  56. with dbm.ndbm.open(self.filename, 'c') as db:
  57. db["ndbm context manager"] = "context manager"
  58. with dbm.ndbm.open(self.filename, 'r') as db:
  59. self.assertEqual(list(db.keys()), [b"ndbm context manager"])
  60. with self.assertRaises(dbm.ndbm.error) as cm:
  61. db.keys()
  62. self.assertEqual(str(cm.exception),
  63. "DBM object has already been closed")
  64. def test_bytes(self):
  65. with dbm.ndbm.open(self.filename, 'c') as db:
  66. db[b'bytes key \xbd'] = b'bytes value \xbd'
  67. with dbm.ndbm.open(self.filename, 'r') as db:
  68. self.assertEqual(list(db.keys()), [b'bytes key \xbd'])
  69. self.assertTrue(b'bytes key \xbd' in db)
  70. self.assertEqual(db[b'bytes key \xbd'], b'bytes value \xbd')
  71. def test_unicode(self):
  72. with dbm.ndbm.open(self.filename, 'c') as db:
  73. db['Unicode key \U0001f40d'] = 'Unicode value \U0001f40d'
  74. with dbm.ndbm.open(self.filename, 'r') as db:
  75. self.assertEqual(list(db.keys()), ['Unicode key \U0001f40d'.encode()])
  76. self.assertTrue('Unicode key \U0001f40d'.encode() in db)
  77. self.assertTrue('Unicode key \U0001f40d' in db)
  78. self.assertEqual(db['Unicode key \U0001f40d'.encode()],
  79. 'Unicode value \U0001f40d'.encode())
  80. self.assertEqual(db['Unicode key \U0001f40d'],
  81. 'Unicode value \U0001f40d'.encode())
  82. def test_write_readonly_file(self):
  83. with dbm.ndbm.open(self.filename, 'c') as db:
  84. db[b'bytes key'] = b'bytes value'
  85. with dbm.ndbm.open(self.filename, 'r') as db:
  86. with self.assertRaises(error):
  87. del db[b'not exist key']
  88. with self.assertRaises(error):
  89. del db[b'bytes key']
  90. with self.assertRaises(error):
  91. db[b'not exist key'] = b'not exist value'
  92. @unittest.skipUnless(os_helper.TESTFN_NONASCII,
  93. 'requires OS support of non-ASCII encodings')
  94. def test_nonascii_filename(self):
  95. filename = os_helper.TESTFN_NONASCII
  96. for suffix in ['', '.pag', '.dir', '.db']:
  97. self.addCleanup(os_helper.unlink, filename + suffix)
  98. with dbm.ndbm.open(filename, 'c') as db:
  99. db[b'key'] = b'value'
  100. self.assertTrue(any(os.path.exists(filename + suffix)
  101. for suffix in ['', '.pag', '.dir', '.db']))
  102. with dbm.ndbm.open(filename, 'r') as db:
  103. self.assertEqual(list(db.keys()), [b'key'])
  104. self.assertTrue(b'key' in db)
  105. self.assertEqual(db[b'key'], b'value')
  106. def test_nonexisting_file(self):
  107. nonexisting_file = 'nonexisting-file'
  108. with self.assertRaises(dbm.ndbm.error) as cm:
  109. dbm.ndbm.open(nonexisting_file)
  110. self.assertIn(nonexisting_file, str(cm.exception))
  111. self.assertEqual(cm.exception.filename, nonexisting_file)
  112. def test_open_with_pathlib_path(self):
  113. dbm.ndbm.open(os_helper.FakePath(self.filename), "c").close()
  114. def test_open_with_bytes_path(self):
  115. dbm.ndbm.open(os.fsencode(self.filename), "c").close()
  116. def test_open_with_pathlib_bytes_path(self):
  117. dbm.ndbm.open(os_helper.FakePath(os.fsencode(self.filename)), "c").close()
  118. if __name__ == '__main__':
  119. unittest.main()