Home | History | Annotate | Download | only in test
      1 #! /usr/bin/env python
      2 """Test script for the dumbdbm module
      3    Original by Roger E. Masse
      4 """
      5 
      6 import os
      7 import unittest
      8 import dumbdbm
      9 from test import test_support
     10 
     11 _fname = test_support.TESTFN
     12 
     13 def _delete_files():
     14     for ext in [".dir", ".dat", ".bak"]:
     15         try:
     16             os.unlink(_fname + ext)
     17         except OSError:
     18             pass
     19 
     20 class DumbDBMTestCase(unittest.TestCase):
     21     _dict = {'0': '',
     22              'a': 'Python:',
     23              'b': 'Programming',
     24              'c': 'the',
     25              'd': 'way',
     26              'f': 'Guido',
     27              'g': 'intended'
     28              }
     29 
     30     def __init__(self, *args):
     31         unittest.TestCase.__init__(self, *args)
     32 
     33     def test_dumbdbm_creation(self):
     34         f = dumbdbm.open(_fname, 'c')
     35         self.assertEqual(f.keys(), [])
     36         for key in self._dict:
     37             f[key] = self._dict[key]
     38         self.read_helper(f)
     39         f.close()
     40 
     41     def test_dumbdbm_creation_mode(self):
     42         # On platforms without chmod, don't do anything.
     43         if not (hasattr(os, 'chmod') and hasattr(os, 'umask')):
     44             return
     45 
     46         try:
     47             old_umask = os.umask(0002)
     48             f = dumbdbm.open(_fname, 'c', 0637)
     49             f.close()
     50         finally:
     51             os.umask(old_umask)
     52 
     53         expected_mode = 0635
     54         if os.name != 'posix':
     55             # Windows only supports setting the read-only attribute.
     56             # This shouldn't fail, but doesn't work like Unix either.
     57             expected_mode = 0666
     58 
     59         import stat
     60         st = os.stat(_fname + '.dat')
     61         self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
     62         st = os.stat(_fname + '.dir')
     63         self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
     64 
     65     def test_close_twice(self):
     66         f = dumbdbm.open(_fname)
     67         f['a'] = 'b'
     68         self.assertEqual(f['a'], 'b')
     69         f.close()
     70         f.close()
     71 
     72     def test_dumbdbm_modification(self):
     73         self.init_db()
     74         f = dumbdbm.open(_fname, 'w')
     75         self._dict['g'] = f['g'] = "indented"
     76         self.read_helper(f)
     77         f.close()
     78 
     79     def test_dumbdbm_read(self):
     80         self.init_db()
     81         f = dumbdbm.open(_fname, 'r')
     82         self.read_helper(f)
     83         f.close()
     84 
     85     def test_dumbdbm_keys(self):
     86         self.init_db()
     87         f = dumbdbm.open(_fname)
     88         keys = self.keys_helper(f)
     89         f.close()
     90 
     91     def test_write_write_read(self):
     92         # test for bug #482460
     93         f = dumbdbm.open(_fname)
     94         f['1'] = 'hello'
     95         f['1'] = 'hello2'
     96         f.close()
     97         f = dumbdbm.open(_fname)
     98         self.assertEqual(f['1'], 'hello2')
     99         f.close()
    100 
    101     def test_line_endings(self):
    102         # test for bug #1172763: dumbdbm would die if the line endings
    103         # weren't what was expected.
    104         f = dumbdbm.open(_fname)
    105         f['1'] = 'hello'
    106         f['2'] = 'hello2'
    107         f.close()
    108 
    109         # Mangle the file by adding \r before each newline
    110         data = open(_fname + '.dir').read()
    111         data = data.replace('\n', '\r\n')
    112         open(_fname + '.dir', 'wb').write(data)
    113 
    114         f = dumbdbm.open(_fname)
    115         self.assertEqual(f['1'], 'hello')
    116         self.assertEqual(f['2'], 'hello2')
    117 
    118 
    119     def read_helper(self, f):
    120         keys = self.keys_helper(f)
    121         for key in self._dict:
    122             self.assertEqual(self._dict[key], f[key])
    123 
    124     def init_db(self):
    125         f = dumbdbm.open(_fname, 'w')
    126         for k in self._dict:
    127             f[k] = self._dict[k]
    128         f.close()
    129 
    130     def keys_helper(self, f):
    131         keys = f.keys()
    132         keys.sort()
    133         dkeys = self._dict.keys()
    134         dkeys.sort()
    135         self.assertEqual(keys, dkeys)
    136         return keys
    137 
    138     # Perform randomized operations.  This doesn't make assumptions about
    139     # what *might* fail.
    140     def test_random(self):
    141         import random
    142         d = {}  # mirror the database
    143         for dummy in range(5):
    144             f = dumbdbm.open(_fname)
    145             for dummy in range(100):
    146                 k = random.choice('abcdefghijklm')
    147                 if random.random() < 0.2:
    148                     if k in d:
    149                         del d[k]
    150                         del f[k]
    151                 else:
    152                     v = random.choice('abc') * random.randrange(10000)
    153                     d[k] = v
    154                     f[k] = v
    155                     self.assertEqual(f[k], v)
    156             f.close()
    157 
    158             f = dumbdbm.open(_fname)
    159             expected = d.items()
    160             expected.sort()
    161             got = f.items()
    162             got.sort()
    163             self.assertEqual(expected, got)
    164             f.close()
    165 
    166     def tearDown(self):
    167         _delete_files()
    168 
    169     def setUp(self):
    170         _delete_files()
    171 
    172 def test_main():
    173     try:
    174         test_support.run_unittest(DumbDBMTestCase)
    175     finally:
    176         _delete_files()
    177 
    178 if __name__ == "__main__":
    179     test_main()
    180