23
23
import bzrlib.errors as errors
24
from bzrlib.errors import BzrError
25
from bzrlib.store import TransportStore
24
from bzrlib.errors import BzrError, UnlistableStore, NoSuchFile
25
from bzrlib.transport.local import LocalTransport
26
26
from bzrlib.store.text import TextStore
27
from bzrlib.store.versioned import VersionedFileStore
28
27
from bzrlib.tests import TestCase, TestCaseInTempDir, TestCaseWithTransport
28
import bzrlib.store as store
29
29
import bzrlib.transactions as transactions
30
30
import bzrlib.transport as transport
31
31
from bzrlib.transport.memory import MemoryTransport
32
from bzrlib.weave import WeaveFile
35
34
class TestStores(object):
174
181
self.assertEquals(s.has_id('a'), True)
175
182
self.assertEquals(cs.get('a').read(), 'hello there')
176
183
self.assertEquals(s.get('a').read(), 'hello there')
178
185
self.assertRaises(BzrError, s.add, StringIO('goodbye'), 'a')
180
187
s.add(StringIO('goodbye'), 'b')
181
self.assertPathExists('b')
182
self.assertFalse(os.path.lexists('b.gz'))
188
self.failUnlessExists('b')
189
self.failIf(os.path.lexists('b.gz'))
183
190
self.assertEquals(open('b').read(), 'goodbye')
185
192
self.assertEquals(cs.has_id('b'), True)
186
193
self.assertEquals(s.has_id('b'), True)
187
194
self.assertEquals(cs.get('b').read(), 'goodbye')
188
195
self.assertEquals(s.get('b').read(), 'goodbye')
190
197
self.assertRaises(BzrError, cs.add, StringIO('again'), 'b')
192
199
class MockTransport(transport.Transport):
242
249
class TestTransportStore(TestCase):
244
251
def test__relpath_invalid(self):
245
my_store = TransportStore(MockTransport())
252
my_store = store.TransportStore(MockTransport())
246
253
self.assertRaises(ValueError, my_store._relpath, '/foo')
247
254
self.assertRaises(ValueError, my_store._relpath, 'foo/')
249
256
def test_register_invalid_suffixes(self):
250
my_store = TransportStore(MockTransport())
257
my_store = store.TransportStore(MockTransport())
251
258
self.assertRaises(ValueError, my_store.register_suffix, '/')
252
259
self.assertRaises(ValueError, my_store.register_suffix, '.gz/bar')
254
261
def test__relpath_unregister_suffixes(self):
255
my_store = TransportStore(MockTransport())
262
my_store = store.TransportStore(MockTransport())
256
263
self.assertRaises(ValueError, my_store._relpath, 'foo', ['gz'])
257
264
self.assertRaises(ValueError, my_store._relpath, 'foo', ['dsc', 'gz'])
259
266
def test__relpath_simple(self):
260
my_store = TransportStore(MockTransport())
267
my_store = store.TransportStore(MockTransport())
261
268
self.assertEqual("foo", my_store._relpath('foo'))
263
270
def test__relpath_prefixed(self):
264
my_store = TransportStore(MockTransport(), True)
271
my_store = store.TransportStore(MockTransport(), True)
265
272
self.assertEqual('45/foo', my_store._relpath('foo'))
267
274
def test__relpath_simple_suffixed(self):
268
my_store = TransportStore(MockTransport())
275
my_store = store.TransportStore(MockTransport())
269
276
my_store.register_suffix('bar')
270
277
my_store.register_suffix('baz')
271
278
self.assertEqual('foo.baz', my_store._relpath('foo', ['baz']))
272
279
self.assertEqual('foo.bar.baz', my_store._relpath('foo', ['bar', 'baz']))
274
281
def test__relpath_prefixed_suffixed(self):
275
my_store = TransportStore(MockTransport(), True)
282
my_store = store.TransportStore(MockTransport(), True)
276
283
my_store.register_suffix('bar')
277
284
my_store.register_suffix('baz')
278
285
self.assertEqual('45/foo.baz', my_store._relpath('foo', ['baz']))
394
401
self.assertRaises(KeyError, to_store.get, 'missing', 'sig')
396
403
def test_relpath_escaped(self):
397
my_store = TransportStore(MemoryTransport())
404
my_store = store.TransportStore(MemoryTransport())
398
405
self.assertEqual('%25', my_store._relpath('%'))
400
407
def test_escaped_uppercase(self):
401
408
"""Uppercase letters are escaped for safety on Windows"""
402
my_store = TransportStore(MemoryTransport(), prefixed=True,
409
my_store = store.TransportStore(MemoryTransport(), escaped=True)
404
410
# a particularly perverse file-id! :-)
405
self.assertEquals(my_store._relpath('C:<>'), 'be/%2543%253a%253c%253e')
411
self.assertEquals(my_store._escape_file_id('C:<>'), '%43%3a%3c%3e')
408
414
class TestVersionFileStore(TestCaseWithTransport):
411
return self._transaction
414
417
super(TestVersionFileStore, self).setUp()
415
self.vfstore = VersionedFileStore(MemoryTransport(),
416
versionedfile_class=WeaveFile)
417
self.vfstore.get_scope = self.get_scope
418
self._transaction = None
418
self.vfstore = store.versioned.VersionedFileStore(MemoryTransport())
420
420
def test_get_weave_registers_dirty_in_write(self):
421
self._transaction = transactions.WriteTransaction()
422
vf = self.vfstore.get_weave_or_empty('id', self._transaction)
423
self._transaction.finish()
424
self._transaction = None
425
self.assertRaises(errors.OutSideTransaction, vf.add_lines, 'b', [], [])
426
self._transaction = transactions.WriteTransaction()
427
vf = self.vfstore.get_weave('id', self._transaction)
428
self._transaction.finish()
429
self._transaction = None
430
self.assertRaises(errors.OutSideTransaction, vf.add_lines, 'b', [], [])
421
transaction = transactions.WriteTransaction()
422
vf = self.vfstore.get_weave_or_empty('id', transaction)
424
self.assertRaises(errors.OutSideTransaction, vf.add_lines, 'b', [], [])
425
transaction = transactions.WriteTransaction()
426
vf = self.vfstore.get_weave('id', transaction)
428
self.assertRaises(errors.OutSideTransaction, vf.add_lines, 'b', [], [])
430
def test_get_weave_or_empty_readonly_fails(self):
431
transaction = transactions.ReadOnlyTransaction()
432
vf = self.assertRaises(errors.ReadOnlyError,
433
self.vfstore.get_weave_or_empty,
432
437
def test_get_weave_readonly_cant_write(self):
433
self._transaction = transactions.WriteTransaction()
434
vf = self.vfstore.get_weave_or_empty('id', self._transaction)
435
self._transaction.finish()
436
self._transaction = transactions.ReadOnlyTransaction()
437
vf = self.vfstore.get_weave_or_empty('id', self._transaction)
438
transaction = transactions.WriteTransaction()
439
vf = self.vfstore.get_weave_or_empty('id', transaction)
441
transaction = transactions.ReadOnlyTransaction()
442
vf = self.vfstore.get_weave_or_empty('id', transaction)
438
443
self.assertRaises(errors.ReadOnlyError, vf.add_lines, 'b', [], [])
440
def test___iter__escaped(self):
441
self.vfstore = VersionedFileStore(MemoryTransport(),
442
prefixed=True, escaped=True, versionedfile_class=WeaveFile)
443
self.vfstore.get_scope = self.get_scope
444
self._transaction = transactions.WriteTransaction()
445
vf = self.vfstore.get_weave_or_empty(' ', self._transaction)
446
vf.add_lines('a', [], [])
448
self._transaction.finish()
449
self.assertEqual([' '], list(self.vfstore))