23
23
import bzrlib.errors as errors
24
24
from bzrlib.errors import BzrError
25
from bzrlib.store import TransportStore
26
25
from bzrlib.store.text import TextStore
27
from bzrlib.store.versioned import VersionedFileStore
28
26
from bzrlib.tests import TestCase, TestCaseInTempDir, TestCaseWithTransport
27
import bzrlib.store as store
28
import bzrlib.store.versioned
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):
165
164
s = self.get_store(u'.', compressed=False)
166
165
cs.add(StringIO('hello there'), 'a')
168
self.assertPathExists('a.gz')
169
self.assertFalse(os.path.lexists('a'))
167
self.failUnlessExists('a.gz')
168
self.failIf(os.path.lexists('a'))
171
170
self.assertEquals(gzip.GzipFile('a.gz').read(), 'hello there')
178
177
self.assertRaises(BzrError, s.add, StringIO('goodbye'), 'a')
180
179
s.add(StringIO('goodbye'), 'b')
181
self.assertPathExists('b')
182
self.assertFalse(os.path.lexists('b.gz'))
180
self.failUnlessExists('b')
181
self.failIf(os.path.lexists('b.gz'))
183
182
self.assertEquals(open('b').read(), 'goodbye')
185
184
self.assertEquals(cs.has_id('b'), True)
242
241
class TestTransportStore(TestCase):
244
243
def test__relpath_invalid(self):
245
my_store = TransportStore(MockTransport())
244
my_store = store.TransportStore(MockTransport())
246
245
self.assertRaises(ValueError, my_store._relpath, '/foo')
247
246
self.assertRaises(ValueError, my_store._relpath, 'foo/')
249
248
def test_register_invalid_suffixes(self):
250
my_store = TransportStore(MockTransport())
249
my_store = store.TransportStore(MockTransport())
251
250
self.assertRaises(ValueError, my_store.register_suffix, '/')
252
251
self.assertRaises(ValueError, my_store.register_suffix, '.gz/bar')
254
253
def test__relpath_unregister_suffixes(self):
255
my_store = TransportStore(MockTransport())
254
my_store = store.TransportStore(MockTransport())
256
255
self.assertRaises(ValueError, my_store._relpath, 'foo', ['gz'])
257
256
self.assertRaises(ValueError, my_store._relpath, 'foo', ['dsc', 'gz'])
259
258
def test__relpath_simple(self):
260
my_store = TransportStore(MockTransport())
259
my_store = store.TransportStore(MockTransport())
261
260
self.assertEqual("foo", my_store._relpath('foo'))
263
262
def test__relpath_prefixed(self):
264
my_store = TransportStore(MockTransport(), True)
263
my_store = store.TransportStore(MockTransport(), True)
265
264
self.assertEqual('45/foo', my_store._relpath('foo'))
267
266
def test__relpath_simple_suffixed(self):
268
my_store = TransportStore(MockTransport())
267
my_store = store.TransportStore(MockTransport())
269
268
my_store.register_suffix('bar')
270
269
my_store.register_suffix('baz')
271
270
self.assertEqual('foo.baz', my_store._relpath('foo', ['baz']))
272
271
self.assertEqual('foo.bar.baz', my_store._relpath('foo', ['bar', 'baz']))
274
273
def test__relpath_prefixed_suffixed(self):
275
my_store = TransportStore(MockTransport(), True)
274
my_store = store.TransportStore(MockTransport(), True)
276
275
my_store.register_suffix('bar')
277
276
my_store.register_suffix('baz')
278
277
self.assertEqual('45/foo.baz', my_store._relpath('foo', ['baz']))
394
393
self.assertRaises(KeyError, to_store.get, 'missing', 'sig')
396
395
def test_relpath_escaped(self):
397
my_store = TransportStore(MemoryTransport())
396
my_store = store.TransportStore(MemoryTransport())
398
397
self.assertEqual('%25', my_store._relpath('%'))
400
399
def test_escaped_uppercase(self):
401
400
"""Uppercase letters are escaped for safety on Windows"""
402
my_store = TransportStore(MemoryTransport(), prefixed=True,
401
my_store = store.TransportStore(MemoryTransport(), prefixed=True,
404
403
# a particularly perverse file-id! :-)
405
404
self.assertEquals(my_store._relpath('C:<>'), 'be/%2543%253a%253c%253e')
438
436
self.assertRaises(errors.ReadOnlyError, vf.add_lines, 'b', [], [])
440
438
def test___iter__escaped(self):
441
self.vfstore = VersionedFileStore(MemoryTransport(),
442
prefixed=True, escaped=True, versionedfile_class=WeaveFile)
439
self.vfstore = store.versioned.VersionedFileStore(MemoryTransport(),
440
prefixed=True, escaped=True)
443
441
self.vfstore.get_scope = self.get_scope
444
442
self._transaction = transactions.WriteTransaction()
445
443
vf = self.vfstore.get_weave_or_empty(' ', self._transaction)