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