/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2005-2011, 2016 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
846 by Martin Pool
- start adding refactored/simplified hash cache
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
846 by Martin Pool
- start adding refactored/simplified hash cache
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
846 by Martin Pool
- start adding refactored/simplified hash cache
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
846 by Martin Pool
- start adding refactored/simplified hash cache
16
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
17
import os
1845.1.3 by Martin Pool
Improvements to hashcache testing:
18
import stat
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
19
import time
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
20
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
21
from .. import osutils
22
from ..errors import BzrError
23
from ..hashcache import HashCache
24
from . import (
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
25
    TestCaseInTempDir,
26
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
27
from .features import (
5579.3.1 by Jelmer Vernooij
Remove unused imports.
28
    OsFifoFeature,
29
    )
846 by Martin Pool
- start adding refactored/simplified hash cache
30
31
5849.1.1 by Jelmer Vernooij
Use osutils.sha_string() when possible.
32
sha1 = osutils.sha_string
846 by Martin Pool
- start adding refactored/simplified hash cache
33
34
35
def pause():
1845.1.2 by mbp at sourcefrog
Use larger time window on hashcache to be safe with fractional times
36
    time.sleep(5.0)
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
37
38
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
39
class TestHashCache(TestCaseInTempDir):
1845.1.3 by Martin Pool
Improvements to hashcache testing:
40
    """Test the hashcache against a real directory"""
1102 by Martin Pool
- merge test refactoring from robertc
41
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
42
    def make_hashcache(self):
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.
43
        # make a dummy bzr directory just to hold the cache
44
        os.mkdir('.bzr')
6621.18.2 by Martin
Make bzrlib.hashcache python 3 compatible
45
        hc = HashCache(u'.', '.bzr/stat-cache')
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
46
        return hc
47
48
    def reopen_hashcache(self):
6621.18.2 by Martin
Make bzrlib.hashcache python 3 compatible
49
        hc = HashCache(u'.', '.bzr/stat-cache')
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
50
        hc.read()
51
        return hc
52
53
    def test_hashcache_initial_miss(self):
54
        """Get correct hash from an empty hashcache"""
55
        hc = self.make_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
56
        self.build_tree_contents([('foo', b'hello')])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
57
        self.assertEqual(hc.get_sha1('foo'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
58
                         b'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
59
        self.assertEqual(hc.miss_count, 1)
60
        self.assertEqual(hc.hit_count, 0)
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
61
62
    def test_hashcache_new_file(self):
63
        hc = self.make_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
64
        self.build_tree_contents([('foo', b'goodbye')])
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
65
        # now read without pausing; it may not be possible to cache it as its
66
        # so new
6813.3.1 by Martin
Make hashcache pass tests on Python 3
67
        self.assertEqual(hc.get_sha1('foo'), sha1(b'goodbye'))
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
68
69
    def test_hashcache_nonexistent_file(self):
70
        hc = self.make_hashcache()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
71
        self.assertEqual(hc.get_sha1('no-name-yet'), None)
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
72
73
    def test_hashcache_replaced_file(self):
74
        hc = self.make_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
75
        self.build_tree_contents([('foo', b'goodbye')])
76
        self.assertEqual(hc.get_sha1('foo'), sha1(b'goodbye'))
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
77
        os.remove('foo')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
78
        self.assertEqual(hc.get_sha1('foo'), None)
6813.3.1 by Martin
Make hashcache pass tests on Python 3
79
        self.build_tree_contents([('foo', b'new content')])
80
        self.assertEqual(hc.get_sha1('foo'), sha1(b'new content'))
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
81
82
    def test_hashcache_not_file(self):
83
        hc = self.make_hashcache()
84
        self.build_tree(['subdir/'])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
85
        self.assertEqual(hc.get_sha1('subdir'), None)
848 by Martin Pool
doc
86
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
87
    def test_hashcache_load(self):
88
        hc = self.make_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
89
        self.build_tree_contents([('foo', b'contents')])
861 by Martin Pool
- more hash-cache tests
90
        pause()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
91
        self.assertEqual(hc.get_sha1('foo'), sha1(b'contents'))
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.
92
        hc.write()
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
93
        hc = self.reopen_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
94
        self.assertEqual(hc.get_sha1('foo'), sha1(b'contents'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
95
        self.assertEqual(hc.hit_count, 1)
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
96
97
    def test_hammer_hashcache(self):
98
        hc = self.make_hashcache()
6651.2.2 by Martin
Apply 2to3 xrange fix and fix up with sixish range
99
        for i in range(10000):
6813.3.1 by Martin
Make hashcache pass tests on Python 3
100
            with open('foo', 'wb') as f:
101
                last_content = b'%08x' % i
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
102
                f.write(last_content)
1845.1.2 by mbp at sourcefrog
Use larger time window on hashcache to be safe with fractional times
103
            last_sha1 = sha1(last_content)
104
            self.log("iteration %d: %r -> %r",
105
                     i, last_content, last_sha1)
106
            got_sha1 = hc.get_sha1('foo')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
107
            self.assertEqual(got_sha1, last_sha1)
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
108
            hc.write()
109
            hc = self.reopen_hashcache()
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
110
111
    def test_hashcache_raise(self):
112
        """check that hashcache can raise BzrError"""
2949.5.2 by Alexander Belchenko
John's review
113
        self.requireFeature(OsFifoFeature)
1845.1.1 by mbp at sourcefrog
Refactor and improve hashcache tests
114
        hc = self.make_hashcache()
1845.1.2 by mbp at sourcefrog
Use larger time window on hashcache to be safe with fractional times
115
        os.mkfifo('a')
116
        # It's possible that the system supports fifos but the filesystem
117
        # can't.  In that case we should skip at this point.  But in fact
118
        # such combinations don't usually occur for the filesystem where
119
        # people test bzr.
120
        self.assertRaises(BzrError, hc.get_sha1, 'a')
1845.1.3 by Martin Pool
Improvements to hashcache testing:
121
122
123
class FakeHashCache(HashCache):
124
    """Hashcache that consults a fake clock rather than the real one.
125
126
    This lets us examine how old or new files would be handled, without
127
    actually having to wait for time to pass.
128
    """
7143.15.2 by Jelmer Vernooij
Run autopep8.
129
1845.1.3 by Martin Pool
Improvements to hashcache testing:
130
    def __init__(self):
131
        # set root and cache file name to none to make sure we won't touch the
132
        # real filesystem
6621.18.2 by Martin
Make bzrlib.hashcache python 3 compatible
133
        HashCache.__init__(self, u'.', 'hashcache')
1845.1.3 by Martin Pool
Improvements to hashcache testing:
134
        self._files = {}
135
        # simulated clock running forward as operations happen
136
        self._clock = 0
137
138
    def put_file(self, filename, file_contents):
139
        abspath = './' + filename
140
        self._files[abspath] = (file_contents, self._clock)
141
2012.1.7 by Aaron Bentley
Get tree._iter_changed down to ~ 1 stat per file
142
    def _fingerprint(self, abspath, fs=None):
1845.1.3 by Martin Pool
Improvements to hashcache testing:
143
        entry = self._files[abspath]
144
        return (len(entry[0]),
145
                entry[1], entry[1],
146
                10, 20,
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
147
                stat.S_IFREG | 0o600)
1845.1.3 by Martin Pool
Improvements to hashcache testing:
148
3368.2.4 by Ian Clatworthy
make content filter lookup a tree responsibility
149
    def _really_sha1_file(self, abspath, filters):
1845.1.3 by Martin Pool
Improvements to hashcache testing:
150
        if abspath in self._files:
151
            return sha1(self._files[abspath][0])
152
        else:
153
            return None
154
155
    def _cutoff_time(self):
156
        return self._clock - 2
157
158
    def pretend_to_sleep(self, secs):
159
        self._clock += secs
160
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
161
1845.1.3 by Martin Pool
Improvements to hashcache testing:
162
class TestHashCacheFakeFilesystem(TestCaseInTempDir):
163
    """Tests the hashcache using a simulated OS.
164
    """
165
166
    def make_hashcache(self):
167
        return FakeHashCache()
168
169
    def test_hashcache_miss_new_file(self):
170
        """A new file gives the right sha1 but misses"""
171
        hc = self.make_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
172
        hc.put_file('foo', b'hello')
173
        self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
174
        self.assertEqual(hc.miss_count, 1)
175
        self.assertEqual(hc.hit_count, 0)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
176
        # if we try again it's still too new;
6813.3.1 by Martin
Make hashcache pass tests on Python 3
177
        self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
178
        self.assertEqual(hc.miss_count, 2)
179
        self.assertEqual(hc.hit_count, 0)
1845.1.3 by Martin Pool
Improvements to hashcache testing:
180
181
    def test_hashcache_old_file(self):
182
        """An old file gives the right sha1 and hits"""
183
        hc = self.make_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
184
        hc.put_file('foo', b'hello')
1845.1.3 by Martin Pool
Improvements to hashcache testing:
185
        hc.pretend_to_sleep(20)
186
        # file is new; should get the correct hash but miss
6813.3.1 by Martin
Make hashcache pass tests on Python 3
187
        self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
188
        self.assertEqual(hc.miss_count, 1)
189
        self.assertEqual(hc.hit_count, 0)
1845.1.3 by Martin Pool
Improvements to hashcache testing:
190
        # and can now be hit
6813.3.1 by Martin
Make hashcache pass tests on Python 3
191
        self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
192
        self.assertEqual(hc.miss_count, 1)
193
        self.assertEqual(hc.hit_count, 1)
1845.1.3 by Martin Pool
Improvements to hashcache testing:
194
        hc.pretend_to_sleep(3)
195
        # and again
6813.3.1 by Martin
Make hashcache pass tests on Python 3
196
        self.assertEqual(hc.get_sha1('foo'), sha1(b'hello'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
197
        self.assertEqual(hc.miss_count, 1)
198
        self.assertEqual(hc.hit_count, 2)
1845.1.3 by Martin Pool
Improvements to hashcache testing:
199
200
    def test_hashcache_invalidates(self):
201
        hc = self.make_hashcache()
6813.3.1 by Martin
Make hashcache pass tests on Python 3
202
        hc.put_file('foo', b'hello')
1845.1.3 by Martin Pool
Improvements to hashcache testing:
203
        hc.pretend_to_sleep(20)
204
        hc.get_sha1('foo')
6813.3.1 by Martin
Make hashcache pass tests on Python 3
205
        hc.put_file('foo', b'h1llo')
206
        self.assertEqual(hc.get_sha1('foo'), sha1(b'h1llo'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
207
        self.assertEqual(hc.miss_count, 2)
208
        self.assertEqual(hc.hit_count, 0)