~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
1616.1.1 by Martin Pool
[merge] robertc
102
        # pause briefly to make sure they're not treated as new uncacheable
103
        # files
861 by Martin Pool
- more hash-cache tests
104
        pause()
105
863 by Martin Pool
- more hashcache tests
106
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
107
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
861 by Martin Pool
- more hash-cache tests
108
109
        # write out, read back in and check that we don't need to
110
        # 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.
111
        hc.write()
861 by Martin Pool
- more hash-cache tests
112
        del hc
113
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
114
        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.
115
        hc.read()
862 by Martin Pool
- code to re-read hashcache from file
116
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
117
        self.assertEquals(len(hc._cache), 2)
862 by Martin Pool
- code to re-read hashcache from file
118
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
119
        self.assertEquals(hc.hit_count, 1)
120
        self.assertEquals(hc.miss_count, 0)
863 by Martin Pool
- more hashcache tests
121
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
122
123
    def test_hashcache_raise(self):
124
        """check that hashcache can raise BzrError"""
125
126
        os.mkdir('.bzr')
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
127
        hc = HashCache('.', '.bzr/stat-cache')
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
128
        ok = False
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
129
1185.33.108 by Denys Duchier
test_hashcache_raise: complain if no weird file type can be created
130
        # make a best effort to create a weird kind of file
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
131
        funcs = (os.mkfifo, os.mknod)
132
        for func in funcs:
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
133
            try:
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
134
                func('a')
1185.33.110 by Denys Duchier
test_hashcache_raise: minor space fix
135
                ok = True
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
136
                break
137
            except FixThisError:
138
                pass
139
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
140
        if ok:
1185.33.107 by Denys Duchier
simplified test_hashcache_raise as advised by jam
141
            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
142
        else:
143
            raise BzrError("no weird file type could be created: extend this test case for your os")