blob: e2964aad733ccb0e0866befd391c21691132ab81 [file] [log] [blame]
Guido van Rossum2f1064c2001-01-18 16:46:52 +00001#! /usr/bin/env python
2"""Test script for the dumbdbm module
3 Original by Roger E. Masse
4"""
5
Guido van Rossum6252e102007-05-23 20:51:02 +00006import io
Guido van Rossum2f1064c2001-01-18 16:46:52 +00007import os
Barry Warsaw3ca656f2001-11-13 20:16:52 +00008import unittest
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00009import dbm.dumb as dumbdbm
Benjamin Petersonee8712c2008-05-20 21:35:26 +000010from test import support
Guido van Rossum2f1064c2001-01-18 16:46:52 +000011
Benjamin Petersonee8712c2008-05-20 21:35:26 +000012_fname = support.TESTFN
Tim Petersd9fbf352002-01-30 07:32:53 +000013
14def _delete_files():
15 for ext in [".dir", ".dat", ".bak"]:
16 try:
17 os.unlink(_fname + ext)
18 except OSError:
19 pass
20
Barry Warsaw3ca656f2001-11-13 20:16:52 +000021class DumbDBMTestCase(unittest.TestCase):
Brett Cannon58425d32008-11-21 00:17:53 +000022 _dict = {b'0': b'',
23 b'a': b'Python:',
24 b'b': b'Programming',
25 b'c': b'the',
26 b'd': b'way',
27 b'f': b'Guido',
28 b'g': b'intended',
29 '\u00fc'.encode('utf-8') : b'!',
Barry Warsaw3ca656f2001-11-13 20:16:52 +000030 }
31
32 def __init__(self, *args):
33 unittest.TestCase.__init__(self, *args)
Tim Peters88768482001-11-13 21:51:26 +000034
Barry Warsaw3ca656f2001-11-13 20:16:52 +000035 def test_dumbdbm_creation(self):
Tim Petersd9fbf352002-01-30 07:32:53 +000036 f = dumbdbm.open(_fname, 'c')
Brett Cannonc1b22a02007-02-22 05:04:32 +000037 self.assertEqual(list(f.keys()), [])
Barry Warsaw3ca656f2001-11-13 20:16:52 +000038 for key in self._dict:
Brett Cannon58425d32008-11-21 00:17:53 +000039 f[key] = self._dict[key]
Barry Warsaw3ca656f2001-11-13 20:16:52 +000040 self.read_helper(f)
41 f.close()
42
Thomas Wouters902d6eb2007-01-09 23:18:33 +000043 def test_dumbdbm_creation_mode(self):
44 # On platforms without chmod, don't do anything.
45 if not (hasattr(os, 'chmod') and hasattr(os, 'umask')):
46 return
47
48 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +000049 old_umask = os.umask(0o002)
50 f = dumbdbm.open(_fname, 'c', 0o637)
Thomas Wouters902d6eb2007-01-09 23:18:33 +000051 f.close()
52 finally:
53 os.umask(old_umask)
Thomas Wouters9fe394c2007-02-05 01:24:16 +000054
Guido van Rossumcd16bf62007-06-13 18:07:49 +000055 expected_mode = 0o635
Thomas Woutersb2137042007-02-01 18:02:27 +000056 if os.name != 'posix':
57 # Windows only supports setting the read-only attribute.
58 # This shouldn't fail, but doesn't work like Unix either.
Guido van Rossumcd16bf62007-06-13 18:07:49 +000059 expected_mode = 0o666
Thomas Woutersb2137042007-02-01 18:02:27 +000060
Thomas Wouters902d6eb2007-01-09 23:18:33 +000061 import stat
62 st = os.stat(_fname + '.dat')
Thomas Woutersb2137042007-02-01 18:02:27 +000063 self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
Thomas Wouters902d6eb2007-01-09 23:18:33 +000064 st = os.stat(_fname + '.dir')
Thomas Woutersb2137042007-02-01 18:02:27 +000065 self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
Thomas Wouters9fe394c2007-02-05 01:24:16 +000066
Tim Peters7a6c7332003-07-13 17:21:10 +000067 def test_close_twice(self):
68 f = dumbdbm.open(_fname)
Martin v. Löwise6568692007-08-07 05:37:39 +000069 f[b'a'] = b'b'
70 self.assertEqual(f[b'a'], b'b')
Tim Peters7a6c7332003-07-13 17:21:10 +000071 f.close()
72 f.close()
73
Barry Warsaw3ca656f2001-11-13 20:16:52 +000074 def test_dumbdbm_modification(self):
Skip Montanaroc08fe822002-03-17 23:03:42 +000075 self.init_db()
Tim Petersd9fbf352002-01-30 07:32:53 +000076 f = dumbdbm.open(_fname, 'w')
Brett Cannon58425d32008-11-21 00:17:53 +000077 self._dict[b'g'] = f[b'g'] = b"indented"
Barry Warsaw3ca656f2001-11-13 20:16:52 +000078 self.read_helper(f)
79 f.close()
80
81 def test_dumbdbm_read(self):
Skip Montanaroc08fe822002-03-17 23:03:42 +000082 self.init_db()
Tim Petersd9fbf352002-01-30 07:32:53 +000083 f = dumbdbm.open(_fname, 'r')
Barry Warsaw3ca656f2001-11-13 20:16:52 +000084 self.read_helper(f)
85 f.close()
86
87 def test_dumbdbm_keys(self):
Skip Montanaroc08fe822002-03-17 23:03:42 +000088 self.init_db()
Tim Petersd9fbf352002-01-30 07:32:53 +000089 f = dumbdbm.open(_fname)
Barry Warsaw3ca656f2001-11-13 20:16:52 +000090 keys = self.keys_helper(f)
91 f.close()
92
Gregory P. Smith178fefb2007-08-24 21:59:45 +000093 def test_write_contains(self):
94 f = dumbdbm.open(_fname)
95 f[b'1'] = b'hello'
Gregory P. Smithc3ee9502007-08-24 22:14:21 +000096 self.assertTrue(b'1' in f)
Gregory P. Smith178fefb2007-08-24 21:59:45 +000097 f.close()
98
Skip Montanaroc08fe822002-03-17 23:03:42 +000099 def test_write_write_read(self):
100 # test for bug #482460
101 f = dumbdbm.open(_fname)
Martin v. Löwise6568692007-08-07 05:37:39 +0000102 f[b'1'] = b'hello'
103 f[b'1'] = b'hello2'
Skip Montanaroc08fe822002-03-17 23:03:42 +0000104 f.close()
105 f = dumbdbm.open(_fname)
Guido van Rossum7b4beea2007-08-28 00:09:54 +0000106 self.assertEqual(f[b'1'], b'hello2')
Skip Montanaroc08fe822002-03-17 23:03:42 +0000107 f.close()
108
Brett Cannon58425d32008-11-21 00:17:53 +0000109 def test_str_read(self):
110 self.init_db()
111 f = dumbdbm.open(_fname, 'r')
112 self.assertEqual(f['\u00fc'], self._dict['\u00fc'.encode('utf-8')])
113
114 def test_str_write_contains(self):
115 self.init_db()
116 f = dumbdbm.open(_fname)
117 f['\u00fc'] = b'!'
Brett Cannon7317c1e2008-11-25 19:19:17 +0000118 f['1'] = 'a'
Brett Cannon58425d32008-11-21 00:17:53 +0000119 f.close()
120 f = dumbdbm.open(_fname, 'r')
121 self.assert_('\u00fc' in f)
122 self.assertEqual(f['\u00fc'.encode('utf-8')],
123 self._dict['\u00fc'.encode('utf-8')])
Brett Cannon7317c1e2008-11-25 19:19:17 +0000124 self.assertEqual(f[b'1'], b'a')
Brett Cannon58425d32008-11-21 00:17:53 +0000125
Andrew M. Kuchlingecdad852005-06-07 19:36:10 +0000126 def test_line_endings(self):
127 # test for bug #1172763: dumbdbm would die if the line endings
128 # weren't what was expected.
129 f = dumbdbm.open(_fname)
Martin v. Löwise6568692007-08-07 05:37:39 +0000130 f[b'1'] = b'hello'
131 f[b'2'] = b'hello2'
Andrew M. Kuchlingecdad852005-06-07 19:36:10 +0000132 f.close()
133
Christian Heimes9289bfc2007-10-31 19:40:17 +0000134 # Mangle the file by changing the line separator to Windows or Unix
Guido van Rossum6252e102007-05-23 20:51:02 +0000135 data = io.open(_fname + '.dir', 'rb').read()
Guido van Rossum98297ee2007-11-06 21:34:58 +0000136 if os.linesep == '\n':
Christian Heimes9289bfc2007-10-31 19:40:17 +0000137 data = data.replace(b'\n', b'\r\n')
138 else:
139 data = data.replace(b'\r\n', b'\n')
Guido van Rossum6252e102007-05-23 20:51:02 +0000140 io.open(_fname + '.dir', 'wb').write(data)
Anthony Baxter95a2a4e2005-06-08 04:35:50 +0000141
Andrew M. Kuchlingecdad852005-06-07 19:36:10 +0000142 f = dumbdbm.open(_fname)
Martin v. Löwise6568692007-08-07 05:37:39 +0000143 self.assertEqual(f[b'1'], b'hello')
144 self.assertEqual(f[b'2'], b'hello2')
Anthony Baxter95a2a4e2005-06-08 04:35:50 +0000145
146
Barry Warsaw3ca656f2001-11-13 20:16:52 +0000147 def read_helper(self, f):
148 keys = self.keys_helper(f)
149 for key in self._dict:
Brett Cannon58425d32008-11-21 00:17:53 +0000150 self.assertEqual(self._dict[key], f[key])
Tim Peters88768482001-11-13 21:51:26 +0000151
Skip Montanaroc08fe822002-03-17 23:03:42 +0000152 def init_db(self):
153 f = dumbdbm.open(_fname, 'w')
154 for k in self._dict:
Brett Cannon58425d32008-11-21 00:17:53 +0000155 f[k] = self._dict[k]
Skip Montanaroc08fe822002-03-17 23:03:42 +0000156 f.close()
157
Barry Warsaw3ca656f2001-11-13 20:16:52 +0000158 def keys_helper(self, f):
Brett Cannon58425d32008-11-21 00:17:53 +0000159 keys = sorted(f.keys())
Brett Cannonc1b22a02007-02-22 05:04:32 +0000160 dkeys = sorted(self._dict.keys())
Skip Montanaroc08fe822002-03-17 23:03:42 +0000161 self.assertEqual(keys, dkeys)
Barry Warsaw3ca656f2001-11-13 20:16:52 +0000162 return keys
163
Tim Peters663d1b62003-07-11 04:09:09 +0000164 # Perform randomized operations. This doesn't make assumptions about
165 # what *might* fail.
166 def test_random(self):
167 import random
168 d = {} # mirror the database
169 for dummy in range(5):
170 f = dumbdbm.open(_fname)
171 for dummy in range(100):
172 k = random.choice('abcdefghijklm')
173 if random.random() < 0.2:
174 if k in d:
175 del d[k]
Brett Cannon58425d32008-11-21 00:17:53 +0000176 del f[k]
Tim Peters663d1b62003-07-11 04:09:09 +0000177 else:
Guido van Rossum6252e102007-05-23 20:51:02 +0000178 v = random.choice((b'a', b'b', b'c')) * random.randrange(10000)
Tim Peters663d1b62003-07-11 04:09:09 +0000179 d[k] = v
Brett Cannon58425d32008-11-21 00:17:53 +0000180 f[k] = v
181 self.assertEqual(f[k], v)
Tim Peters663d1b62003-07-11 04:09:09 +0000182 f.close()
183
184 f = dumbdbm.open(_fname)
Guido van Rossum7b4beea2007-08-28 00:09:54 +0000185 expected = sorted((k.encode("latin-1"), v) for k, v in d.items())
Brett Cannonc1b22a02007-02-22 05:04:32 +0000186 got = sorted(f.items())
Tim Peters663d1b62003-07-11 04:09:09 +0000187 self.assertEqual(expected, got)
188 f.close()
189
Skip Montanaroc08fe822002-03-17 23:03:42 +0000190 def tearDown(self):
191 _delete_files()
192
193 def setUp(self):
194 _delete_files()
195
Barry Warsaw3ca656f2001-11-13 20:16:52 +0000196def test_main():
Tim Petersd9fbf352002-01-30 07:32:53 +0000197 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000198 support.run_unittest(DumbDBMTestCase)
Tim Petersd9fbf352002-01-30 07:32:53 +0000199 finally:
200 _delete_files()
Barry Warsaw3ca656f2001-11-13 20:16:52 +0000201
202if __name__ == "__main__":
203 test_main()