symbian-qemu-0.9.1-12/python-2.6.1/Lib/test/test_dumbdbm.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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()