summaryrefslogtreecommitdiff
path: root/lib/python2.7/test/test_dumbdbm.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/test/test_dumbdbm.py')
-rw-r--r--lib/python2.7/test/test_dumbdbm.py179
1 files changed, 179 insertions, 0 deletions
diff --git a/lib/python2.7/test/test_dumbdbm.py b/lib/python2.7/test/test_dumbdbm.py
new file mode 100644
index 0000000..041fac1
--- /dev/null
+++ b/lib/python2.7/test/test_dumbdbm.py
@@ -0,0 +1,179 @@
+#! /usr/bin/env python
+"""Test script for the dumbdbm module
+ Original by Roger E. Masse
+"""
+
+import os
+import unittest
+import dumbdbm
+from test import test_support
+
+_fname = test_support.TESTFN
+
+def _delete_files():
+ for ext in [".dir", ".dat", ".bak"]:
+ try:
+ os.unlink(_fname + ext)
+ except OSError:
+ pass
+
+class DumbDBMTestCase(unittest.TestCase):
+ _dict = {'0': '',
+ 'a': 'Python:',
+ 'b': 'Programming',
+ 'c': 'the',
+ 'd': 'way',
+ 'f': 'Guido',
+ 'g': 'intended'
+ }
+
+ def __init__(self, *args):
+ unittest.TestCase.__init__(self, *args)
+
+ def test_dumbdbm_creation(self):
+ f = dumbdbm.open(_fname, 'c')
+ self.assertEqual(f.keys(), [])
+ for key in self._dict:
+ f[key] = self._dict[key]
+ self.read_helper(f)
+ f.close()
+
+ def test_dumbdbm_creation_mode(self):
+ # On platforms without chmod, don't do anything.
+ if not (hasattr(os, 'chmod') and hasattr(os, 'umask')):
+ return
+
+ try:
+ old_umask = os.umask(0002)
+ f = dumbdbm.open(_fname, 'c', 0637)
+ f.close()
+ finally:
+ os.umask(old_umask)
+
+ expected_mode = 0635
+ if os.name != 'posix':
+ # Windows only supports setting the read-only attribute.
+ # This shouldn't fail, but doesn't work like Unix either.
+ expected_mode = 0666
+
+ import stat
+ st = os.stat(_fname + '.dat')
+ self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
+ st = os.stat(_fname + '.dir')
+ self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
+
+ def test_close_twice(self):
+ f = dumbdbm.open(_fname)
+ f['a'] = 'b'
+ self.assertEqual(f['a'], 'b')
+ f.close()
+ f.close()
+
+ def test_dumbdbm_modification(self):
+ self.init_db()
+ f = dumbdbm.open(_fname, 'w')
+ self._dict['g'] = f['g'] = "indented"
+ self.read_helper(f)
+ f.close()
+
+ def test_dumbdbm_read(self):
+ self.init_db()
+ f = dumbdbm.open(_fname, 'r')
+ self.read_helper(f)
+ f.close()
+
+ def test_dumbdbm_keys(self):
+ self.init_db()
+ f = dumbdbm.open(_fname)
+ keys = self.keys_helper(f)
+ f.close()
+
+ def test_write_write_read(self):
+ # test for bug #482460
+ f = dumbdbm.open(_fname)
+ f['1'] = 'hello'
+ f['1'] = 'hello2'
+ f.close()
+ f = dumbdbm.open(_fname)
+ self.assertEqual(f['1'], 'hello2')
+ f.close()
+
+ def test_line_endings(self):
+ # test for bug #1172763: dumbdbm would die if the line endings
+ # weren't what was expected.
+ f = dumbdbm.open(_fname)
+ f['1'] = 'hello'
+ f['2'] = 'hello2'
+ f.close()
+
+ # Mangle the file by adding \r before each newline
+ data = open(_fname + '.dir').read()
+ data = data.replace('\n', '\r\n')
+ open(_fname + '.dir', 'wb').write(data)
+
+ f = dumbdbm.open(_fname)
+ self.assertEqual(f['1'], 'hello')
+ self.assertEqual(f['2'], 'hello2')
+
+
+ def read_helper(self, f):
+ keys = self.keys_helper(f)
+ for key in self._dict:
+ self.assertEqual(self._dict[key], f[key])
+
+ def init_db(self):
+ f = dumbdbm.open(_fname, 'w')
+ for k in self._dict:
+ f[k] = self._dict[k]
+ f.close()
+
+ def keys_helper(self, f):
+ keys = f.keys()
+ keys.sort()
+ dkeys = self._dict.keys()
+ dkeys.sort()
+ self.assertEqual(keys, dkeys)
+ return keys
+
+ # Perform randomized operations. This doesn't make assumptions about
+ # what *might* fail.
+ def test_random(self):
+ import random
+ d = {} # mirror the database
+ for dummy in range(5):
+ f = dumbdbm.open(_fname)
+ for dummy in range(100):
+ k = random.choice('abcdefghijklm')
+ if random.random() < 0.2:
+ if k in d:
+ del d[k]
+ del f[k]
+ else:
+ v = random.choice('abc') * random.randrange(10000)
+ d[k] = v
+ f[k] = v
+ self.assertEqual(f[k], v)
+ f.close()
+
+ f = dumbdbm.open(_fname)
+ expected = d.items()
+ expected.sort()
+ got = f.items()
+ got.sort()
+ self.assertEqual(expected, got)
+ f.close()
+
+ def tearDown(self):
+ _delete_files()
+
+ def setUp(self):
+ _delete_files()
+
+def test_main():
+ try:
+ test_support.run_unittest(DumbDBMTestCase)
+ finally:
+ _delete_files()
+
+if __name__ == "__main__":
+ test_main()