~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-07-03 18:27:35 UTC
  • mto: This revision was merged to the branch mainline in revision 1851.
  • Revision ID: john@arbash-meinel.com-20060703182735-3081f13e92d7f657
WorkingTree.open_containing() was directly calling os.getcwdu(), which on mac returns the wrong normalization, and on win32 would have the wrong slashes

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
import os
 
18
import sha
 
19
import sys
18
20
import time
19
 
from bzrlib.selftest import TestCaseInTempDir
20
21
 
 
22
from bzrlib.errors import BzrError
 
23
from bzrlib.hashcache import HashCache
 
24
from bzrlib.tests import TestCaseInTempDir, TestSkipped
21
25
 
22
26
 
23
27
def sha1(t):
24
 
    import sha
25
28
    return sha.new(t).hexdigest()
26
29
 
27
30
 
28
31
def pause():
29
32
    if False:
30
33
        return
31
 
    if os.name == 'nt':
 
34
    if sys.platform in ('win32', 'cygwin'):
32
35
        time.sleep(3)
33
36
        return
34
37
    # allow it to stabilize
35
38
    start = int(time.time())
36
39
    while int(time.time()) == start:
37
40
        time.sleep(0.2)
 
41
 
 
42
 
 
43
class FixThisError(Exception):
 
44
    pass
38
45
    
39
46
 
40
47
class TestHashCache(TestCaseInTempDir):
41
48
 
42
49
    def test_hashcache(self):
43
50
        """Functional tests for hashcache"""
44
 
        from bzrlib.hashcache import HashCache
45
 
        import os
46
51
 
47
52
        # make a dummy bzr directory just to hold the cache
48
53
        os.mkdir('.bzr')
49
 
        hc = HashCache('.')
 
54
        hc = HashCache('.', '.bzr/stat-cache')
50
55
 
51
56
        file('foo', 'wb').write('hello')
52
57
        os.mkdir('subdir')
60
65
        # check we hit without re-reading
61
66
        self.assertEquals(hc.get_sha1('foo'),
62
67
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
63
 
        ##self.assertEquals(hc.miss_count, 1)
64
 
        ##self.assertEquals(hc.hit_count, 1)
 
68
        self.assertEquals(hc.miss_count, 1)
 
69
        self.assertEquals(hc.hit_count, 1)
65
70
 
66
71
        # check again without re-reading
67
72
        self.assertEquals(hc.get_sha1('foo'),
68
73
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
69
 
        ##self.assertEquals(hc.miss_count, 1)
70
 
        ##self.assertEquals(hc.hit_count, 2)
 
74
        self.assertEquals(hc.miss_count, 1)
 
75
        self.assertEquals(hc.hit_count, 2)
71
76
 
72
77
        # write new file and make sure it is seen
73
78
        file('foo', 'wb').write('goodbye')
74
79
        pause()
75
80
        self.assertEquals(hc.get_sha1('foo'),
76
81
                          '3c8ec4874488f6090a157b014ce3397ca8e06d4f')
77
 
        ##self.assertEquals(hc.miss_count, 2)
 
82
        self.assertEquals(hc.miss_count, 2)
78
83
 
79
84
        # quickly write new file of same size and make sure it is seen
80
85
        # this may rely on detection of timestamps that are too close
94
99
 
95
100
        self.assertEquals(hc.get_sha1('subdir'), None)
96
101
 
97
 
        # it's likely neither are cached at the moment because they 
98
 
        # changed recently, but we can't be sure
 
102
        # pause briefly to make sure they're not treated as new uncacheable
 
103
        # files
99
104
        pause()
100
105
 
101
 
        # should now be safe to cache it if we reread them
102
106
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
103
 
        ##self.assertEquals(len(hc._cache), 1)
104
107
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
105
 
        ##self.assertEquals(len(hc._cache), 2)
106
108
 
107
109
        # write out, read back in and check that we don't need to
108
110
        # re-read any files
109
111
        hc.write()
110
112
        del hc
111
113
 
112
 
        hc = HashCache('.')
 
114
        hc = HashCache('.', '.bzr/stat-cache')
113
115
        hc.read()
114
116
 
115
 
        ##self.assertEquals(len(hc._cache), 2)
 
117
        self.assertEquals(len(hc._cache), 2)
116
118
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
117
 
        ##self.assertEquals(hc.hit_count, 1)
118
 
        ##self.assertEquals(hc.miss_count, 0)
 
119
        self.assertEquals(hc.hit_count, 1)
 
120
        self.assertEquals(hc.miss_count, 0)
119
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')