~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_hashcache.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-05-17 08:50:40 UTC
  • mfrom: (1704.2.18 bzr.mbp.integration)
  • Revision ID: pqm@pqm.ubuntu.com-20060517085040-ee6e33957c557fba
(mbp) merge 0.8 fixes; fix #32587

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, TestSkipped
 
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
        # pause briefly to make sure they're not treated as new uncacheable
 
103
        # files
 
104
        pause()
 
105
 
 
106
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
 
107
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
 
108
 
 
109
        # write out, read back in and check that we don't need to
 
110
        # re-read any files
 
111
        hc.write()
 
112
        del hc
 
113
 
 
114
        hc = HashCache('.', '.bzr/stat-cache')
 
115
        hc.read()
 
116
 
 
117
        self.assertEquals(len(hc._cache), 2)
 
118
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
 
119
        self.assertEquals(hc.hit_count, 1)
 
120
        self.assertEquals(hc.miss_count, 0)
 
121
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
 
122
 
 
123
    def test_hashcache_raise(self):
 
124
        """check that hashcache can raise BzrError"""
 
125
 
 
126
        os.mkdir('.bzr')
 
127
        hc = HashCache('.', '.bzr/stat-cache')
 
128
        ok = False
 
129
 
 
130
        # make a best effort to create a weird kind of file
 
131
        funcs = (getattr(os, 'mkfifo', None), getattr(os, 'mknod', None))
 
132
        for func in funcs:
 
133
            if func is None:
 
134
                continue
 
135
            try:
 
136
                func('a')
 
137
                ok = True
 
138
                break
 
139
            except FixThisError:
 
140
                pass
 
141
 
 
142
        if ok:
 
143
            self.assertRaises(BzrError, hc.get_sha1, 'a')
 
144
        else:
 
145
            raise TestSkipped('No weird file type could be created')