~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_hashcache.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
from bzrlib.selftest import TestCaseInTempDir
 
17
import os
 
18
import sha
 
19
import sys
 
20
import time
18
21
 
 
22
from bzrlib.errors import BzrError
 
23
from bzrlib.hashcache import HashCache
 
24
from bzrlib.tests import TestCaseInTempDir
19
25
 
20
26
 
21
27
def sha1(t):
22
 
    import sha
23
28
    return sha.new(t).hexdigest()
24
29
 
25
30
 
26
31
def pause():
27
 
    import time
 
32
    if False:
 
33
        return
 
34
    if sys.platform in ('win32', 'cygwin'):
 
35
        time.sleep(3)
 
36
        return
28
37
    # allow it to stabilize
29
38
    start = int(time.time())
30
39
    while int(time.time()) == start:
31
40
        time.sleep(0.2)
 
41
 
 
42
 
 
43
class FixThisError(Exception):
 
44
    pass
32
45
    
33
46
 
34
47
class TestHashCache(TestCaseInTempDir):
35
48
 
36
49
    def test_hashcache(self):
37
50
        """Functional tests for hashcache"""
38
 
        from bzrlib.hashcache import HashCache
39
 
        import os
40
51
 
41
52
        # make a dummy bzr directory just to hold the cache
42
53
        os.mkdir('.bzr')
43
 
        hc = HashCache('.')
 
54
        hc = HashCache('.', '.bzr/stat-cache')
44
55
 
45
56
        file('foo', 'wb').write('hello')
46
57
        os.mkdir('subdir')
88
99
 
89
100
        self.assertEquals(hc.get_sha1('subdir'), None)
90
101
 
91
 
        # it's likely neither are cached at the moment because they 
92
 
        # changed recently, but we can't be sure
 
102
        # pause briefly to make sure they're not treated as new uncacheable
 
103
        # files
93
104
        pause()
94
105
 
95
 
        # should now be safe to cache it if we reread them
96
106
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
97
 
        self.assertEquals(len(hc._cache), 1)
98
107
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
99
 
        self.assertEquals(len(hc._cache), 2)
100
108
 
101
109
        # write out, read back in and check that we don't need to
102
110
        # re-read any files
103
111
        hc.write()
104
112
        del hc
105
113
 
106
 
        hc = HashCache('.')
 
114
        hc = HashCache('.', '.bzr/stat-cache')
107
115
        hc.read()
108
116
 
109
117
        self.assertEquals(len(hc._cache), 2)
111
119
        self.assertEquals(hc.hit_count, 1)
112
120
        self.assertEquals(hc.miss_count, 0)
113
121
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
 
122
 
 
123
    def test_hashcache_raise(self):
 
124
        """check that hashcache can raise BzrError"""
 
125
 
 
126
        os.mkdir('.bzr')
 
127
        hc = HashCache('.', '.bzr/stat-cache')
 
128
        ok = False
 
129
 
 
130
        # make a best effort to create a weird kind of file
 
131
        funcs = (os.mkfifo, os.mknod)
 
132
        for func in funcs:
 
133
            try:
 
134
                func('a')
 
135
                ok = True
 
136
                break
 
137
            except FixThisError:
 
138
                pass
 
139
 
 
140
        if ok:
 
141
            self.assertRaises(BzrError, hc.get_sha1, 'a')
 
142
        else:
 
143
            raise BzrError("no weird file type could be created: extend this test case for your os")