~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_hashcache.py

  • Committer: Ian Clatworthy
  • Date: 2007-03-22 01:02:07 UTC
  • mto: (2370.2.1 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 2371.
  • Revision ID: ian.clatworthy@internode.on.net-20070322010207-r8xcwjshipoahmcx
Minor corrections to HACKING

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011, 2016 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
import os
 
18
import sha
18
19
import stat
 
20
import sys
19
21
import time
20
22
 
21
 
from bzrlib import osutils
22
23
from bzrlib.errors import BzrError
23
24
from bzrlib.hashcache import HashCache
24
 
from bzrlib.tests import (
25
 
    TestCaseInTempDir,
26
 
    )
27
 
from bzrlib.tests.features import (
28
 
    OsFifoFeature,
29
 
    )
30
 
 
31
 
 
32
 
sha1 = osutils.sha_string
 
25
from bzrlib.tests import TestCaseInTempDir, TestSkipped, TestCase
 
26
 
 
27
 
 
28
def sha1(t):
 
29
    return sha.new(t).hexdigest()
33
30
 
34
31
 
35
32
def pause():
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)
61
58
 
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
66
63
        # so new
67
 
        self.assertEqual(hc.get_sha1('foo'), sha1('goodbye'))
 
64
        self.assertEquals(hc.get_sha1('foo'), sha1('goodbye'))
68
65
 
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)
72
69
 
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'))
77
74
        os.remove('foo')
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'))
81
78
 
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)
86
83
 
87
84
    def test_hashcache_load(self):
88
85
        hc = self.make_hashcache()
89
86
        self.build_tree_contents([('foo', 'contents')])
90
87
        pause()
91
 
        self.assertEqual(hc.get_sha1('foo'), sha1('contents'))
 
88
        self.assertEquals(hc.get_sha1('foo'), sha1('contents'))
92
89
        hc.write()
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)
96
93
 
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)
112
109
            hc.write()
113
110
            hc = self.reopen_hashcache()
114
111
 
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')
119
117
        os.mkfifo('a')
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
149
147
                10, 20,
150
148
                stat.S_IFREG | 0600)
151
149
 
152
 
    def _really_sha1_file(self, abspath, filters):
 
150
    def _really_sha1_file(self, abspath):
153
151
        if abspath in self._files:
154
152
            return sha1(self._files[abspath][0])
155
153
        else:
161
159
    def pretend_to_sleep(self, secs):
162
160
        self._clock += secs
163
161
 
164
 
 
 
162
    
165
163
class TestHashCacheFakeFilesystem(TestCaseInTempDir):
166
164
    """Tests the hashcache using a simulated OS.
167
165
    """
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)
183
181
 
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)
198
196
        # and again
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)
202
200
 
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)