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
17
from bzrlib.selftest import TestCaseInTempDir
22
from bzrlib.errors import BzrError
23
from bzrlib.hashcache import HashCache
24
from bzrlib.tests import TestCaseInTempDir, TestSkipped
28
23
return sha.new(t).hexdigest()
34
if sys.platform in ('win32', 'cygwin'):
37
# allow it to stabilize
38
start = int(time.time())
39
while int(time.time()) == start:
43
class FixThisError(Exception):
28
# enable this to get more accurate testing
30
# allow it to stabilize
31
start = int(time.time())
32
while int(time.time()) == start:
47
36
class TestHashCache(TestCaseInTempDir):
49
38
def test_hashcache(self):
50
39
"""Functional tests for hashcache"""
40
from bzrlib.hashcache import HashCache
52
43
# make a dummy bzr directory just to hold the cache
54
hc = HashCache('.', '.bzr/stat-cache')
56
47
file('foo', 'wb').write('hello')
65
56
# check we hit without re-reading
66
57
self.assertEquals(hc.get_sha1('foo'),
67
58
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
68
self.assertEquals(hc.miss_count, 1)
69
self.assertEquals(hc.hit_count, 1)
59
##self.assertEquals(hc.miss_count, 1)
60
##self.assertEquals(hc.hit_count, 1)
71
62
# check again without re-reading
72
63
self.assertEquals(hc.get_sha1('foo'),
73
64
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
74
self.assertEquals(hc.miss_count, 1)
75
self.assertEquals(hc.hit_count, 2)
65
##self.assertEquals(hc.miss_count, 1)
66
##self.assertEquals(hc.hit_count, 2)
77
68
# write new file and make sure it is seen
78
69
file('foo', 'wb').write('goodbye')
80
71
self.assertEquals(hc.get_sha1('foo'),
81
72
'3c8ec4874488f6090a157b014ce3397ca8e06d4f')
82
self.assertEquals(hc.miss_count, 2)
73
##self.assertEquals(hc.miss_count, 2)
84
75
# quickly write new file of same size and make sure it is seen
85
76
# this may rely on detection of timestamps that are too close
100
91
self.assertEquals(hc.get_sha1('subdir'), None)
102
# pause briefly to make sure they're not treated as new uncacheable
93
# it's likely neither are cached at the moment because they
94
# changed recently, but we can't be sure
97
# should now be safe to cache it if we reread them
106
98
self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
99
##self.assertEquals(len(hc._cache), 1)
107
100
self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
101
##self.assertEquals(len(hc._cache), 2)
109
103
# write out, read back in and check that we don't need to
110
104
# re-read any files
114
hc = HashCache('.', '.bzr/stat-cache')
117
self.assertEquals(len(hc._cache), 2)
111
##self.assertEquals(len(hc._cache), 2)
118
112
self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
119
self.assertEquals(hc.hit_count, 1)
120
self.assertEquals(hc.miss_count, 0)
113
##self.assertEquals(hc.hit_count, 1)
114
##self.assertEquals(hc.miss_count, 0)
121
115
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')