~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
1185.38.8 by John Arbash Meinel
[patch] testhashcache delay for win32 and cygwin
18
import sys
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
19
import time
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
20
from bzrlib.tests import TestCaseInTempDir
846 by Martin Pool
- start adding refactored/simplified hash cache
21
22
23
24
def sha1(t):
25
    import sha
26
    return sha.new(t).hexdigest()
27
28
29
def pause():
1275 by Martin Pool
- remove pauses from hashcache tests
30
    if False:
1390 by Robert Collins
pair programming worx... merge integration and weave
31
        return
1185.38.8 by John Arbash Meinel
[patch] testhashcache delay for win32 and cygwin
32
    if sys.platform in ('win32', 'cygwin'):
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
33
        time.sleep(3)
34
        return
846 by Martin Pool
- start adding refactored/simplified hash cache
35
    # allow it to stabilize
36
    start = int(time.time())
37
    while int(time.time()) == start:
38
        time.sleep(0.2)
39
    
40
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
41
class TestHashCache(TestCaseInTempDir):
1102 by Martin Pool
- merge test refactoring from robertc
42
43
    def test_hashcache(self):
44
        """Functional tests for hashcache"""
846 by Martin Pool
- start adding refactored/simplified hash cache
45
        from bzrlib.hashcache import HashCache
46
        import os
47
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.
48
        # make a dummy bzr directory just to hold the cache
49
        os.mkdir('.bzr')
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
50
        hc = HashCache(u'.')
846 by Martin Pool
- start adding refactored/simplified hash cache
51
52
        file('foo', 'wb').write('hello')
53
        os.mkdir('subdir')
54
        pause()
55
56
        self.assertEquals(hc.get_sha1('foo'),
57
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
58
        self.assertEquals(hc.miss_count, 1)
59
        self.assertEquals(hc.hit_count, 0)
60
61
        # check we hit without re-reading
62
        self.assertEquals(hc.get_sha1('foo'),
63
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
64
        self.assertEquals(hc.miss_count, 1)
65
        self.assertEquals(hc.hit_count, 1)
846 by Martin Pool
- start adding refactored/simplified hash cache
66
67
        # check again without re-reading
68
        self.assertEquals(hc.get_sha1('foo'),
69
                          'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
70
        self.assertEquals(hc.miss_count, 1)
71
        self.assertEquals(hc.hit_count, 2)
846 by Martin Pool
- start adding refactored/simplified hash cache
72
73
        # write new file and make sure it is seen
74
        file('foo', 'wb').write('goodbye')
75
        pause()
76
        self.assertEquals(hc.get_sha1('foo'),
77
                          '3c8ec4874488f6090a157b014ce3397ca8e06d4f')
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
78
        self.assertEquals(hc.miss_count, 2)
846 by Martin Pool
- start adding refactored/simplified hash cache
79
80
        # quickly write new file of same size and make sure it is seen
81
        # this may rely on detection of timestamps that are too close
82
        # together to be safe
83
        file('foo', 'wb').write('g00dbye')
84
        self.assertEquals(hc.get_sha1('foo'),
85
                          sha1('g00dbye'))
863 by Martin Pool
- more hashcache tests
86
87
        file('foo2', 'wb').write('other file')
88
        self.assertEquals(hc.get_sha1('foo2'), sha1('other file'))
89
90
        os.remove('foo2')
91
        self.assertEquals(hc.get_sha1('foo2'), None)
92
93
        file('foo2', 'wb').write('new content')
94
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
846 by Martin Pool
- start adding refactored/simplified hash cache
95
96
        self.assertEquals(hc.get_sha1('subdir'), None)
848 by Martin Pool
doc
97
863 by Martin Pool
- more hashcache tests
98
        # it's likely neither are cached at the moment because they 
99
        # changed recently, but we can't be sure
861 by Martin Pool
- more hash-cache tests
100
        pause()
101
863 by Martin Pool
- more hashcache tests
102
        # should now be safe to cache it if we reread them
103
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
104
        self.assertEquals(len(hc._cache), 1)
863 by Martin Pool
- more hashcache tests
105
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
106
        self.assertEquals(len(hc._cache), 2)
861 by Martin Pool
- more hash-cache tests
107
108
        # write out, read back in and check that we don't need to
109
        # 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.
110
        hc.write()
861 by Martin Pool
- more hash-cache tests
111
        del hc
112
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
113
        hc = HashCache(u'.')
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.read()
862 by Martin Pool
- code to re-read hashcache from file
115
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
116
        self.assertEquals(len(hc._cache), 2)
862 by Martin Pool
- code to re-read hashcache from file
117
        self.assertEquals(hc.get_sha1('foo'), sha1('g00dbye'))
1185.60.5 by Aaron Bentley
Reactivated hashcache tests
118
        self.assertEquals(hc.hit_count, 1)
119
        self.assertEquals(hc.miss_count, 0)
863 by Martin Pool
- more hashcache tests
120
        self.assertEquals(hc.get_sha1('foo2'), sha1('new content'))