~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_hashcache.py

  • Committer: Patch Queue Manager
  • Date: 2016-02-01 19:56:05 UTC
  • mfrom: (6615.1.1 trunk)
  • Revision ID: pqm@pqm.ubuntu.com-20160201195605-o7rl92wf6uyum3fk
(vila) Open trunk again as 2.8b1 (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005-2011, 2016 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
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
16
16
 
17
17
import os
18
 
import sha
19
18
import stat
20
 
import sys
21
19
import time
22
20
 
 
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
26
 
 
27
 
 
28
 
def sha1(t):
29
 
    return sha.new(t).hexdigest()
 
24
from bzrlib.tests import (
 
25
    TestCaseInTempDir,
 
26
    )
 
27
from bzrlib.tests.features import (
 
28
    OsFifoFeature,
 
29
    )
 
30
 
 
31
 
 
32
sha1 = osutils.sha_string
30
33
 
31
34
 
32
35
def pause():
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)
58
61
 
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
63
66
        # so new
64
 
        self.assertEquals(hc.get_sha1('foo'), sha1('goodbye'))
 
67
        self.assertEqual(hc.get_sha1('foo'), sha1('goodbye'))
65
68
 
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)
69
72
 
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'))
74
77
        os.remove('foo')
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'))
78
81
 
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)
83
86
 
84
87
    def test_hashcache_load(self):
85
88
        hc = self.make_hashcache()
86
89
        self.build_tree_contents([('foo', 'contents')])
87
90
        pause()
88
 
        self.assertEquals(hc.get_sha1('foo'), sha1('contents'))
 
91
        self.assertEqual(hc.get_sha1('foo'), sha1('contents'))
89
92
        hc.write()
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)
93
96
 
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)
109
112
            hc.write()
110
113
            hc = self.reopen_hashcache()
111
114
 
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')
117
119
        os.mkfifo('a')
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
147
149
                10, 20,
148
150
                stat.S_IFREG | 0600)
149
151
 
150
 
    def _really_sha1_file(self, abspath):
 
152
    def _really_sha1_file(self, abspath, filters):
151
153
        if abspath in self._files:
152
154
            return sha1(self._files[abspath][0])
153
155
        else:
159
161
    def pretend_to_sleep(self, secs):
160
162
        self._clock += secs
161
163
 
162
 
    
 
164
 
163
165
class TestHashCacheFakeFilesystem(TestCaseInTempDir):
164
166
    """Tests the hashcache using a simulated OS.
165
167
    """
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)
181
183
 
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)
196
198
        # and again
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)
200
202
 
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)