42
39
def make_hashcache(self):
43
40
# make a dummy bzr directory just to hold the cache
45
hc = HashCache(u'.', '.bzr/stat-cache')
42
hc = HashCache('.', '.bzr/stat-cache')
48
45
def reopen_hashcache(self):
49
hc = HashCache(u'.', '.bzr/stat-cache')
46
hc = HashCache('.', '.bzr/stat-cache')
53
50
def test_hashcache_initial_miss(self):
54
51
"""Get correct hash from an empty hashcache"""
55
52
hc = self.make_hashcache()
56
self.build_tree_contents([('foo', b'hello')])
57
self.assertEqual(hc.get_sha1('foo'),
58
b'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
59
self.assertEqual(hc.miss_count, 1)
60
self.assertEqual(hc.hit_count, 0)
53
self.build_tree_contents([('foo', 'hello')])
54
self.assertEquals(hc.get_sha1('foo'),
55
'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
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
self.build_tree_contents([('foo', b'goodbye')])
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(b'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
self.build_tree_contents([('foo', b'goodbye')])
76
self.assertEqual(hc.get_sha1('foo'), sha1(b'goodbye'))
72
self.build_tree_contents([('foo', 'goodbye')])
73
self.assertEquals(hc.get_sha1('foo'), sha1('goodbye'))
78
self.assertEqual(hc.get_sha1('foo'), None)
79
self.build_tree_contents([('foo', b'new content')])
80
self.assertEqual(hc.get_sha1('foo'), sha1(b'new content'))
75
self.assertEquals(hc.get_sha1('foo'), None)
76
self.build_tree_contents([('foo', '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
self.build_tree_contents([('foo', b'contents')])
86
self.build_tree_contents([('foo', 'contents')])
91
self.assertEqual(hc.get_sha1('foo'), sha1(b'contents'))
88
self.assertEquals(hc.get_sha1('foo'), sha1('contents'))
93
90
hc = self.reopen_hashcache()
94
self.assertEqual(hc.get_sha1('foo'), sha1(b'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()
99
for i in range(10000):
100
with open('foo', 'wb') as f:
101
last_content = b'%08x' % i
96
for i in xrange(10000):
97
self.log('start writing at %s', time.time())
100
last_content = '%08x' % i
102
101
f.write(last_content)
103
104
last_sha1 = sha1(last_content)
104
105
self.log("iteration %d: %r -> %r",
105
106
i, last_content, last_sha1)
106
107
got_sha1 = hc.get_sha1('foo')
107
self.assertEqual(got_sha1, last_sha1)
108
self.assertEquals(got_sha1, last_sha1)
109
110
hc = self.reopen_hashcache()
169
169
def test_hashcache_miss_new_file(self):
170
170
"""A new file gives the right sha1 but misses"""
171
171
hc = self.make_hashcache()
172
hc.put_file('foo', b'hello')
173
self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
174
self.assertEqual(hc.miss_count, 1)
175
self.assertEqual(hc.hit_count, 0)
172
hc.put_file('foo', 'hello')
173
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
174
self.assertEquals(hc.miss_count, 1)
175
self.assertEquals(hc.hit_count, 0)
176
176
# if we try again it's still too new;
177
self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
178
self.assertEqual(hc.miss_count, 2)
179
self.assertEqual(hc.hit_count, 0)
177
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
178
self.assertEquals(hc.miss_count, 2)
179
self.assertEquals(hc.hit_count, 0)
181
181
def test_hashcache_old_file(self):
182
182
"""An old file gives the right sha1 and hits"""
183
183
hc = self.make_hashcache()
184
hc.put_file('foo', b'hello')
184
hc.put_file('foo', 'hello')
185
185
hc.pretend_to_sleep(20)
186
186
# file is new; should get the correct hash but miss
187
self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
188
self.assertEqual(hc.miss_count, 1)
189
self.assertEqual(hc.hit_count, 0)
187
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
188
self.assertEquals(hc.miss_count, 1)
189
self.assertEquals(hc.hit_count, 0)
190
190
# and can now be hit
191
self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
192
self.assertEqual(hc.miss_count, 1)
193
self.assertEqual(hc.hit_count, 1)
191
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
192
self.assertEquals(hc.miss_count, 1)
193
self.assertEquals(hc.hit_count, 1)
194
194
hc.pretend_to_sleep(3)
196
self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
197
self.assertEqual(hc.miss_count, 1)
198
self.assertEqual(hc.hit_count, 2)
196
self.assertEquals(hc.get_sha1('foo'), sha1('hello'))
197
self.assertEquals(hc.miss_count, 1)
198
self.assertEquals(hc.hit_count, 2)
200
200
def test_hashcache_invalidates(self):
201
201
hc = self.make_hashcache()
202
hc.put_file('foo', b'hello')
202
hc.put_file('foo', 'hello')
203
203
hc.pretend_to_sleep(20)
204
204
hc.get_sha1('foo')
205
hc.put_file('foo', b'h1llo')
206
self.assertEqual(hc.get_sha1('foo'), sha1(b'h1llo'))
207
self.assertEqual(hc.miss_count, 2)
208
self.assertEqual(hc.hit_count, 0)
205
hc.put_file('foo', 'h1llo')
206
self.assertEquals(hc.get_sha1('foo'), sha1('h1llo'))
207
self.assertEquals(hc.miss_count, 2)
208
self.assertEquals(hc.hit_count, 0)