~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
1551.2.40 by abentley
Fix hashcache test
24
from bzrlib.tests import TestCaseInTempDir, TestSkipped
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
1551.2.40 by abentley
Fix hashcache test
131
        funcs = (getattr(os, 'mkfifo', None), getattr(os, 'mknod', None))
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
132
        for func in funcs:
1551.2.40 by abentley
Fix hashcache test
133
            if func is None:
134
                continue
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
135
            try:
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
136
                func('a')
1185.33.110 by Denys Duchier
test_hashcache_raise: minor space fix
137
                ok = True
1185.33.109 by Denys Duchier
test_hashcache: catch no exceptions
138
                break
139
            except FixThisError:
140
                pass
141
1185.33.106 by Denys Duchier
check that hashcache can raise BzrError
142
        if ok:
1185.33.107 by Denys Duchier
simplified test_hashcache_raise as advised by jam
143
            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
144
        else:
1551.2.40 by abentley
Fix hashcache test
145
            raise TestSkipped('No weird file type could be created')