15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
from bzrlib.selftest import TestCaseInTempDir
22
from bzrlib.errors import BzrError
23
from bzrlib.hashcache import HashCache
24
from bzrlib.tests import TestCaseInTempDir, TestSkipped
25
28
return sha.new(t).hexdigest()
34
if sys.platform in ('win32', 'cygwin'):
34
37
# allow it to stabilize
35
38
start = int(time.time())
36
39
while int(time.time()) == start:
43
class FixThisError(Exception):
40
47
class TestHashCache(TestCaseInTempDir):
42
49
def test_hashcache(self):
43
50
"""Functional tests for hashcache"""
44
from bzrlib.hashcache import HashCache
47
52
# make a dummy bzr directory just to hold the cache
54
hc = HashCache('.', '.bzr/stat-cache')
51
56
file('foo', 'wb').write('hello')
60
65
# check we hit without re-reading
61
66
self.assertEquals(hc.get_sha1('foo'),
62
67
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
63
##self.assertEquals(hc.miss_count, 1)
64
##self.assertEquals(hc.hit_count, 1)
68
self.assertEquals(hc.miss_count, 1)
69
self.assertEquals(hc.hit_count, 1)
66
71
# check again without re-reading
67
72
self.assertEquals(hc.get_sha1('foo'),
68
73
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
69
##self.assertEquals(hc.miss_count, 1)
70
##self.assertEquals(hc.hit_count, 2)
74
self.assertEquals(hc.miss_count, 1)
75
self.assertEquals(hc.hit_count, 2)
72
77
# write new file and make sure it is seen
73
78
file('foo', 'wb').write('goodbye')
75
80
self.assertEquals(hc.get_sha1('foo'),
76
81
'3c8ec4874488f6090a157b014ce3397ca8e06d4f')
77
##self.assertEquals(hc.miss_count, 2)
82
self.assertEquals(hc.miss_count, 2)
79
84
# quickly write new file of same size and make sure it is seen
80
85
# this may rely on detection of timestamps that are too close
95
100
self.assertEquals(hc.get_sha1('subdir'), None)
97
# it's likely neither are cached at the moment because they
98
# changed recently, but we can't be sure
102
# pause briefly to make sure they're not treated as new uncacheable
101
# should now be safe to cache it if we reread them
102
106
self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
103
##self.assertEquals(len(hc._cache), 1)
104
107
self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
105
##self.assertEquals(len(hc._cache), 2)
107
109
# write out, read back in and check that we don't need to
108
110
# re-read any files
114
hc = HashCache('.', '.bzr/stat-cache')
115
##self.assertEquals(len(hc._cache), 2)
117
self.assertEquals(len(hc._cache), 2)
116
118
self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
117
##self.assertEquals(hc.hit_count, 1)
118
##self.assertEquals(hc.miss_count, 0)
119
self.assertEquals(hc.hit_count, 1)
120
self.assertEquals(hc.miss_count, 0)
119
121
self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
123
def test_hashcache_raise(self):
124
"""check that hashcache can raise BzrError"""
127
hc = HashCache('.', '.bzr/stat-cache')
130
# make a best effort to create a weird kind of file
131
funcs = (getattr(os, 'mkfifo', None), getattr(os, 'mknod', None))
143
self.assertRaises(BzrError, hc.get_sha1, 'a')
145
raise TestSkipped('No weird file type could be created')