31
def test_transport(tester, t, readonly=False):
32
"""Test a transport object. Basically, it assumes that the
33
Transport object is connected to the current working directory.
34
So that whatever is done through the transport, should show
35
up in the working directory, and vice-versa.
32
class TestTransportMixIn(object):
33
"""Subclass this, and it will provide a series of tests for a Transport.
34
It assumes that the Transport object is connected to the
35
current working directory. So that whatever is done
36
through the transport, should show up in the working
37
directory, and vice-versa.
37
39
This also tests to make sure that the functions work with both
38
40
generators and lists (assuming iter(list) is effectively a generator)
41
from bzrlib.transport.local import LocalTransport
44
files = ['a', 'b', 'e', 'g']
45
tester.build_tree(files)
46
tester.assertEqual(t.has('a'), True)
47
tester.assertEqual(t.has('c'), False)
48
tester.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])),
49
[True, True, False, False, True, False, True, False])
50
tester.assertEqual(list(t.has_multi(iter(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']))),
51
[True, True, False, False, True, False, True, False])
54
tester.assertEqual(t.get('a').read(), open('a').read())
55
content_f = t.get_multi(files)
56
for path,f in zip(files, content_f):
57
tester.assertEqual(open(path).read(), f.read())
59
content_f = t.get_multi(iter(files))
60
for path,f in zip(files, content_f):
61
tester.assertEqual(open(path).read(), f.read())
63
tester.assertRaises(NoSuchFile, t.get, 'c')
65
files = list(t.get_multi(['a', 'b', 'c']))
69
tester.fail('Failed to raise NoSuchFile for missing file in get_multi')
71
files = list(t.get_multi(iter(['a', 'b', 'c', 'e'])))
75
tester.fail('Failed to raise NoSuchFile for missing file in get_multi')
79
tester.assertRaises(TransportNotPossible,
80
t.put, 'c', 'some text for c\n')
81
open('c', 'wb').write('some text for c\n')
83
t.put('c', 'some text for c\n')
84
tester.assert_(os.path.exists('c'))
85
tester.check_file_contents('c', 'some text for c\n')
86
tester.assertEqual(t.get('c').read(), 'some text for c\n')
87
# Make sure 'has' is updated
88
tester.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])),
89
[True, True, True, False, True, False, True, False])
91
tester.assertRaises(TransportNotPossible,
93
[('a', 'new\ncontents for\na\n'),
94
('d', 'contents\nfor d\n')])
95
open('a', 'wb').write('new\ncontents for\na\n')
96
open('d', 'wb').write('contents\nfor d\n')
98
# Put also replaces contents
99
tester.assertEqual(t.put_multi([('a', 'new\ncontents for\na\n'),
100
('d', 'contents\nfor d\n')]),
102
tester.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])),
103
[True, True, True, True, True, False, True, False])
104
tester.check_file_contents('a', 'new\ncontents for\na\n')
105
tester.check_file_contents('d', 'contents\nfor d\n')
108
tester.assertRaises(TransportNotPossible,
109
t.put_multi, iter([('a', 'diff\ncontents for\na\n'),
110
('d', 'another contents\nfor d\n')]))
111
open('a', 'wb').write('diff\ncontents for\na\n')
112
open('d', 'wb').write('another contents\nfor d\n')
115
t.put_multi(iter([('a', 'diff\ncontents for\na\n'),
116
('d', 'another contents\nfor d\n')]))
118
tester.check_file_contents('a', 'diff\ncontents for\na\n')
119
tester.check_file_contents('d', 'another contents\nfor d\n')
122
tester.assertRaises(TransportNotPossible,
123
t.put, 'path/doesnt/exist/c', 'contents')
125
tester.assertRaises(NoSuchFile,
126
t.put, 'path/doesnt/exist/c', 'contents')
130
tester.assertEqual(t.has('dir_a'), True)
131
tester.assertEqual(t.has('dir_b'), False)
134
tester.assertRaises(TransportNotPossible,
139
tester.assertEqual(t.has('dir_b'), True)
140
tester.assert_(os.path.isdir('dir_b'))
143
tester.assertRaises(TransportNotPossible,
144
t.mkdir_multi, ['dir_c', 'dir_d'])
148
t.mkdir_multi(['dir_c', 'dir_d'])
151
tester.assertRaises(TransportNotPossible,
152
t.mkdir_multi, iter(['dir_e', 'dir_f']))
156
t.mkdir_multi(iter(['dir_e', 'dir_f']))
157
tester.assertEqual(list(t.has_multi(
158
['dir_a', 'dir_b', 'dir_c', 'dir_q',
159
'dir_d', 'dir_e', 'dir_f', 'dir_b'])),
160
[True, True, True, False,
161
True, True, True, True])
162
for d in ['dir_a', 'dir_b', 'dir_c', 'dir_d', 'dir_e', 'dir_f']:
163
tester.assert_(os.path.isdir(d))
166
tester.assertRaises(NoSuchFile, t.mkdir, 'path/doesnt/exist')
167
tester.assertRaises(FileExists, t.mkdir, 'dir_a') # Creating a directory again should fail
169
# Make sure the transport recognizes when a
170
# directory is created by other means
171
# Caching Transports will fail, because dir_e was already seen not
172
# to exist. So instead, we will search for a new directory
175
# tester.assertRaises(FileExists, t.mkdir, 'dir_e')
179
tester.assertRaises(FileExists, t.mkdir, 'dir_g')
181
# Test get/put in sub-directories
183
open('dir_a/a', 'wb').write('contents of dir_a/a')
184
open('dir_b/b', 'wb').write('contents of dir_b/b')
187
t.put_multi([('dir_a/a', 'contents of dir_a/a'),
188
('dir_b/b', 'contents of dir_b/b')])
190
for f in ('dir_a/a', 'dir_b/b'):
191
tester.assertEqual(t.get(f).read(), open(f).read())
194
dtmp = tempfile.mkdtemp(dir='.', prefix='test-transport-')
195
dtmp_base = os.path.basename(dtmp)
196
local_t = LocalTransport(dtmp)
198
files = ['a', 'b', 'c', 'd']
199
t.copy_to(files, local_t)
201
tester.assertEquals(open(f).read(),
202
open(os.path.join(dtmp_base, f)).read())
204
del dtmp, dtmp_base, local_t
206
dtmp = tempfile.mkdtemp(dir='.', prefix='test-transport-')
207
dtmp_base = os.path.basename(dtmp)
208
local_t = LocalTransport(dtmp)
210
files = ['a', 'b', 'c', 'd']
211
t.copy_to(iter(files), local_t)
213
tester.assertEquals(open(f).read(),
214
open(os.path.join(dtmp_base, f)).read())
216
del dtmp, dtmp_base, local_t
218
# Test append, and append_multi
220
tester.assertRaises(TransportNotPossible,
221
t.append, 'a', 'add\nsome\nmore\ncontents\n')
222
_append('a', 'add\nsome\nmore\ncontents\n')
224
t.append('a', 'add\nsome\nmore\ncontents\n')
226
tester.check_file_contents('a',
227
'diff\ncontents for\na\nadd\nsome\nmore\ncontents\n')
230
tester.assertRaises(TransportNotPossible,
232
[('a', 'and\nthen\nsome\nmore\n'),
233
('d', 'some\nmore\nfor\nd\n')])
234
_append('a', 'and\nthen\nsome\nmore\n')
235
_append('d', 'some\nmore\nfor\nd\n')
237
t.append_multi([('a', 'and\nthen\nsome\nmore\n'),
238
('d', 'some\nmore\nfor\nd\n')])
239
tester.check_file_contents('a',
240
'diff\ncontents for\na\n'
241
'add\nsome\nmore\ncontents\n'
242
'and\nthen\nsome\nmore\n')
243
tester.check_file_contents('d',
244
'another contents\nfor d\n'
245
'some\nmore\nfor\nd\n')
248
_append('a', 'a little bit more\n')
249
_append('d', 'from an iterator\n')
251
t.append_multi(iter([('a', 'a little bit more\n'),
252
('d', 'from an iterator\n')]))
253
tester.check_file_contents('a',
254
'diff\ncontents for\na\n'
255
'add\nsome\nmore\ncontents\n'
256
'and\nthen\nsome\nmore\n'
257
'a little bit more\n')
258
tester.check_file_contents('d',
259
'another contents\nfor d\n'
260
'some\nmore\nfor\nd\n'
261
'from an iterator\n')
263
# Test that StringIO can be used as a file-like object with put
264
f1 = StringIO('this is a string\nand some more stuff\n')
266
open('f1', 'wb').write(f1.read())
272
tester.check_file_contents('f1',
273
'this is a string\nand some more stuff\n')
275
f2 = StringIO('here is some text\nand a bit more\n')
276
f3 = StringIO('some text for the\nthird file created\n')
279
open('f2', 'wb').write(f2.read())
280
open('f3', 'wb').write(f3.read())
282
t.put_multi([('f2', f2), ('f3', f3)])
286
tester.check_file_contents('f2', 'here is some text\nand a bit more\n')
287
tester.check_file_contents('f3', 'some text for the\nthird file created\n')
289
# Test that an actual file object can be used with put
290
f4 = open('f1', 'rb')
292
open('f4', 'wb').write(f4.read())
298
tester.check_file_contents('f4',
299
'this is a string\nand some more stuff\n')
301
f5 = open('f2', 'rb')
302
f6 = open('f3', 'rb')
304
open('f5', 'wb').write(f5.read())
305
open('f6', 'wb').write(f6.read())
307
t.put_multi([('f5', f5), ('f6', f6)])
311
tester.check_file_contents('f5', 'here is some text\nand a bit more\n')
312
tester.check_file_contents('f6', 'some text for the\nthird file created\n')
314
# Test that StringIO can be used as a file-like object with append
315
a1 = StringIO('appending to\none\n')
317
_append('f1', a1.read())
323
tester.check_file_contents('f1',
324
'this is a string\nand some more stuff\n'
325
'appending to\none\n')
327
a2 = StringIO('adding more\ntext to two\n')
328
a3 = StringIO('some garbage\nto put in three\n')
331
_append('f2', a2.read())
332
_append('f3', a3.read())
334
t.append_multi([('f2', a2), ('f3', a3)])
338
tester.check_file_contents('f2',
339
'here is some text\nand a bit more\n'
340
'adding more\ntext to two\n')
341
tester.check_file_contents('f3',
342
'some text for the\nthird file created\n'
343
'some garbage\nto put in three\n')
345
# Test that an actual file object can be used with put
346
a4 = open('f1', 'rb')
348
_append('f4', a4.read())
354
tester.check_file_contents('f4',
355
'this is a string\nand some more stuff\n'
356
'this is a string\nand some more stuff\n'
357
'appending to\none\n')
359
a5 = open('f2', 'rb')
360
a6 = open('f3', 'rb')
362
_append('f5', a5.read())
363
_append('f6', a6.read())
365
t.append_multi([('f5', a5), ('f6', a6)])
369
tester.check_file_contents('f5',
370
'here is some text\nand a bit more\n'
371
'here is some text\nand a bit more\n'
372
'adding more\ntext to two\n')
373
tester.check_file_contents('f6',
374
'some text for the\nthird file created\n'
375
'some text for the\nthird file created\n'
376
'some garbage\nto put in three\n')
379
tester.assertRaises(NoSuchFile,
380
t.get_partial, 'a-missing-file', 20)
381
tester.assertRaises(NoSuchFile,
382
t.get_partial, 'another-missing-file', 20, 30)
383
f = t.get_partial('f5', 33)
384
tester.assertEqual(f.read(),
385
'here is some text\nand a bit more\n'
386
'adding more\ntext to two\n')
387
f = t.get_partial('f5', 66)
388
tester.assertEqual(f.read(),
389
'adding more\ntext to two\n')
390
f = t.get_partial('f5', 66, 10)
391
tester.assertEqual(f.read(10),
396
offsets = [('f5', 33), ('f6', 20, 10), ('f4', 10, 20)]
397
values = ['here is some text\nand a bit more\nadding more\ntext to two\n',
399
'string\nand some more'
401
contents_f = t.get_partial_multi(offsets)
403
for f, val in zip(contents_f, values):
405
tester.assertEqual(val, f.read(len(val)))
406
# Make sure we saw all values, and no extra
407
tester.assertEqual(len(values), count)
408
tester.assertEqual(list(contents_f), [])
410
# Do the same thing with an iterator
411
offsets = iter([('f5', 34), ('f6', 18, 10), ('f4', 15, 15)])
412
values = ['ere is some text\nand a bit more\nadding more\ntext to two\n',
416
contents_f = t.get_partial_multi(offsets)
418
for f, val in zip(contents_f, values):
420
tester.assertEqual(val, f.read(len(val)))
421
tester.assertEqual(len(values), count)
422
tester.assertEqual(list(contents_f), [])
424
# TODO: Test delete, move, etc.
427
class LocalTransportTest(TestCaseInTempDir):
428
def test_local_transport(self):
429
from bzrlib.transport.local import LocalTransport
431
t = LocalTransport('.')
432
test_transport(self, t)
434
class HttpTransportTest(TestCaseWithWebserver):
435
def test_http_transport(self):
43
def get_transport(self):
44
"""Children should override this to return the Transport object.
46
raise NotImplementedError
49
t = self.get_transport()
51
files = ['a', 'b', 'e', 'g']
52
self.build_tree(files)
53
self.assertEqual(t.has('a'), True)
54
self.assertEqual(t.has('c'), False)
55
self.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])),
56
[True, True, False, False, True, False, True, False])
57
self.assertEqual(list(t.has_multi(iter(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']))),
58
[True, True, False, False, True, False, True, False])
61
t = self.get_transport()
63
files = ['a', 'b', 'e', 'g']
64
self.build_tree(files)
65
self.assertEqual(t.get('a').read(), open('a').read())
66
content_f = t.get_multi(files)
67
for path,f in zip(files, content_f):
68
self.assertEqual(open(path).read(), f.read())
70
content_f = t.get_multi(iter(files))
71
for path,f in zip(files, content_f):
72
self.assertEqual(open(path).read(), f.read())
74
self.assertRaises(NoSuchFile, t.get, 'c')
76
files = list(t.get_multi(['a', 'b', 'c']))
80
self.fail('Failed to raise NoSuchFile for missing file in get_multi')
82
files = list(t.get_multi(iter(['a', 'b', 'c', 'e'])))
86
self.fail('Failed to raise NoSuchFile for missing file in get_multi')
89
t = self.get_transport()
92
self.assertRaises(TransportNotPossible,
93
t.put, 'a', 'some text for a\n')
94
open('a', 'wb').write('some text for a\n')
96
t.put('a', 'some text for a\n')
97
self.assert_(os.path.exists('a'))
98
self.check_file_contents('a', 'some text for a\n')
99
self.assertEqual(t.get('a').read(), 'some text for a\n')
100
# Make sure 'has' is updated
101
self.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd', 'e'])),
102
[True, False, False, False, False])
104
self.assertRaises(TransportNotPossible,
106
[('a', 'new\ncontents for\na\n'),
107
('d', 'contents\nfor d\n')])
108
open('a', 'wb').write('new\ncontents for\na\n')
109
open('d', 'wb').write('contents\nfor d\n')
111
# Put also replaces contents
112
self.assertEqual(t.put_multi([('a', 'new\ncontents for\na\n'),
113
('d', 'contents\nfor d\n')]),
115
self.assertEqual(list(t.has_multi(['a', 'b', 'c', 'd', 'e'])),
116
[True, False, False, True, False])
117
self.check_file_contents('a', 'new\ncontents for\na\n')
118
self.check_file_contents('d', 'contents\nfor d\n')
121
self.assertRaises(TransportNotPossible,
122
t.put_multi, iter([('a', 'diff\ncontents for\na\n'),
123
('d', 'another contents\nfor d\n')]))
124
open('a', 'wb').write('diff\ncontents for\na\n')
125
open('d', 'wb').write('another contents\nfor d\n')
128
t.put_multi(iter([('a', 'diff\ncontents for\na\n'),
129
('d', 'another contents\nfor d\n')]))
131
self.check_file_contents('a', 'diff\ncontents for\na\n')
132
self.check_file_contents('d', 'another contents\nfor d\n')
135
self.assertRaises(TransportNotPossible,
136
t.put, 'path/doesnt/exist/c', 'contents')
138
self.assertRaises(NoSuchFile,
139
t.put, 'path/doesnt/exist/c', 'contents')
141
def test_put_file(self):
142
t = self.get_transport()
144
# Test that StringIO can be used as a file-like object with put
145
f1 = StringIO('this is a string\nand some more stuff\n')
147
open('f1', 'wb').write(f1.read())
153
self.check_file_contents('f1',
154
'this is a string\nand some more stuff\n')
156
f2 = StringIO('here is some text\nand a bit more\n')
157
f3 = StringIO('some text for the\nthird file created\n')
160
open('f2', 'wb').write(f2.read())
161
open('f3', 'wb').write(f3.read())
163
t.put_multi([('f2', f2), ('f3', f3)])
167
self.check_file_contents('f2', 'here is some text\nand a bit more\n')
168
self.check_file_contents('f3', 'some text for the\nthird file created\n')
170
# Test that an actual file object can be used with put
171
f4 = open('f1', 'rb')
173
open('f4', 'wb').write(f4.read())
179
self.check_file_contents('f4',
180
'this is a string\nand some more stuff\n')
182
f5 = open('f2', 'rb')
183
f6 = open('f3', 'rb')
185
open('f5', 'wb').write(f5.read())
186
open('f6', 'wb').write(f6.read())
188
t.put_multi([('f5', f5), ('f6', f6)])
192
self.check_file_contents('f5', 'here is some text\nand a bit more\n')
193
self.check_file_contents('f6', 'some text for the\nthird file created\n')
197
def test_mkdir(self):
198
t = self.get_transport()
202
self.assertEqual(t.has('dir_a'), True)
203
self.assertEqual(t.has('dir_b'), False)
206
self.assertRaises(TransportNotPossible,
211
self.assertEqual(t.has('dir_b'), True)
212
self.assert_(os.path.isdir('dir_b'))
215
self.assertRaises(TransportNotPossible,
216
t.mkdir_multi, ['dir_c', 'dir_d'])
220
t.mkdir_multi(['dir_c', 'dir_d'])
223
self.assertRaises(TransportNotPossible,
224
t.mkdir_multi, iter(['dir_e', 'dir_f']))
228
t.mkdir_multi(iter(['dir_e', 'dir_f']))
229
self.assertEqual(list(t.has_multi(
230
['dir_a', 'dir_b', 'dir_c', 'dir_q',
231
'dir_d', 'dir_e', 'dir_f', 'dir_b'])),
232
[True, True, True, False,
233
True, True, True, True])
234
for d in ['dir_a', 'dir_b', 'dir_c', 'dir_d', 'dir_e', 'dir_f']:
235
self.assert_(os.path.isdir(d))
237
if not self.readonly:
238
self.assertRaises(NoSuchFile, t.mkdir, 'path/doesnt/exist')
239
self.assertRaises(FileExists, t.mkdir, 'dir_a') # Creating a directory again should fail
241
# Make sure the transport recognizes when a
242
# directory is created by other means
243
# Caching Transports will fail, because dir_e was already seen not
244
# to exist. So instead, we will search for a new directory
246
#if not self.readonly:
247
# self.assertRaises(FileExists, t.mkdir, 'dir_e')
250
if not self.readonly:
251
self.assertRaises(FileExists, t.mkdir, 'dir_g')
253
# Test get/put in sub-directories
255
open('dir_a/a', 'wb').write('contents of dir_a/a')
256
open('dir_b/b', 'wb').write('contents of dir_b/b')
259
t.put_multi([('dir_a/a', 'contents of dir_a/a'),
260
('dir_b/b', 'contents of dir_b/b')])
262
for f in ('dir_a/a', 'dir_b/b'):
263
self.assertEqual(t.get(f).read(), open(f).read())
265
def test_copy_to(self):
267
from bzrlib.transport.local import LocalTransport
269
t = self.get_transport()
271
files = ['a', 'b', 'c', 'd']
272
self.build_tree(files)
274
dtmp = tempfile.mkdtemp(dir='.', prefix='test-transport-')
275
dtmp_base = os.path.basename(dtmp)
276
local_t = LocalTransport(dtmp)
278
t.copy_to(files, local_t)
280
self.assertEquals(open(f).read(),
281
open(os.path.join(dtmp_base, f)).read())
283
del dtmp, dtmp_base, local_t
285
dtmp = tempfile.mkdtemp(dir='.', prefix='test-transport-')
286
dtmp_base = os.path.basename(dtmp)
287
local_t = LocalTransport(dtmp)
289
files = ['a', 'b', 'c', 'd']
290
t.copy_to(iter(files), local_t)
292
self.assertEquals(open(f).read(),
293
open(os.path.join(dtmp_base, f)).read())
295
del dtmp, dtmp_base, local_t
297
def test_append(self):
298
t = self.get_transport()
301
open('a', 'wb').write('diff\ncontents for\na\n')
302
open('b', 'wb').write('contents\nfor b\n')
305
('a', 'diff\ncontents for\na\n'),
306
('b', 'contents\nfor b\n')
310
self.assertRaises(TransportNotPossible,
311
t.append, 'a', 'add\nsome\nmore\ncontents\n')
312
_append('a', 'add\nsome\nmore\ncontents\n')
314
t.append('a', 'add\nsome\nmore\ncontents\n')
316
self.check_file_contents('a',
317
'diff\ncontents for\na\nadd\nsome\nmore\ncontents\n')
320
self.assertRaises(TransportNotPossible,
322
[('a', 'and\nthen\nsome\nmore\n'),
323
('b', 'some\nmore\nfor\nb\n')])
324
_append('a', 'and\nthen\nsome\nmore\n')
325
_append('b', 'some\nmore\nfor\nb\n')
327
t.append_multi([('a', 'and\nthen\nsome\nmore\n'),
328
('b', 'some\nmore\nfor\nb\n')])
329
self.check_file_contents('a',
330
'diff\ncontents for\na\n'
331
'add\nsome\nmore\ncontents\n'
332
'and\nthen\nsome\nmore\n')
333
self.check_file_contents('b',
335
'some\nmore\nfor\nb\n')
338
_append('a', 'a little bit more\n')
339
_append('b', 'from an iterator\n')
341
t.append_multi(iter([('a', 'a little bit more\n'),
342
('b', 'from an iterator\n')]))
343
self.check_file_contents('a',
344
'diff\ncontents for\na\n'
345
'add\nsome\nmore\ncontents\n'
346
'and\nthen\nsome\nmore\n'
347
'a little bit more\n')
348
self.check_file_contents('b',
350
'some\nmore\nfor\nb\n'
351
'from an iterator\n')
353
def test_append_file(self):
354
t = self.get_transport()
357
('f1', 'this is a string\nand some more stuff\n'),
358
('f2', 'here is some text\nand a bit more\n'),
359
('f3', 'some text for the\nthird file created\n'),
360
('f4', 'this is a string\nand some more stuff\n'),
361
('f5', 'here is some text\nand a bit more\n'),
362
('f6', 'some text for the\nthird file created\n')
366
for f, val in contents:
367
open(f, 'wb').write(val)
369
t.put_multi(contents)
371
a1 = StringIO('appending to\none\n')
373
_append('f1', a1.read())
379
self.check_file_contents('f1',
380
'this is a string\nand some more stuff\n'
381
'appending to\none\n')
383
a2 = StringIO('adding more\ntext to two\n')
384
a3 = StringIO('some garbage\nto put in three\n')
387
_append('f2', a2.read())
388
_append('f3', a3.read())
390
t.append_multi([('f2', a2), ('f3', a3)])
394
self.check_file_contents('f2',
395
'here is some text\nand a bit more\n'
396
'adding more\ntext to two\n')
397
self.check_file_contents('f3',
398
'some text for the\nthird file created\n'
399
'some garbage\nto put in three\n')
401
# Test that an actual file object can be used with put
402
a4 = open('f1', 'rb')
404
_append('f4', a4.read())
410
self.check_file_contents('f4',
411
'this is a string\nand some more stuff\n'
412
'this is a string\nand some more stuff\n'
413
'appending to\none\n')
415
a5 = open('f2', 'rb')
416
a6 = open('f3', 'rb')
418
_append('f5', a5.read())
419
_append('f6', a6.read())
421
t.append_multi([('f5', a5), ('f6', a6)])
425
self.check_file_contents('f5',
426
'here is some text\nand a bit more\n'
427
'here is some text\nand a bit more\n'
428
'adding more\ntext to two\n')
429
self.check_file_contents('f6',
430
'some text for the\nthird file created\n'
431
'some text for the\nthird file created\n'
432
'some garbage\nto put in three\n')
434
def test_get_partial(self):
435
t = self.get_transport()
439
'here is some text\nand a bit more\n'
440
'adding more\ntext to two\n'),
442
'this is a string\nand some more stuff\n'
443
'appending to\none\n'),
445
'some text for the\nthird file created\n'
446
'some garbage\nto put in three\n')
449
for f, val in contents:
450
open(f, 'wb').write(val)
452
t.put_multi(contents)
454
self.assertRaises(NoSuchFile,
455
t.get_partial, 'a-missing-file', 20)
456
self.assertRaises(NoSuchFile,
457
t.get_partial, 'another-missing-file', 20, 30)
458
f = t.get_partial('f1', 33)
459
self.assertEqual(f.read(),
460
'adding more\ntext to two\n')
461
f = t.get_partial('f1', 33, 10)
462
self.assertEqual(f.read(10),
467
offsets = [('f2', 37), ('f3', 20, 10), ('f1', 10, 20)]
468
values = ['appending to\none\n',
470
'me text\nand a bit mo'
472
contents_f = t.get_partial_multi(offsets)
474
for f, val in zip(contents_f, values):
476
self.assertEqual(val, f.read(len(val)))
477
# Make sure we saw all values, and no extra
478
self.assertEqual(len(values), count)
479
self.assertEqual(list(contents_f), [])
481
# Do the same thing with an iterator
482
offsets = iter([('f2', 34), ('f3', 18, 10), ('f1', 15, 15)])
483
values = ['ff\nappending to\none\n',
487
contents_f = t.get_partial_multi(offsets)
489
for f, val in zip(contents_f, values):
491
self.assertEqual(val, f.read(len(val)))
492
self.assertEqual(len(values), count)
493
self.assertEqual(list(contents_f), [])
496
def test_delete(self):
497
# TODO: Test Transport.delete
501
# TODO: Test Transport.move
504
class LocalTransportTest(TestCaseInTempDir, TestTransportMixIn):
505
def get_transport(self):
506
from bzrlib.transport.local import LocalTransport
507
return LocalTransport('.')
509
class HttpTransportTest(TestCaseWithWebserver, TestTransportMixIn):
511
def get_transport(self):
436
512
from bzrlib.transport.http import HttpTransport
438
513
url = self.get_remote_url('.')
439
t = HttpTransport(url)
440
test_transport(self, t, readonly=True)
514
return HttpTransport(url)