58
56
self.assertEquals(hc.miss_count, 1)
59
57
self.assertEquals(hc.hit_count, 0)
61
def test_hashcache_hit_old_file(self):
62
"""An old file gives a cache hit"""
63
return ### this takes too long to run properly; skipped
64
hc = self.make_hashcache()
65
self.build_tree_contents([('foo', 'hello')])
66
pause() # make sure file's old enough to cache
67
self.assertEquals(hc.get_sha1('foo'),
68
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
69
self.assertEquals(hc.miss_count, 1)
70
self.assertEquals(hc.hit_count, 0)
71
# now should hit on second try
72
self.assertEquals(hc.get_sha1('foo'),
73
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
74
self.assertEquals(hc.miss_count, 1)
75
self.assertEquals(hc.hit_count, 1)
76
# and hit again on third try
77
self.assertEquals(hc.get_sha1('foo'),
78
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
79
self.assertEquals(hc.miss_count, 1)
80
self.assertEquals(hc.hit_count, 2)
82
59
def test_hashcache_new_file(self):
83
60
hc = self.make_hashcache()
84
61
self.build_tree_contents([('foo', 'goodbye')])
143
120
# such combinations don't usually occur for the filesystem where
144
121
# people test bzr.
145
122
self.assertRaises(BzrError, hc.get_sha1, 'a')
125
class FakeHashCache(HashCache):
126
"""Hashcache that consults a fake clock rather than the real one.
128
This lets us examine how old or new files would be handled, without
129
actually having to wait for time to pass.
132
# set root and cache file name to none to make sure we won't touch the
134
HashCache.__init__(self, '.', 'hashcache')
136
# simulated clock running forward as operations happen
139
def put_file(self, filename, file_contents):
140
abspath = './' + filename
141
self._files[abspath] = (file_contents, self._clock)
143
def _fingerprint(self, abspath):
144
entry = self._files[abspath]
145
return (len(entry[0]),
150
def _really_sha1_file(self, abspath):
151
if abspath in self._files:
152
return sha1(self._files[abspath][0])
156
def _cutoff_time(self):
157
return self._clock - 2
159
def pretend_to_sleep(self, secs):
163
class TestHashCacheFakeFilesystem(TestCaseInTempDir):
164
"""Tests the hashcache using a simulated OS.
167
def make_hashcache(self):
168
return FakeHashCache()
170
def test_hashcache_miss_new_file(self):
171
"""A new file gives the right sha1 but misses"""
172
hc = self.make_hashcache()
173
hc.put_file('foo', 'hello')
174
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
175
self.assertEquals(hc.miss_count, 1)
176
self.assertEquals(hc.hit_count, 0)
177
# if we try again it's still too new;
178
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
179
self.assertEquals(hc.miss_count, 2)
180
self.assertEquals(hc.hit_count, 0)
182
def test_hashcache_old_file(self):
183
"""An old file gives the right sha1 and hits"""
184
hc = self.make_hashcache()
185
hc.put_file('foo', 'hello')
186
hc.pretend_to_sleep(20)
187
# file is new; should get the correct hash but miss
188
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
189
self.assertEquals(hc.miss_count, 1)
190
self.assertEquals(hc.hit_count, 0)
192
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
193
self.assertEquals(hc.miss_count, 1)
194
self.assertEquals(hc.hit_count, 1)
195
hc.pretend_to_sleep(3)
197
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
198
self.assertEquals(hc.miss_count, 1)
199
self.assertEquals(hc.hit_count, 2)
201
def test_hashcache_invalidates(self):
202
hc = self.make_hashcache()
203
hc.put_file('foo', 'hello')
204
hc.pretend_to_sleep(20)
206
hc.put_file('foo', 'h1llo')
207
self.assertEquals(hc.get_sha1('foo'), sha1('h1llo'))
208
self.assertEquals(hc.miss_count, 2)
209
self.assertEquals(hc.hit_count, 0)