/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5439.2.3 by John Arbash Meinel
Merge bzr.dev to resolve NEWS
1
# Copyright (C) 2007, 2009, 2010 Canonical Ltd
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
16
17
"""Tests for OS level locks."""
18
19
from bzrlib import (
2353.3.2 by John Arbash Meinel
Add a tests that multiple write locks raise the right kind of error.
20
    errors,
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
21
    osutils,
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
22
    )
23
4797.70.1 by Vincent Ladeuil
Skip chmodbits dependent tests when running as root
24
from bzrlib.tests import (features, UnicodeFilenameFeature)
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
25
from bzrlib.tests.per_lock import TestCaseWithLock
26
27
28
class TestLock(TestCaseWithLock):
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
29
30
    def setUp(self):
31
        super(TestLock, self).setUp()
32
        self.build_tree(['a-file'])
33
34
    def test_read_lock(self):
35
        """Smoke test for read locks."""
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
36
        a_lock = self.read_lock('a-file')
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
37
        self.addCleanup(a_lock.unlock)
38
        # The lock file should be opened for reading
39
        txt = a_lock.f.read()
40
        self.assertEqual('contents of a-file\n', txt)
41
42
    def test_create_if_needed_read(self):
43
        """We will create the file if it doesn't exist yet."""
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
44
        a_lock = self.read_lock('other-file')
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
45
        self.addCleanup(a_lock.unlock)
46
        txt = a_lock.f.read()
47
        self.assertEqual('', txt)
48
49
    def test_create_if_needed_write(self):
50
        """We will create the file if it doesn't exist yet."""
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
51
        a_lock = self.write_lock('other-file')
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
52
        self.addCleanup(a_lock.unlock)
53
        txt = a_lock.f.read()
54
        self.assertEqual('', txt)
2353.3.13 by John Arbash Meinel
Cleanup according to Alexander's review comments.
55
        a_lock.f.seek(0)
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
56
        a_lock.f.write('foo\n')
57
        a_lock.f.seek(0)
58
        txt = a_lock.f.read()
59
        self.assertEqual('foo\n', txt)
60
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
61
    def test_readonly_file(self):
62
        """If the file is readonly, we can take a read lock.
63
64
        But we shouldn't be able to take a write lock.
65
        """
4797.70.1 by Vincent Ladeuil
Skip chmodbits dependent tests when running as root
66
        self.requireFeature(features.not_running_as_root)
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
67
        osutils.make_readonly('a-file')
68
        # Make sure the file is read-only (on all platforms)
69
        self.assertRaises(IOError, open, 'a-file', 'rb+')
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
70
        a_lock = self.read_lock('a-file')
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
71
        a_lock.unlock()
72
2872.5.1 by Martin Pool
Avoid internal error tracebacks on failure to lock on readonly transport (#129701).
73
        self.assertRaises(errors.LockFailed, self.write_lock, 'a-file')
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
74
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
75
    def test_write_lock(self):
76
        """Smoke test for write locks."""
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
77
        a_lock = self.write_lock('a-file')
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
78
        self.addCleanup(a_lock.unlock)
79
        # You should be able to read and write to the lock file.
80
        txt = a_lock.f.read()
81
        self.assertEqual('contents of a-file\n', txt)
2353.3.6 by John Arbash Meinel
On Win32 if you have a file opened in read+write mode, you must call seek() when switching
82
        # Win32 requires that you call seek() when switching between a read
83
        # operation and a write operation.
84
        a_lock.f.seek(0, 2)
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
85
        a_lock.f.write('more content\n')
86
        a_lock.f.seek(0)
87
        txt = a_lock.f.read()
88
        self.assertEqual('contents of a-file\nmore content\n', txt)
89
90
    def test_multiple_read_locks(self):
91
        """You can take out more than one read lock on the same file."""
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
92
        a_lock = self.read_lock('a-file')
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
93
        self.addCleanup(a_lock.unlock)
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
94
        b_lock = self.read_lock('a-file')
2353.3.1 by John Arbash Meinel
Add some basic locking tests which should currently pass on all platforms.
95
        self.addCleanup(b_lock.unlock)
96
2353.3.2 by John Arbash Meinel
Add a tests that multiple write locks raise the right kind of error.
97
    def test_multiple_write_locks_exclude(self):
98
        """Taking out more than one write lock should fail."""
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
99
        a_lock = self.write_lock('a-file')
2353.3.2 by John Arbash Meinel
Add a tests that multiple write locks raise the right kind of error.
100
        self.addCleanup(a_lock.unlock)
101
        # Taking out a lock on a locked file should raise LockContention
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
102
        self.assertRaises(errors.LockContention, self.write_lock, 'a-file')
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
103
2363.3.3 by John Arbash Meinel
make Write locks not block on Read locks, so that revert tests don't fail
104
    def _disabled_test_read_then_write_excludes(self):
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
105
        """If a file is read-locked, taking out a write lock should fail."""
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
106
        a_lock = self.read_lock('a-file')
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
107
        self.addCleanup(a_lock.unlock)
108
        # Taking out a lock on a locked file should raise LockContention
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
109
        self.assertRaises(errors.LockContention, self.write_lock, 'a-file')
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
110
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
111
    def test_read_unlock_write(self):
112
        """Make sure that unlocking allows us to lock write"""
2353.4.2 by John Arbash Meinel
[merge] LockCleanup changes.
113
        a_lock = self.read_lock('a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
114
        a_lock.unlock()
2353.4.2 by John Arbash Meinel
[merge] LockCleanup changes.
115
        a_lock = self.write_lock('a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
116
        a_lock.unlock()
117
2363.3.2 by John Arbash Meinel
Disable read locks blocking on write locks.
118
    # TODO: jam 20070319 fcntl read locks are not currently fully
119
    #       mutually exclusive with write locks. This will be fixed
120
    #       in the next release.
121
    def _disabled_test_write_then_read_excludes(self):
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
122
        """If a file is write-locked, taking out a read lock should fail.
123
124
        The file is exclusively owned by the write lock, so we shouldn't be
125
        able to take out a shared read lock.
126
        """
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
127
        a_lock = self.write_lock('a-file')
2353.3.3 by John Arbash Meinel
Define an explicit error when trying to grab a write lock on a readonly file.
128
        self.addCleanup(a_lock.unlock)
129
        # Taking out a lock on a locked file should raise LockContention
2353.3.9 by John Arbash Meinel
Update the lock code and test code so that if more than one
130
        self.assertRaises(errors.LockContention, self.read_lock, 'a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
131
2363.3.3 by John Arbash Meinel
make Write locks not block on Read locks, so that revert tests don't fail
132
    # TODO: jam 20070319 fcntl write locks are not currently fully
133
    #       mutually exclusive with read locks. This will be fixed
134
    #       in the next release.
135
    def _disabled_test_write_unlock_read(self):
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
136
        """If we have removed the write lock, we can grab a read lock."""
2353.4.2 by John Arbash Meinel
[merge] LockCleanup changes.
137
        a_lock = self.write_lock('a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
138
        a_lock.unlock()
2353.4.2 by John Arbash Meinel
[merge] LockCleanup changes.
139
        a_lock = self.read_lock('a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
140
        a_lock.unlock()
141
2363.3.3 by John Arbash Meinel
make Write locks not block on Read locks, so that revert tests don't fail
142
    def _disabled_test_multiple_read_unlock_write(self):
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
143
        """We can only grab a write lock if all read locks are done."""
144
        a_lock = b_lock = c_lock = None
145
        try:
2353.4.2 by John Arbash Meinel
[merge] LockCleanup changes.
146
            a_lock = self.read_lock('a-file')
147
            b_lock = self.read_lock('a-file')
148
            self.assertRaises(errors.LockContention, self.write_lock, 'a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
149
            a_lock.unlock()
150
            a_lock = None
2353.4.2 by John Arbash Meinel
[merge] LockCleanup changes.
151
            self.assertRaises(errors.LockContention, self.write_lock, 'a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
152
            b_lock.unlock()
153
            b_lock = None
2353.4.2 by John Arbash Meinel
[merge] LockCleanup changes.
154
            c_lock = self.write_lock('a-file')
2353.4.1 by John Arbash Meinel
(broken) Change fcntl locks to be properly exclusive within the same process.
155
            c_lock.unlock()
156
            c_lock = None
157
        finally:
158
            # Cleanup as needed
159
            if a_lock is not None:
160
                a_lock.unlock()
161
            if b_lock is not None:
162
                b_lock.unlock()
163
            if c_lock is not None:
164
                c_lock.unlock()
4513.1.1 by Alexander Belchenko
improved unicode support for OS locks @ win32.
165
166
167
class TestLockUnicodePath(TestCaseWithLock):
168
169
    _test_needs_features = [UnicodeFilenameFeature]
170
171
    def test_read_lock(self):
172
        self.build_tree([u'\u1234'])
173
        u_lock = self.read_lock(u'\u1234')
174
        self.addCleanup(u_lock.unlock)
175
176
    def test_write_lock(self):
177
        self.build_tree([u'\u1234'])
178
        u_lock = self.write_lock(u'\u1234')
179
        self.addCleanup(u_lock.unlock)