17
17
"""Test Store implementation
20
19
from StringIO import StringIO
23
from bzrlib.remotebranch import RemoteStore
24
from bzrlib.store import ImmutableStore, copy_all
22
from bzrlib.store import copy_all
23
from bzrlib.transport.local import LocalTransport
24
from bzrlib.transport import NoSuchFile
25
from bzrlib.store.compressed_text import CompressedTextStore
26
from bzrlib.store.text import TextStore
25
27
from bzrlib.selftest import TestCaseInTempDir
26
28
from bzrlib.errors import BzrError, UnlistableStore
29
class TestStore(TestCaseInTempDir):
30
def test_multiple_add(self):
31
"""Multiple add with same ID should raise a BzrError"""
32
store = ImmutableStore('.')
33
store.add(StringIO('goodbye'), '123123')
34
self.assertRaises(BzrError, store.add, StringIO('goodbye'), '123123')
36
def test_copy_all(self):
39
store_a = ImmutableStore('a')
40
store_a.add('foo', '1')
42
store_b = ImmutableStore('b')
43
copy_all(store_a, store_b)
44
self.assertEqual(store_a['1'].read(), 'foo')
45
self.assertEqual(store_b['1'].read(), 'foo')
46
store_c = RemoteStore('http://example.com/')
47
self.assertRaises(UnlistableStore, copy_all, store_c, store_b)
31
def fill_store(store):
32
store.add(StringIO('hello'), 'a')
33
store.add(StringIO('other'), 'b')
34
store.add(StringIO('something'), 'c')
35
store.add(StringIO('goodbye'), '123123')
37
def check_equals(tester, store, files, values, permit_failure=False):
38
files = store.get(files, permit_failure=permit_failure)
40
for f, v in zip(files, values):
43
tester.assert_(f is None)
45
tester.assertEquals(f.read(), v)
46
tester.assertEquals(count, len(values))
47
# We need to check to make sure there are no more
48
# files to be returned, I'm using a cheezy way
49
# Convert to a list, and there shouldn't be any left
50
tester.assertEquals(len(list(files)), 0)
52
def test_multiple_add(tester, store):
54
tester.assertRaises(BzrError, store.add, StringIO('goodbye'), '123123')
56
def test_get(tester, store):
59
check_equals(tester, store, ['a'], ['hello'])
60
check_equals(tester, store, ['b', 'c'], ['other', 'something'])
62
# Make sure that requesting a non-existing file fails
63
tester.assertRaises(NoSuchFile, check_equals, tester, store,
65
tester.assertRaises(NoSuchFile, check_equals, tester, store,
66
['a', 'd'], ['hello', None])
67
tester.assertRaises(NoSuchFile, check_equals, tester, store,
68
['d', 'a'], [None, 'hello'])
69
tester.assertRaises(NoSuchFile, check_equals, tester, store,
70
['d', 'd', 'd'], [None, None, None])
71
tester.assertRaises(NoSuchFile, check_equals, tester, store,
72
['a', 'd', 'b'], ['hello', None, 'other'])
74
def test_ignore_get(tester, store):
77
files = store.get(['d'], permit_failure=True)
79
tester.assertEquals(len(files), 1)
80
tester.assert_(files[0] is None)
82
check_equals(tester, store, ['a', 'd'], ['hello', None],
84
check_equals(tester, store, ['d', 'a'], [None, 'hello'],
86
check_equals(tester, store, ['d', 'd'], [None, None],
88
check_equals(tester, store, ['a', 'd', 'b'], ['hello', None, 'other'],
90
check_equals(tester, store, ['a', 'd', 'b'], ['hello', None, 'other'],
92
check_equals(tester, store, ['b', 'd', 'c'], ['other', None, 'something'],
95
def get_compressed_store(path='.'):
96
t = LocalTransport(path)
97
return CompressedTextStore(t)
99
def get_text_store(path='.'):
100
t = LocalTransport(path)
103
class TestCompressedTextStore(TestCaseInTempDir):
104
def test_multiple_add(self):
105
"""Multiple add with same ID should raise a BzrError"""
106
store = get_compressed_store()
107
test_multiple_add(self, store)
110
store = get_compressed_store()
111
test_get(self, store)
113
def test_ignore_get(self):
114
store = get_compressed_store()
115
test_ignore_get(self, store)
118
def test_copy_all(self):
121
store_a = get_text_store('a')
122
store_a.add('foo', '1')
124
store_b = get_text_store('b')
125
copy_all(store_a, store_b)
126
self.assertEqual(store_a['1'].read(), 'foo')
127
self.assertEqual(store_b['1'].read(), 'foo')
128
# TODO: Switch the exception form UnlistableStore to
129
# or make Stores throw UnlistableStore if their
130
# Transport doesn't support listing
131
# store_c = RemoteStore('http://example.com/')
132
# self.assertRaises(UnlistableStore, copy_all, store_c, store_b)
134
class TestTextStore(TestCaseInTempDir):
135
def test_multiple_add(self):
136
"""Multiple add with same ID should raise a BzrError"""
137
store = get_text_store()
138
test_multiple_add(self, store)
141
store = get_text_store()
142
test_get(self, store)
144
def test_ignore_get(self):
145
store = get_text_store()
146
test_ignore_get(self, store)
149
def test_copy_all(self):
152
store_a = get_text_store('a')
153
store_a.add('foo', '1')
155
store_b = get_text_store('b')
156
copy_all(store_a, store_b)
157
self.assertEqual(store_a['1'].read(), 'foo')
158
self.assertEqual(store_b['1'].read(), 'foo')
159
# TODO: Switch the exception form UnlistableStore to
160
# or make Stores throw UnlistableStore if their
161
# Transport doesn't support listing
162
# store_c = RemoteStore('http://example.com/')
163
# self.assertRaises(UnlistableStore, copy_all, store_c, store_b)