~bzr-pqm/bzr/bzr.dev

1711.8.5 by John Arbash Meinel
Move the new locking tests into their own files, and move the helper functions into a test helper.
1
# Copyright (C) 2005, 2006 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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1711.8.5 by John Arbash Meinel
Move the new locking tests into their own files, and move the helper functions into a test helper.
16
17
"""Helper functions/classes for testing locking"""
18
19
from bzrlib import errors
4634.85.11 by Andrew Bennetts
Suppress most errors from Branch.unlock too.
20
from bzrlib.decorators import only_raises
1711.8.5 by John Arbash Meinel
Move the new locking tests into their own files, and move the helper functions into a test helper.
21
22
23
class TestPreventLocking(errors.LockError):
24
    """A test exception for forcing locking failure: %(message)s"""
25
26
27
class LockWrapper(object):
28
    """A wrapper which lets us set locking ability.
29
30
    This also lets us record what objects were locked in what order,
31
    to ensure that locking happens correctly.
32
    """
33
34
    def __init__(self, sequence, other, other_id):
35
        """Wrap a locking policy around a given object.
36
37
        :param sequence: A list object where we should record actions
38
        :param other: The object to control policy on
39
        :param other_id: Something to identify the object by
40
        """
41
        self.__dict__['_sequence'] = sequence
42
        self.__dict__['_other'] = other
43
        self.__dict__['_other_id'] = other_id
44
        self.__dict__['_allow_write'] = True
45
        self.__dict__['_allow_read'] = True
46
        self.__dict__['_allow_unlock'] = True
47
4288.1.11 by Robert Collins
Hopefully fix locking tests to match the new code (and still be good statements of intent).
48
    def __eq__(self, other):
49
        # Branch objects look for controlfiles == repo.controlfiles.
4288.1.12 by Robert Collins
Review feedback.
50
        if type(other) is LockWrapper:
4288.1.11 by Robert Collins
Hopefully fix locking tests to match the new code (and still be good statements of intent).
51
            return self._other == other._other
52
        return False
53
1711.8.5 by John Arbash Meinel
Move the new locking tests into their own files, and move the helper functions into a test helper.
54
    def __getattr__(self, attr):
55
        return getattr(self._other, attr)
56
57
    def __setattr__(self, attr, val):
58
        return setattr(self._other, attr, val)
59
60
    def lock_read(self):
61
        self._sequence.append((self._other_id, 'lr', self._allow_read))
62
        if self._allow_read:
63
            return self._other.lock_read()
64
        raise TestPreventLocking('lock_read disabled')
65
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
66
    def lock_write(self, token=None):
1711.8.5 by John Arbash Meinel
Move the new locking tests into their own files, and move the helper functions into a test helper.
67
        self._sequence.append((self._other_id, 'lw', self._allow_write))
68
        if self._allow_write:
69
            return self._other.lock_write()
70
        raise TestPreventLocking('lock_write disabled')
71
4634.85.11 by Andrew Bennetts
Suppress most errors from Branch.unlock too.
72
    @only_raises(errors.LockNotHeld, errors.LockBroken)
1711.8.5 by John Arbash Meinel
Move the new locking tests into their own files, and move the helper functions into a test helper.
73
    def unlock(self):
74
        self._sequence.append((self._other_id, 'ul', self._allow_unlock))
75
        if self._allow_unlock:
76
            return self._other.unlock()
77
        raise TestPreventLocking('unlock disabled')
78
79
    def disable_lock_read(self):
80
        """Make a lock_read call fail"""
81
        self.__dict__['_allow_read'] = False
82
83
    def disable_unlock(self):
84
        """Make an unlock call fail"""
85
        self.__dict__['_allow_unlock'] = False
86
87
    def disable_lock_write(self):
88
        """Make a lock_write call fail"""
89
        self.__dict__['_allow_write'] = False
90
91