13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
from bzrlib import osutils
23
22
from bzrlib.errors import BzrError
24
23
from bzrlib.hashcache import HashCache
25
from bzrlib.tests import TestCaseInTempDir, TestSkipped, TestCase
29
return sha.new(t).hexdigest()
24
from bzrlib.tests import (
27
from bzrlib.tests.features import (
32
sha1 = osutils.sha_string
51
54
"""Get correct hash from an empty hashcache"""
52
55
hc = self.make_hashcache()
53
56
self.build_tree_contents([('foo', 'hello')])
54
self.assertEquals(hc.get_sha1('foo'),
57
self.assertEqual(hc.get_sha1('foo'),
55
58
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
56
self.assertEquals(hc.miss_count, 1)
57
self.assertEquals(hc.hit_count, 0)
59
self.assertEqual(hc.miss_count, 1)
60
self.assertEqual(hc.hit_count, 0)
59
62
def test_hashcache_new_file(self):
60
63
hc = self.make_hashcache()
61
64
self.build_tree_contents([('foo', 'goodbye')])
62
65
# now read without pausing; it may not be possible to cache it as its
64
self.assertEquals(hc.get_sha1('foo'), sha1('goodbye'))
67
self.assertEqual(hc.get_sha1('foo'), sha1('goodbye'))
66
69
def test_hashcache_nonexistent_file(self):
67
70
hc = self.make_hashcache()
68
self.assertEquals(hc.get_sha1('no-name-yet'), None)
71
self.assertEqual(hc.get_sha1('no-name-yet'), None)
70
73
def test_hashcache_replaced_file(self):
71
74
hc = self.make_hashcache()
72
75
self.build_tree_contents([('foo', 'goodbye')])
73
self.assertEquals(hc.get_sha1('foo'), sha1('goodbye'))
76
self.assertEqual(hc.get_sha1('foo'), sha1('goodbye'))
75
self.assertEquals(hc.get_sha1('foo'), None)
78
self.assertEqual(hc.get_sha1('foo'), None)
76
79
self.build_tree_contents([('foo', 'new content')])
77
self.assertEquals(hc.get_sha1('foo'), sha1('new content'))
80
self.assertEqual(hc.get_sha1('foo'), sha1('new content'))
79
82
def test_hashcache_not_file(self):
80
83
hc = self.make_hashcache()
81
84
self.build_tree(['subdir/'])
82
self.assertEquals(hc.get_sha1('subdir'), None)
85
self.assertEqual(hc.get_sha1('subdir'), None)
84
87
def test_hashcache_load(self):
85
88
hc = self.make_hashcache()
86
89
self.build_tree_contents([('foo', 'contents')])
88
self.assertEquals(hc.get_sha1('foo'), sha1('contents'))
91
self.assertEqual(hc.get_sha1('foo'), sha1('contents'))
90
93
hc = self.reopen_hashcache()
91
self.assertEquals(hc.get_sha1('foo'), sha1('contents'))
92
self.assertEquals(hc.hit_count, 1)
94
self.assertEqual(hc.get_sha1('foo'), sha1('contents'))
95
self.assertEqual(hc.hit_count, 1)
94
97
def test_hammer_hashcache(self):
95
98
hc = self.make_hashcache()
105
108
self.log("iteration %d: %r -> %r",
106
109
i, last_content, last_sha1)
107
110
got_sha1 = hc.get_sha1('foo')
108
self.assertEquals(got_sha1, last_sha1)
111
self.assertEqual(got_sha1, last_sha1)
110
113
hc = self.reopen_hashcache()
112
115
def test_hashcache_raise(self):
113
116
"""check that hashcache can raise BzrError"""
117
self.requireFeature(OsFifoFeature)
114
118
hc = self.make_hashcache()
115
if getattr(os, 'mkfifo', None) is None:
116
raise TestSkipped('filesystem fifos not supported on this system')
118
120
# It's possible that the system supports fifos but the filesystem
119
121
# can't. In that case we should skip at this point. But in fact
171
173
"""A new file gives the right sha1 but misses"""
172
174
hc = self.make_hashcache()
173
175
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)
176
self.assertEqual(hc.get_sha1('foo'), sha1('hello'))
177
self.assertEqual(hc.miss_count, 1)
178
self.assertEqual(hc.hit_count, 0)
179
# if we try again it's still too new;
180
self.assertEqual(hc.get_sha1('foo'), sha1('hello'))
181
self.assertEqual(hc.miss_count, 2)
182
self.assertEqual(hc.hit_count, 0)
182
184
def test_hashcache_old_file(self):
183
185
"""An old file gives the right sha1 and hits"""
185
187
hc.put_file('foo', 'hello')
186
188
hc.pretend_to_sleep(20)
187
189
# 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)
190
self.assertEqual(hc.get_sha1('foo'), sha1('hello'))
191
self.assertEqual(hc.miss_count, 1)
192
self.assertEqual(hc.hit_count, 0)
191
193
# and can now be hit
192
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
193
self.assertEquals(hc.miss_count, 1)
194
self.assertEquals(hc.hit_count, 1)
194
self.assertEqual(hc.get_sha1('foo'), sha1('hello'))
195
self.assertEqual(hc.miss_count, 1)
196
self.assertEqual(hc.hit_count, 1)
195
197
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)
199
self.assertEqual(hc.get_sha1('foo'), sha1('hello'))
200
self.assertEqual(hc.miss_count, 1)
201
self.assertEqual(hc.hit_count, 2)
201
203
def test_hashcache_invalidates(self):
202
204
hc = self.make_hashcache()
204
206
hc.pretend_to_sleep(20)
205
207
hc.get_sha1('foo')
206
208
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)
209
self.assertEqual(hc.get_sha1('foo'), sha1('h1llo'))
210
self.assertEqual(hc.miss_count, 2)
211
self.assertEqual(hc.hit_count, 0)