~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_hashcache.py

  • Committer: Aaron Bentley
  • Date: 2006-04-07 22:46:52 UTC
  • mfrom: (1645 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1727.
  • Revision ID: aaron.bentley@utoronto.ca-20060407224652-4925bc3735b926f8
Merged latest bzr.dev

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