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 | ||
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 19 | import bzrlib | 
| 1185.70.2
by Martin Pool Fix funny mistake | 20 | from bzrlib.branch import Branch | 
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 21 | import bzrlib.errors as errors | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 22 | from bzrlib.errors import BzrBadParameterNotString, NoSuchFile, ReadOnlyError | 
| 1553.5.63
by Martin Pool Lock type is now mandatory for LockableFiles constructor | 23 | from bzrlib.lockable_files import LockableFiles, TransportLock | 
| 1553.5.44
by Martin Pool LockableFiles can now call LockDir directly | 24 | from bzrlib.lockdir import LockDir | 
| 1185.67.4
by Aaron Bentley Throw if we try to write to a LockableFiles with no write lock | 25 | from bzrlib.tests import TestCaseInTempDir | 
| 1594.2.22
by Robert Collins Ensure that lockable files calls finish() on transactions.: | 26 | from bzrlib.tests.test_transactions import DummyWeave | 
| 1563.2.34
by Robert Collins Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction | 27 | from bzrlib.transactions import (PassThroughTransaction, | 
| 28 | ReadOnlyTransaction, | |
| 29 | WriteTransaction, | |
| 30 |                                  )
 | |
| 1185.67.4
by Aaron Bentley Throw if we try to write to a LockableFiles with no write lock | 31 | from bzrlib.transport import get_transport | 
| 1185.65.23
by Robert Collins update tests somewhat | 32 | |
| 1553.5.42
by Martin Pool Start to parameterize LockableFiles test cases. | 33 | |
| 34 | # these tests are applied in each parameterized suite for LockableFiles
 | |
| 35 | class _TestLockableFiles_mixin(object): | |
| 1185.67.4
by Aaron Bentley Throw if we try to write to a LockableFiles with no write lock | 36 | |
| 1185.67.6
by Aaron Bentley Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile | 37 | def test_read_write(self): | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 38 | self.assertRaises(NoSuchFile, self.lockable.get, 'foo') | 
| 39 | self.assertRaises(NoSuchFile, self.lockable.get_utf8, 'foo') | |
| 1185.67.6
by Aaron Bentley Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile | 40 | self.lockable.lock_write() | 
| 41 | try: | |
| 42 | unicode_string = u'bar\u1234' | |
| 43 | self.assertEqual(4, len(unicode_string)) | |
| 44 | byte_string = unicode_string.encode('utf-8') | |
| 45 | self.assertEqual(6, len(byte_string)) | |
| 46 | self.assertRaises(UnicodeEncodeError, self.lockable.put, 'foo', | |
| 47 | StringIO(unicode_string)) | |
| 48 | self.lockable.put('foo', StringIO(byte_string)) | |
| 49 | self.assertEqual(byte_string, | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 50 | self.lockable.get('foo').read()) | 
| 1185.67.6
by Aaron Bentley Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile | 51 | self.assertEqual(unicode_string, | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 52 | self.lockable.get_utf8('foo').read()) | 
| 53 | self.assertRaises(BzrBadParameterNotString, | |
| 54 | self.lockable.put_utf8, | |
| 55 | 'bar', | |
| 56 | StringIO(unicode_string) | |
| 57 |                               )
 | |
| 58 | self.lockable.put_utf8('bar', unicode_string) | |
| 1185.67.6
by Aaron Bentley Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile | 59 | self.assertEqual(unicode_string, | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 60 | self.lockable.get_utf8('bar').read()) | 
| 1185.67.6
by Aaron Bentley Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile | 61 | self.assertEqual(byte_string, | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 62 | self.lockable.get('bar').read()) | 
| 1185.67.6
by Aaron Bentley Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile | 63 | finally: | 
| 64 | self.lockable.unlock() | |
| 65 | ||
| 1185.67.4
by Aaron Bentley Throw if we try to write to a LockableFiles with no write lock | 66 | def test_locks(self): | 
| 1185.67.8
by Aaron Bentley Test and fix read locks | 67 | self.lockable.lock_read() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 68 | try: | 
| 69 | self.assertRaises(ReadOnlyError, self.lockable.put, 'foo', | |
| 70 | StringIO('bar\u1234')) | |
| 71 | finally: | |
| 72 | self.lockable.unlock() | |
| 1185.68.1
by Aaron Bentley test transactions | 73 | |
| 74 | def test_transactions(self): | |
| 75 | self.assertIs(self.lockable.get_transaction().__class__, | |
| 76 | PassThroughTransaction) | |
| 77 | self.lockable.lock_read() | |
| 78 | try: | |
| 79 | self.assertIs(self.lockable.get_transaction().__class__, | |
| 80 | ReadOnlyTransaction) | |
| 81 | finally: | |
| 82 | self.lockable.unlock() | |
| 83 | self.assertIs(self.lockable.get_transaction().__class__, | |
| 84 | PassThroughTransaction) | |
| 85 | self.lockable.lock_write() | |
| 86 | 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 | 87 | WriteTransaction) | 
| 1594.2.22
by Robert Collins Ensure that lockable files calls finish() on transactions.: | 88 |         # check that finish is called:
 | 
| 89 | vf = DummyWeave('a') | |
| 90 | self.lockable.get_transaction().register_dirty(vf) | |
| 1185.68.1
by Aaron Bentley test transactions | 91 | self.lockable.unlock() | 
| 1594.2.22
by Robert Collins Ensure that lockable files calls finish() on transactions.: | 92 | self.assertTrue(vf.finished) | 
| 1185.65.23
by Robert Collins update tests somewhat | 93 | |
| 94 | def test__escape(self): | |
| 95 | self.assertEqual('%25', self.lockable._escape('%')) | |
| 96 | ||
| 97 | def test__escape_empty(self): | |
| 98 | self.assertEqual('', self.lockable._escape('')) | |
| 99 | ||
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 100 | def test_break_lock(self): | 
| 101 |         # some locks are not breakable
 | |
| 102 | self.lockable.lock_write() | |
| 103 | try: | |
| 104 | self.assertRaises(AssertionError, self.lockable.break_lock) | |
| 105 | except NotImplementedError: | |
| 106 |             # this lock cannot be broken
 | |
| 107 | self.lockable.unlock() | |
| 108 |             return
 | |
| 109 | l2 = self.get_lockable() | |
| 110 | orig_factory = bzrlib.ui.ui_factory | |
| 111 |         # silent ui - no need for stdout
 | |
| 112 | bzrlib.ui.ui_factory = bzrlib.ui.SilentUIFactory() | |
| 113 | bzrlib.ui.ui_factory.stdin = StringIO("y\n") | |
| 114 | try: | |
| 115 | l2.break_lock() | |
| 116 | finally: | |
| 117 | bzrlib.ui.ui_factory = orig_factory | |
| 118 | try: | |
| 119 | l2.lock_write() | |
| 120 | l2.unlock() | |
| 121 | finally: | |
| 122 | self.assertRaises(errors.LockBroken, self.lockable.unlock) | |
| 123 | self.assertFalse(self.lockable.is_locked()) | |
| 124 | ||
| 1553.5.42
by Martin Pool Start to parameterize LockableFiles test cases. | 125 | |
| 126 | # This method of adapting tests to parameters is different to 
 | |
| 127 | # the TestProviderAdapters used elsewhere, but seems simpler for this 
 | |
| 128 | # case.  
 | |
| 1553.5.45
by Martin Pool Clean up Transport-based locks for old branches | 129 | class TestLockableFiles_TransportLock(TestCaseInTempDir, | 
| 130 | _TestLockableFiles_mixin): | |
| 1553.5.42
by Martin Pool Start to parameterize LockableFiles test cases. | 131 | |
| 132 | def setUp(self): | |
| 1553.5.45
by Martin Pool Clean up Transport-based locks for old branches | 133 | super(TestLockableFiles_TransportLock, self).setUp() | 
| 1553.5.42
by Martin Pool Start to parameterize LockableFiles test cases. | 134 | transport = get_transport('.') | 
| 135 | transport.mkdir('.bzr') | |
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 136 | self.sub_transport = transport.clone('.bzr') | 
| 137 | self.lockable = self.get_lockable() | |
| 1553.5.61
by Martin Pool Locks protecting LockableFiles must now be explicitly created before use. | 138 | self.lockable.create_lock() | 
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 139 | |
| 140 | def tearDown(self): | |
| 141 | super(TestLockableFiles_TransportLock, self).tearDown() | |
| 1687.1.15
by Robert Collins Review comments. | 142 |         # free the subtransport so that we do not get a 5 second
 | 
| 143 |         # timeout due to the SFTP connection cache.
 | |
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 144 | del self.sub_transport | 
| 145 | ||
| 146 | def get_lockable(self): | |
| 147 | return LockableFiles(self.sub_transport, 'my-lock', TransportLock) | |
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 148 | |
| 149 | ||
| 150 | class TestLockableFiles_LockDir(TestCaseInTempDir, | |
| 151 | _TestLockableFiles_mixin): | |
| 152 | """LockableFile tests run with LockDir underneath""" | |
| 153 | ||
| 154 | def setUp(self): | |
| 155 | super(TestLockableFiles_LockDir, self).setUp() | |
| 1553.5.61
by Martin Pool Locks protecting LockableFiles must now be explicitly created before use. | 156 | self.transport = get_transport('.') | 
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 157 | self.lockable = self.get_lockable() | 
| 1666.1.4
by Robert Collins * 'Metadir' is now the default disk format. This improves behaviour in | 158 |         # the lock creation here sets mode - test_permissions on branch 
 | 
| 159 |         # tests that implicitly, but it might be a good idea to factor 
 | |
| 160 |         # out the mode checking logic and have it applied to loackable files
 | |
| 161 |         # directly. RBC 20060418
 | |
| 1553.5.61
by Martin Pool Locks protecting LockableFiles must now be explicitly created before use. | 162 | self.lockable.create_lock() | 
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 163 | |
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 164 | def get_lockable(self): | 
| 165 | return LockableFiles(self.transport, 'my-lock', LockDir) | |
| 1553.5.60
by Martin Pool New LockableFiles.create_lock() method | 166 | |
| 167 | def test_lock_created(self): | |
| 1553.5.61
by Martin Pool Locks protecting LockableFiles must now be explicitly created before use. | 168 | self.assertTrue(self.transport.has('my-lock')) | 
| 169 | self.lockable.lock_write() | |
| 170 | self.assertTrue(self.transport.has('my-lock/held/info')) | |
| 171 | self.lockable.unlock() | |
| 172 | self.assertFalse(self.transport.has('my-lock/held/info')) | |
| 173 | self.assertTrue(self.transport.has('my-lock')) | |
| 174 | ||
| 175 | ||
| 176 |     # TODO: Test the lockdir inherits the right file and directory permissions
 | |
| 177 |     # from the LockableFiles.
 |