~bzr-pqm/bzr/bzr.dev

846 by Martin Pool
- start adding refactored/simplified hash cache
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
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
17
import os
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
18
import sha
1185.38.8 by John Arbash Meinel
[patch] testhashcache delay for win32 and cygwin
19
import sys
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
20
import time
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
21
22
from bzrlib.errors import BzrError
23
from bzrlib.hashcache import HashCache
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
24
from bzrlib.tests import TestCaseInTempDir
846 by Martin Pool
- start adding refactored/simplified hash cache
25
26
27
def sha1(t):
28
    return sha.new(t).hexdigest()
29
30
31
def pause():
1275 by Martin Pool
- remove pauses from hashcache tests
32
    if False:
1390 by Robert Collins
pair programming worx... merge integration and weave
33
        return
1185.38.8 by John Arbash Meinel
[patch] testhashcache delay for win32 and cygwin
34
    if sys.platform in ('win32', 'cygwin'):
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
35
        time.sleep(3)
36
        return
846 by Martin Pool
- start adding refactored/simplified hash cache
37
    # allow it to stabilize
38
    start = int(time.time())
39
    while int(time.time()) == start:
40
        time.sleep(0.2)
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
41
42
43
class FixThisError(Exception):
44
    pass
846 by Martin Pool
- start adding refactored/simplified hash cache
45
    
46
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
47
class TestHashCache(TestCaseInTempDir):
1102 by Martin Pool
- merge test refactoring from robertc
48
49
    def test_hashcache(self):
50
        """Functional tests for hashcache"""
846 by Martin Pool
- start adding refactored/simplified hash cache
51
866 by Martin Pool
- use new path-based hashcache for WorkingTree- squash mtime/ctime to whole seconds- update and if necessary write out hashcache when WorkingTree object is created.
52
        # make a dummy bzr directory just to hold the cache
53
        os.mkdir('.bzr')
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
54
        hc = HashCache('.', '.bzr/stat-cache')
846 by Martin Pool
- start adding refactored/simplified hash 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')
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
68
        self.assertEquals(hc.miss_count, 1)
69
        self.assertEquals(hc.hit_count, 1)
846 by Martin Pool
- start adding refactored/simplified hash cache
70
71
        # check again without re-reading
72
        self.assertEquals(hc.get_sha1('foo'),
73
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
74
        self.assertEquals(hc.miss_count, 1)
75
        self.assertEquals(hc.hit_count, 2)
846 by Martin Pool
- start adding refactored/simplified hash cache
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')
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
82
        self.assertEquals(hc.miss_count, 2)
846 by Martin Pool
- start adding refactored/simplified hash cache
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'))
863 by Martin Pool
- more hashcache tests
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'))
846 by Martin Pool
- start adding refactored/simplified hash cache
99
100
        self.assertEquals(hc.get_sha1('subdir'), None)
848 by Martin Pool
doc
101
863 by Martin Pool
- more hashcache tests
102
        # it's likely neither are cached at the moment because they 
103
        # changed recently, but we can't be sure
861 by Martin Pool
- more hash-cache tests
104
        pause()
105
863 by Martin Pool
- more hashcache tests
106
        # should now be safe to cache it if we reread them
107
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
108
        self.assertEquals(len(hc._cache), 1)
863 by Martin Pool
- more hashcache tests
109
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
110
        self.assertEquals(len(hc._cache), 2)
861 by Martin Pool
- more hash-cache tests
111
112
        # write out, read back in and check that we don't need to
113
        # re-read any files
866 by Martin Pool
- use new path-based hashcache for WorkingTree- squash mtime/ctime to whole seconds- update and if necessary write out hashcache when WorkingTree object is created.
114
        hc.write()
861 by Martin Pool
- more hash-cache tests
115
        del hc
116
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
117
        hc = HashCache('.', '.bzr/stat-cache')
866 by Martin Pool
- use new path-based hashcache for WorkingTree- squash mtime/ctime to whole seconds- update and if necessary write out hashcache when WorkingTree object is created.
118
        hc.read()
862 by Martin Pool
- code to re-read hashcache from file
119
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
120
        self.assertEquals(len(hc._cache), 2)
862 by Martin Pool
- code to re-read hashcache from file
121
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
122
        self.assertEquals(hc.hit_count, 1)
123
        self.assertEquals(hc.miss_count, 0)
863 by Martin Pool
- more hashcache tests
124
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
125
126
    def test_hashcache_raise(self):
127
        """check that hashcache can raise BzrError"""
128
129
        os.mkdir('.bzr')
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
130
        hc = HashCache('.', '.bzr/stat-cache')
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
131
        ok = False
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
132
1185.33.108 by Denys Duchier
test_hashcache_raise: complain if no weird file type can be created
133
        # make a best effort to create a weird kind of file
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
134
        funcs = (os.mkfifo, os.mknod)
135
        for func in funcs:
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
136
            try:
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
137
                func('a')
1185.33.110 by Denys Duchier
test_hashcache_raise: minor space fix
138
                ok = True
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
139
                break
140
            except FixThisError:
141
                pass
142
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
143
        if ok:
1185.33.107 by Denys Duchier
simplified test_hashcache_raise as advised by jam
144
            self.assertRaises(BzrError, hc.get_sha1, 'a')
1185.33.108 by Denys Duchier
test_hashcache_raise: complain if no weird file type can be created
145
        else:
146
            raise BzrError("no weird file type could be created: extend this test case for your os")