/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1553.5.42 by Martin Pool
Start to parameterize LockableFiles test cases.
1
# Copyright (C) 2005, 2006 by Canonical Ltd
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
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.70.2 by Martin Pool
Fix funny mistake
17
from StringIO import StringIO
18
19
from bzrlib.branch import Branch
1185.65.29 by Robert Collins
Implement final review suggestions.
20
from bzrlib.errors import BzrBadParameterNotString, NoSuchFile, ReadOnlyError
1553.5.63 by Martin Pool
Lock type is now mandatory for LockableFiles constructor
21
from bzrlib.lockable_files import LockableFiles, TransportLock
1553.5.44 by Martin Pool
LockableFiles can now call LockDir directly
22
from bzrlib.lockdir import LockDir
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
23
from bzrlib.tests import TestCaseInTempDir
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
24
from bzrlib.transactions import (PassThroughTransaction,
25
                                 ReadOnlyTransaction,
26
                                 WriteTransaction,
27
                                 )
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
28
from bzrlib.transport import get_transport
1185.65.23 by Robert Collins
update tests somewhat
29
1553.5.42 by Martin Pool
Start to parameterize LockableFiles test cases.
30
31
# these tests are applied in each parameterized suite for LockableFiles
32
class _TestLockableFiles_mixin(object):
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
33
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
34
    def test_read_write(self):
1185.65.29 by Robert Collins
Implement final review suggestions.
35
        self.assertRaises(NoSuchFile, self.lockable.get, 'foo')
36
        self.assertRaises(NoSuchFile, self.lockable.get_utf8, 'foo')
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
37
        self.lockable.lock_write()
38
        try:
39
            unicode_string = u'bar\u1234'
40
            self.assertEqual(4, len(unicode_string))
41
            byte_string = unicode_string.encode('utf-8')
42
            self.assertEqual(6, len(byte_string))
43
            self.assertRaises(UnicodeEncodeError, self.lockable.put, 'foo', 
44
                              StringIO(unicode_string))
45
            self.lockable.put('foo', StringIO(byte_string))
46
            self.assertEqual(byte_string,
1185.65.29 by Robert Collins
Implement final review suggestions.
47
                             self.lockable.get('foo').read())
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
48
            self.assertEqual(unicode_string,
1185.65.29 by Robert Collins
Implement final review suggestions.
49
                             self.lockable.get_utf8('foo').read())
50
            self.assertRaises(BzrBadParameterNotString,
51
                              self.lockable.put_utf8,
52
                              'bar',
53
                              StringIO(unicode_string)
54
                              )
55
            self.lockable.put_utf8('bar', unicode_string)
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
56
            self.assertEqual(unicode_string, 
1185.65.29 by Robert Collins
Implement final review suggestions.
57
                             self.lockable.get_utf8('bar').read())
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
58
            self.assertEqual(byte_string, 
1185.65.29 by Robert Collins
Implement final review suggestions.
59
                             self.lockable.get('bar').read())
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
60
        finally:
61
            self.lockable.unlock()
62
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
63
    def test_locks(self):
1185.67.8 by Aaron Bentley
Test and fix read locks
64
        self.lockable.lock_read()
1185.65.27 by Robert Collins
Tweak storage towards mergability.
65
        try:
66
            self.assertRaises(ReadOnlyError, self.lockable.put, 'foo', 
67
                              StringIO('bar\u1234'))
68
        finally:
69
            self.lockable.unlock()
1185.68.1 by Aaron Bentley
test transactions
70
71
    def test_transactions(self):
72
        self.assertIs(self.lockable.get_transaction().__class__,
73
                      PassThroughTransaction)
74
        self.lockable.lock_read()
75
        try:
76
            self.assertIs(self.lockable.get_transaction().__class__,
77
                          ReadOnlyTransaction)
78
        finally:
79
            self.lockable.unlock()
80
        self.assertIs(self.lockable.get_transaction().__class__,
81
                      PassThroughTransaction)
82
        self.lockable.lock_write()
83
        self.assertIs(self.lockable.get_transaction().__class__,
1563.2.34 by Robert Collins
Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction
84
                      WriteTransaction)
1185.68.1 by Aaron Bentley
test transactions
85
        self.lockable.unlock()
1185.65.23 by Robert Collins
update tests somewhat
86
87
    def test__escape(self):
88
        self.assertEqual('%25', self.lockable._escape('%'))
89
        
90
    def test__escape_empty(self):
91
        self.assertEqual('', self.lockable._escape(''))
92
1553.5.42 by Martin Pool
Start to parameterize LockableFiles test cases.
93
94
# This method of adapting tests to parameters is different to 
95
# the TestProviderAdapters used elsewhere, but seems simpler for this 
96
# case.  
1553.5.45 by Martin Pool
Clean up Transport-based locks for old branches
97
class TestLockableFiles_TransportLock(TestCaseInTempDir,
98
                                      _TestLockableFiles_mixin):
1553.5.42 by Martin Pool
Start to parameterize LockableFiles test cases.
99
100
    def setUp(self):
1553.5.45 by Martin Pool
Clean up Transport-based locks for old branches
101
        super(TestLockableFiles_TransportLock, self).setUp()
1553.5.42 by Martin Pool
Start to parameterize LockableFiles test cases.
102
        transport = get_transport('.')
103
        transport.mkdir('.bzr')
1553.5.43 by Martin Pool
Get LockableFiles tests running against LockDir
104
        sub_transport = transport.clone('.bzr')
1553.5.63 by Martin Pool
Lock type is now mandatory for LockableFiles constructor
105
        self.lockable = LockableFiles(sub_transport, 'my-lock', TransportLock)
1553.5.61 by Martin Pool
Locks protecting LockableFiles must now be explicitly created before use.
106
        self.lockable.create_lock()
1553.5.43 by Martin Pool
Get LockableFiles tests running against LockDir
107
        
108
109
class TestLockableFiles_LockDir(TestCaseInTempDir,
110
                              _TestLockableFiles_mixin):
111
    """LockableFile tests run with LockDir underneath"""
112
113
    def setUp(self):
114
        super(TestLockableFiles_LockDir, self).setUp()
1553.5.61 by Martin Pool
Locks protecting LockableFiles must now be explicitly created before use.
115
        self.transport = get_transport('.')
116
        self.lockable = LockableFiles(self.transport, 'my-lock', LockDir)
117
        self.lockable.create_lock()
1553.5.43 by Martin Pool
Get LockableFiles tests running against LockDir
118
119
    def test_lock_is_lockdir(self):
120
        """Created instance should use a LockDir.
121
        
122
        This primarily tests the mixin adapter works properly.
123
        """
124
        ## self.assertIsInstance(self.lockable, LockableFiles)
125
        ## self.assertIsInstance(self.lockable._lock_strategy,
126
                              ## LockDirStrategy)
1553.5.60 by Martin Pool
New LockableFiles.create_lock() method
127
128
    def test_lock_created(self):
1553.5.61 by Martin Pool
Locks protecting LockableFiles must now be explicitly created before use.
129
        self.assertTrue(self.transport.has('my-lock'))
130
        self.lockable.lock_write()
131
        self.assertTrue(self.transport.has('my-lock/held/info'))
132
        self.lockable.unlock()
133
        self.assertFalse(self.transport.has('my-lock/held/info'))
134
        self.assertTrue(self.transport.has('my-lock'))
135
136
137
    # TODO: Test the lockdir inherits the right file and directory permissions
138
    # from the LockableFiles.