~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_hashcache.py

  • Committer: John Arbash Meinel
  • Date: 2006-03-08 14:31:23 UTC
  • mfrom: (1598 +trunk)
  • mto: (1685.1.1 bzr-encoding)
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: john@arbash-meinel.com-20060308143123-448308b0db4de410
[merge] bzr.dev 1573, lots of updates

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# (C) 2005 Canonical Ltd
 
2
 
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
 
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
 
 
13
# You should have received a copy of the GNU General Public License
 
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
 
16
 
 
17
import os
 
18
import sha
 
19
import sys
 
20
import time
 
21
 
 
22
from bzrlib.errors import BzrError
 
23
from bzrlib.hashcache import HashCache
 
24
from bzrlib.tests import TestCaseInTempDir
 
25
 
 
26
 
 
27
def sha1(t):
 
28
    return sha.new(t).hexdigest()
 
29
 
 
30
 
 
31
def pause():
 
32
    if False:
 
33
        return
 
34
    if sys.platform in ('win32', 'cygwin'):
 
35
        time.sleep(3)
 
36
        return
 
37
    # allow it to stabilize
 
38
    start = int(time.time())
 
39
    while int(time.time()) == start:
 
40
        time.sleep(0.2)
 
41
 
 
42
 
 
43
class FixThisError(Exception):
 
44
    pass
 
45
    
 
46
 
 
47
class TestHashCache(TestCaseInTempDir):
 
48
 
 
49
    def test_hashcache(self):
 
50
        """Functional tests for hashcache"""
 
51
 
 
52
        # make a dummy bzr directory just to hold the cache
 
53
        os.mkdir('.bzr')
 
54
        hc = HashCache('.', '.bzr/stat-cache')
 
55
 
 
56
        file('foo', 'wb').write('hello')
 
57
        os.mkdir('subdir')
 
58
        pause()
 
59
 
 
60
        self.assertEquals(hc.get_sha1('foo'),
 
61
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
 
62
        self.assertEquals(hc.miss_count, 1)
 
63
        self.assertEquals(hc.hit_count, 0)
 
64
 
 
65
        # check we hit without re-reading
 
66
        self.assertEquals(hc.get_sha1('foo'),
 
67
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
 
68
        self.assertEquals(hc.miss_count, 1)
 
69
        self.assertEquals(hc.hit_count, 1)
 
70
 
 
71
        # check again without re-reading
 
72
        self.assertEquals(hc.get_sha1('foo'),
 
73
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
 
74
        self.assertEquals(hc.miss_count, 1)
 
75
        self.assertEquals(hc.hit_count, 2)
 
76
 
 
77
        # write new file and make sure it is seen
 
78
        file('foo', 'wb').write('goodbye')
 
79
        pause()
 
80
        self.assertEquals(hc.get_sha1('foo'),
 
81
                          '3c8ec4874488f6090a157b014ce3397ca8e06d4f')
 
82
        self.assertEquals(hc.miss_count, 2)
 
83
 
 
84
        # quickly write new file of same size and make sure it is seen
 
85
        # this may rely on detection of timestamps that are too close
 
86
        # together to be safe
 
87
        file('foo', 'wb').write('g00dbye')
 
88
        self.assertEquals(hc.get_sha1('foo'),
 
89
                          sha1('g00dbye'))
 
90
 
 
91
        file('foo2', 'wb').write('other file')
 
92
        self.assertEquals(hc.get_sha1('foo2'), sha1('other file'))
 
93
 
 
94
        os.remove('foo2')
 
95
        self.assertEquals(hc.get_sha1('foo2'), None)
 
96
 
 
97
        file('foo2', 'wb').write('new content')
 
98
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
 
99
 
 
100
        self.assertEquals(hc.get_sha1('subdir'), None)
 
101
 
 
102
        # it's likely neither are cached at the moment because they 
 
103
        # changed recently, but we can't be sure
 
104
        pause()
 
105
 
 
106
        # should now be safe to cache it if we reread them
 
107
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
 
108
        self.assertEquals(len(hc._cache), 1)
 
109
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
 
110
        self.assertEquals(len(hc._cache), 2)
 
111
 
 
112
        # write out, read back in and check that we don't need to
 
113
        # re-read any files
 
114
        hc.write()
 
115
        del hc
 
116
 
 
117
        hc = HashCache('.', '.bzr/stat-cache')
 
118
        hc.read()
 
119
 
 
120
        self.assertEquals(len(hc._cache), 2)
 
121
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
 
122
        self.assertEquals(hc.hit_count, 1)
 
123
        self.assertEquals(hc.miss_count, 0)
 
124
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
 
125
 
 
126
    def test_hashcache_raise(self):
 
127
        """check that hashcache can raise BzrError"""
 
128
 
 
129
        os.mkdir('.bzr')
 
130
        hc = HashCache('.', '.bzr/stat-cache')
 
131
        ok = False
 
132
 
 
133
        # make a best effort to create a weird kind of file
 
134
        funcs = (os.mkfifo, os.mknod)
 
135
        for func in funcs:
 
136
            try:
 
137
                func('a')
 
138
                ok = True
 
139
                break
 
140
            except FixThisError:
 
141
                pass
 
142
 
 
143
        if ok:
 
144
            self.assertRaises(BzrError, hc.get_sha1, 'a')
 
145
        else:
 
146
            raise BzrError("no weird file type could be created: extend this test case for your os")