/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2004, 2005, 2006 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
907.1.48 by John Arbash Meinel
Updated LocalTransport by passing it through the transport_test suite, and got it to pass.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
907.1.48 by John Arbash Meinel
Updated LocalTransport by passing it through the transport_test suite, and got it to pass.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
907.1.48 by John Arbash Meinel
Updated LocalTransport by passing it through the transport_test suite, and got it to pass.
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
17
1185.11.22 by John Arbash Meinel
Major refactoring of testtransport.
18
import os
1185.58.2 by John Arbash Meinel
Added mode to the appropriate transport functions, and tests to make sure they work.
19
import sys
1185.58.4 by John Arbash Meinel
Added permission checking to Branch, and propogated that change into the stores.
20
import stat
1185.11.22 by John Arbash Meinel
Major refactoring of testtransport.
21
from cStringIO import StringIO
1442.1.44 by Robert Collins
Many transport related tweaks:
22
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
23
import bzrlib
1951.2.3 by Martin Pool
Localtransport cleanup review (john)
24
from bzrlib import urlutils
1185.50.13 by John Arbash Meinel
Expanded the Transport test suite. Including delete, copy, move, etc. Updated SftpTransport to conform.
25
from bzrlib.errors import (NoSuchFile, FileExists,
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
26
                           TransportNotPossible,
27
                           ConnectionError,
28
                           DependencyNotPresent,
1843.1.1 by John Arbash Meinel
Update get_transport to raise a nicer error which includes dependency info
29
                           UnsupportedProtocol,
2070.5.4 by Andrew Bennetts
Merge from bzr.dev.
30
                           PathNotChild,
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
31
                           )
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
32
from bzrlib.tests import TestCase, TestCaseInTempDir
1864.5.9 by John Arbash Meinel
Switch to returning an object to make the api more understandable.
33
from bzrlib.transport import (_CoalescedOffset,
34
                              _get_protocol_handlers,
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
35
                              _get_transport_modules,
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
36
                              get_transport,
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
37
                              register_lazy_transport,
38
                              _set_protocol_handlers,
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
39
                              Transport,
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
40
                              )
1540.3.6 by Martin Pool
[merge] update from bzr.dev
41
from bzrlib.transport.memory import MemoryTransport
2245.6.1 by Alexander Belchenko
win32 UNC path: recursive cloning UNC path to root stops on //HOST, not on //
42
from bzrlib.transport.local import (LocalTransport,
2245.6.2 by Alexander Belchenko
Fix name of emulated Win32LocalTransport as Robert suggested.
43
                                    EmulatedWin32LocalTransport)
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
44
45
46
# TODO: Should possibly split transport-specific tests into their own files.
1185.58.2 by John Arbash Meinel
Added mode to the appropriate transport functions, and tests to make sure they work.
47
48
1185.58.3 by John Arbash Meinel
code cleanup
49
class TestTransport(TestCase):
50
    """Test the non transport-concrete class functionality."""
51
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
52
    def test__get_set_protocol_handlers(self):
53
        handlers = _get_protocol_handlers()
54
        self.assertNotEqual({}, handlers)
55
        try:
56
            _set_protocol_handlers({})
57
            self.assertEqual({}, _get_protocol_handlers())
58
        finally:
59
            _set_protocol_handlers(handlers)
60
61
    def test_get_transport_modules(self):
62
        handlers = _get_protocol_handlers()
63
        class SampleHandler(object):
64
            """I exist, isnt that enough?"""
65
        try:
66
            my_handlers = {}
67
            _set_protocol_handlers(my_handlers)
68
            register_lazy_transport('foo', 'bzrlib.tests.test_transport', 'TestTransport.SampleHandler')
69
            register_lazy_transport('bar', 'bzrlib.tests.test_transport', 'TestTransport.SampleHandler')
70
            self.assertEqual([SampleHandler.__module__],
71
                             _get_transport_modules())
72
        finally:
73
            _set_protocol_handlers(handlers)
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
74
75
    def test_transport_dependency(self):
76
        """Transport with missing dependency causes no error"""
77
        saved_handlers = _get_protocol_handlers()
78
        try:
79
            register_lazy_transport('foo', 'bzrlib.tests.test_transport',
80
                    'BadTransportHandler')
1843.1.1 by John Arbash Meinel
Update get_transport to raise a nicer error which includes dependency info
81
            try:
82
                get_transport('foo://fooserver/foo')
83
            except UnsupportedProtocol, e:
84
                e_str = str(e)
85
                self.assertEquals('Unsupported protocol'
86
                                  ' for url "foo://fooserver/foo":'
87
                                  ' Unable to import library "some_lib":'
88
                                  ' testing missing dependency', str(e))
89
            else:
90
                self.fail('Did not raise UnsupportedProtocol')
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
91
        finally:
1540.3.10 by Martin Pool
[broken] keep hooking pycurl into test framework
92
            # restore original values
93
            _set_protocol_handlers(saved_handlers)
94
            
95
    def test_transport_fallback(self):
96
        """Transport with missing dependency causes no error"""
97
        saved_handlers = _get_protocol_handlers()
98
        try:
1540.3.12 by Martin Pool
Multiple transports can be registered for any protocol, and they are
99
            _set_protocol_handlers({})
1540.3.10 by Martin Pool
[broken] keep hooking pycurl into test framework
100
            register_lazy_transport('foo', 'bzrlib.tests.test_transport',
101
                    'BackupTransportHandler')
102
            register_lazy_transport('foo', 'bzrlib.tests.test_transport',
103
                    'BadTransportHandler')
104
            t = get_transport('foo://fooserver/foo')
105
            self.assertTrue(isinstance(t, BackupTransportHandler))
106
        finally:
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
107
            _set_protocol_handlers(saved_handlers)
1864.5.1 by John Arbash Meinel
Change the readv combining algorithm for one that is easier to test.
108
1996.3.20 by John Arbash Meinel
[merge] bzr.dev 2063
109
    def test__combine_paths(self):
110
        t = Transport('/')
111
        self.assertEqual('/home/sarah/project/foo',
112
                         t._combine_paths('/home/sarah', 'project/foo'))
113
        self.assertEqual('/etc',
114
                         t._combine_paths('/home/sarah', '../../etc'))
2070.3.2 by Andrew Bennetts
Merge from bzr.dev
115
        self.assertEqual('/etc',
116
                         t._combine_paths('/home/sarah', '../../../etc'))
117
        self.assertEqual('/etc',
118
                         t._combine_paths('/home/sarah', '/etc'))
1996.3.20 by John Arbash Meinel
[merge] bzr.dev 2063
119
1864.5.1 by John Arbash Meinel
Change the readv combining algorithm for one that is easier to test.
120
121
class TestCoalesceOffsets(TestCase):
122
    
1864.5.3 by John Arbash Meinel
Allow collapsing ranges even if they are just 'close'
123
    def check(self, expected, offsets, limit=0, fudge=0):
1864.5.1 by John Arbash Meinel
Change the readv combining algorithm for one that is easier to test.
124
        coalesce = Transport._coalesce_offsets
1864.5.9 by John Arbash Meinel
Switch to returning an object to make the api more understandable.
125
        exp = [_CoalescedOffset(*x) for x in expected]
126
        out = list(coalesce(offsets, limit=limit, fudge_factor=fudge))
127
        self.assertEqual(exp, out)
1864.5.1 by John Arbash Meinel
Change the readv combining algorithm for one that is easier to test.
128
129
    def test_coalesce_empty(self):
130
        self.check([], [])
131
132
    def test_coalesce_simple(self):
133
        self.check([(0, 10, [(0, 10)])], [(0, 10)])
134
135
    def test_coalesce_unrelated(self):
136
        self.check([(0, 10, [(0, 10)]),
137
                    (20, 10, [(0, 10)]),
138
                   ], [(0, 10), (20, 10)])
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
139
            
1864.5.1 by John Arbash Meinel
Change the readv combining algorithm for one that is easier to test.
140
    def test_coalesce_unsorted(self):
141
        self.check([(20, 10, [(0, 10)]),
142
                    (0, 10, [(0, 10)]),
143
                   ], [(20, 10), (0, 10)])
144
145
    def test_coalesce_nearby(self):
146
        self.check([(0, 20, [(0, 10), (10, 10)])],
147
                   [(0, 10), (10, 10)])
148
149
    def test_coalesce_overlapped(self):
150
        self.check([(0, 15, [(0, 10), (5, 10)])],
151
                   [(0, 10), (5, 10)])
152
153
    def test_coalesce_limit(self):
154
        self.check([(10, 50, [(0, 10), (10, 10), (20, 10),
155
                              (30, 10), (40, 10)]),
156
                    (60, 50, [(0, 10), (10, 10), (20, 10),
157
                              (30, 10), (40, 10)]),
158
                   ], [(10, 10), (20, 10), (30, 10), (40, 10),
159
                       (50, 10), (60, 10), (70, 10), (80, 10),
160
                       (90, 10), (100, 10)],
161
                    limit=5)
162
163
    def test_coalesce_no_limit(self):
164
        self.check([(10, 100, [(0, 10), (10, 10), (20, 10),
165
                               (30, 10), (40, 10), (50, 10),
166
                               (60, 10), (70, 10), (80, 10),
167
                               (90, 10)]),
168
                   ], [(10, 10), (20, 10), (30, 10), (40, 10),
169
                       (50, 10), (60, 10), (70, 10), (80, 10),
170
                       (90, 10), (100, 10)])
171
1864.5.3 by John Arbash Meinel
Allow collapsing ranges even if they are just 'close'
172
    def test_coalesce_fudge(self):
173
        self.check([(10, 30, [(0, 10), (20, 10)]),
174
                    (100, 10, [(0, 10),]),
175
                   ], [(10, 10), (30, 10), (100, 10)],
176
                   fudge=10
177
                  )
178
1540.3.3 by Martin Pool
Review updates of pycurl transport
179
1442.1.44 by Robert Collins
Many transport related tweaks:
180
class TestMemoryTransport(TestCase):
181
182
    def test_get_transport(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
183
        MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
184
185
    def test_clone(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
186
        transport = MemoryTransport()
187
        self.assertTrue(isinstance(transport, MemoryTransport))
1910.15.3 by Andrew Bennetts
Make memory transport pass tests.
188
        self.assertEqual("memory:///", transport.clone("/").base)
1442.1.44 by Robert Collins
Many transport related tweaks:
189
190
    def test_abspath(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
191
        transport = MemoryTransport()
1685.1.42 by John Arbash Meinel
A couple more fixes to make sure memory:/// works correctly.
192
        self.assertEqual("memory:///relpath", transport.abspath('relpath'))
1442.1.44 by Robert Collins
Many transport related tweaks:
193
1910.15.1 by Andrew Bennetts
More tests for abspath and clone behaviour
194
    def test_abspath_of_root(self):
195
        transport = MemoryTransport()
196
        self.assertEqual("memory:///", transport.base)
197
        self.assertEqual("memory:///", transport.abspath('/'))
198
2070.3.1 by Andrew Bennetts
Fix memory_transport.abspath('/foo')
199
    def test_abspath_of_relpath_starting_at_root(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
200
        transport = MemoryTransport()
2070.3.1 by Andrew Bennetts
Fix memory_transport.abspath('/foo')
201
        self.assertEqual("memory:///foo", transport.abspath('/foo'))
1442.1.44 by Robert Collins
Many transport related tweaks:
202
203
    def test_append_and_get(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
204
        transport = MemoryTransport()
1955.3.16 by John Arbash Meinel
Switch over to Transport.append_bytes or append_files
205
        transport.append_bytes('path', 'content')
1442.1.44 by Robert Collins
Many transport related tweaks:
206
        self.assertEqual(transport.get('path').read(), 'content')
1955.3.16 by John Arbash Meinel
Switch over to Transport.append_bytes or append_files
207
        transport.append_file('path', StringIO('content'))
1442.1.44 by Robert Collins
Many transport related tweaks:
208
        self.assertEqual(transport.get('path').read(), 'contentcontent')
209
210
    def test_put_and_get(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
211
        transport = MemoryTransport()
1955.3.7 by John Arbash Meinel
Fix the deprecation warnings in the transport tests themselves
212
        transport.put_file('path', StringIO('content'))
1442.1.44 by Robert Collins
Many transport related tweaks:
213
        self.assertEqual(transport.get('path').read(), 'content')
1955.3.7 by John Arbash Meinel
Fix the deprecation warnings in the transport tests themselves
214
        transport.put_bytes('path', 'content')
1442.1.44 by Robert Collins
Many transport related tweaks:
215
        self.assertEqual(transport.get('path').read(), 'content')
216
217
    def test_append_without_dir_fails(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
218
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
219
        self.assertRaises(NoSuchFile,
1955.3.16 by John Arbash Meinel
Switch over to Transport.append_bytes or append_files
220
                          transport.append_bytes, 'dir/path', 'content')
1442.1.44 by Robert Collins
Many transport related tweaks:
221
222
    def test_put_without_dir_fails(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
223
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
224
        self.assertRaises(NoSuchFile,
1955.3.7 by John Arbash Meinel
Fix the deprecation warnings in the transport tests themselves
225
                          transport.put_file, 'dir/path', StringIO('content'))
1442.1.44 by Robert Collins
Many transport related tweaks:
226
227
    def test_get_missing(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
228
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
229
        self.assertRaises(NoSuchFile, transport.get, 'foo')
230
231
    def test_has_missing(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
232
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
233
        self.assertEquals(False, transport.has('foo'))
234
235
    def test_has_present(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
236
        transport = MemoryTransport()
1955.3.16 by John Arbash Meinel
Switch over to Transport.append_bytes or append_files
237
        transport.append_bytes('foo', 'content')
1442.1.44 by Robert Collins
Many transport related tweaks:
238
        self.assertEquals(True, transport.has('foo'))
239
2120.3.1 by John Arbash Meinel
Fix MemoryTransport.list_dir() implementation, and update tests
240
    def test_list_dir(self):
241
        transport = MemoryTransport()
242
        transport.put_bytes('foo', 'content')
243
        transport.mkdir('dir')
244
        transport.put_bytes('dir/subfoo', 'content')
245
        transport.put_bytes('dirlike', 'content')
246
247
        self.assertEquals(['dir', 'dirlike', 'foo'], sorted(transport.list_dir('.')))
248
        self.assertEquals(['subfoo'], sorted(transport.list_dir('dir')))
249
1442.1.44 by Robert Collins
Many transport related tweaks:
250
    def test_mkdir(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
251
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
252
        transport.mkdir('dir')
1955.3.16 by John Arbash Meinel
Switch over to Transport.append_bytes or append_files
253
        transport.append_bytes('dir/path', 'content')
1442.1.44 by Robert Collins
Many transport related tweaks:
254
        self.assertEqual(transport.get('dir/path').read(), 'content')
255
256
    def test_mkdir_missing_parent(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
257
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
258
        self.assertRaises(NoSuchFile,
259
                          transport.mkdir, 'dir/dir')
260
261
    def test_mkdir_twice(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
262
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
263
        transport.mkdir('dir')
264
        self.assertRaises(FileExists, transport.mkdir, 'dir')
1530.1.5 by Robert Collins
Reinstate Memory parameter tests.
265
266
    def test_parameters(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
267
        transport = MemoryTransport()
1530.1.5 by Robert Collins
Reinstate Memory parameter tests.
268
        self.assertEqual(True, transport.listable())
269
        self.assertEqual(False, transport.should_cache())
270
        self.assertEqual(False, transport.is_readonly())
1442.1.44 by Robert Collins
Many transport related tweaks:
271
272
    def test_iter_files_recursive(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
273
        transport = MemoryTransport()
1442.1.44 by Robert Collins
Many transport related tweaks:
274
        transport.mkdir('dir')
1955.3.7 by John Arbash Meinel
Fix the deprecation warnings in the transport tests themselves
275
        transport.put_bytes('dir/foo', 'content')
276
        transport.put_bytes('dir/bar', 'content')
277
        transport.put_bytes('bar', 'content')
1442.1.44 by Robert Collins
Many transport related tweaks:
278
        paths = set(transport.iter_files_recursive())
279
        self.assertEqual(set(['dir/foo', 'dir/bar', 'bar']), paths)
280
281
    def test_stat(self):
1540.3.6 by Martin Pool
[merge] update from bzr.dev
282
        transport = MemoryTransport()
1955.3.7 by John Arbash Meinel
Fix the deprecation warnings in the transport tests themselves
283
        transport.put_bytes('foo', 'content')
284
        transport.put_bytes('bar', 'phowar')
1442.1.44 by Robert Collins
Many transport related tweaks:
285
        self.assertEqual(7, transport.stat('foo').st_size)
286
        self.assertEqual(6, transport.stat('bar').st_size)
1185.35.31 by Aaron Bentley
Throw ConnectionError instead of NoSuchFile except when we get a 404
287
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
288
289
class ChrootDecoratorTransportTest(TestCase):
290
    """Chroot decoration specific tests."""
291
292
    def test_construct(self):
293
        from bzrlib.transport import chroot
294
        transport = chroot.ChrootTransportDecorator('chroot+memory:///pathA/')
295
        self.assertEqual('memory:///pathA/', transport.chroot_url)
296
297
        transport = chroot.ChrootTransportDecorator(
298
            'chroot+memory:///path/B', chroot='memory:///path/')
299
        self.assertEqual('memory:///path/', transport.chroot_url)
300
301
    def test_append_file(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
302
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
303
        self.assertRaises(PathNotChild, transport.append_file, '/foo', None)
304
305
    def test_append_bytes(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
306
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
307
        self.assertRaises(PathNotChild, transport.append_bytes, '/foo', 'bytes')
308
309
    def test_clone(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
310
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
311
        self.assertRaises(PathNotChild, transport.clone, '/foo')
312
313
    def test_delete(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
314
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
315
        self.assertRaises(PathNotChild, transport.delete, '/foo')
316
317
    def test_delete_tree(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
318
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
319
        self.assertRaises(PathNotChild, transport.delete_tree, '/foo')
320
321
    def test_get(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
322
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
323
        self.assertRaises(PathNotChild, transport.get, '/foo')
324
325
    def test_get_bytes(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
326
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
327
        self.assertRaises(PathNotChild, transport.get_bytes, '/foo')
328
329
    def test_has(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
330
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
331
        self.assertRaises(PathNotChild, transport.has, '/foo')
332
333
    def test_list_dir(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
334
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
335
        self.assertRaises(PathNotChild, transport.list_dir, '/foo')
336
337
    def test_lock_read(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
338
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
339
        self.assertRaises(PathNotChild, transport.lock_read, '/foo')
340
341
    def test_lock_write(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
342
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
343
        self.assertRaises(PathNotChild, transport.lock_write, '/foo')
344
345
    def test_mkdir(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
346
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
347
        self.assertRaises(PathNotChild, transport.mkdir, '/foo')
348
349
    def test_put_bytes(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
350
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
351
        self.assertRaises(PathNotChild, transport.put_bytes, '/foo', 'bytes')
352
353
    def test_put_file(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
354
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
355
        self.assertRaises(PathNotChild, transport.put_file, '/foo', None)
356
357
    def test_rename(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
358
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
359
        self.assertRaises(PathNotChild, transport.rename, '/aaa', 'bbb')
360
        self.assertRaises(PathNotChild, transport.rename, 'ccc', '/d')
361
362
    def test_rmdir(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
363
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
364
        self.assertRaises(PathNotChild, transport.rmdir, '/foo')
365
366
    def test_stat(self):
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
367
        transport = get_transport('chroot+memory:///foo/bar')
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
368
        self.assertRaises(PathNotChild, transport.stat, '/foo')
369
2156.2.1 by v.ladeuil+lp at free
Make the tests windows compatible.
370
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
371
class ReadonlyDecoratorTransportTest(TestCase):
372
    """Readonly decoration specific tests."""
373
374
    def test_local_parameters(self):
375
        import bzrlib.transport.readonly as readonly
376
        # connect to . in readonly mode
377
        transport = readonly.ReadonlyTransportDecorator('readonly+.')
378
        self.assertEqual(True, transport.listable())
379
        self.assertEqual(False, transport.should_cache())
380
        self.assertEqual(True, transport.is_readonly())
381
382
    def test_http_parameters(self):
2004.1.25 by v.ladeuil+lp at free
Shuffle http related test code. Hopefully it ends up at the right place :)
383
        from bzrlib.tests.HttpServer import HttpServer
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
384
        import bzrlib.transport.readonly as readonly
385
        # connect to . via http which is not listable
386
        server = HttpServer()
387
        server.setUp()
388
        try:
389
            transport = get_transport('readonly+' + server.get_url())
390
            self.failUnless(isinstance(transport,
391
                                       readonly.ReadonlyTransportDecorator))
392
            self.assertEqual(False, transport.listable())
393
            self.assertEqual(True, transport.should_cache())
394
            self.assertEqual(True, transport.is_readonly())
395
        finally:
396
            server.tearDown()
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
397
398
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
399
class FakeNFSDecoratorTests(TestCaseInTempDir):
400
    """NFS decorator specific tests."""
401
402
    def get_nfs_transport(self, url):
403
        import bzrlib.transport.fakenfs as fakenfs
404
        # connect to url with nfs decoration
405
        return fakenfs.FakeNFSTransportDecorator('fakenfs+' + url)
406
407
    def test_local_parameters(self):
408
        # the listable, should_cache and is_readonly parameters
409
        # are not changed by the fakenfs decorator
410
        transport = self.get_nfs_transport('.')
411
        self.assertEqual(True, transport.listable())
412
        self.assertEqual(False, transport.should_cache())
413
        self.assertEqual(False, transport.is_readonly())
414
415
    def test_http_parameters(self):
416
        # the listable, should_cache and is_readonly parameters
417
        # are not changed by the fakenfs decorator
2004.1.25 by v.ladeuil+lp at free
Shuffle http related test code. Hopefully it ends up at the right place :)
418
        from bzrlib.tests.HttpServer import HttpServer
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
419
        # connect to . via http which is not listable
420
        server = HttpServer()
421
        server.setUp()
422
        try:
423
            transport = self.get_nfs_transport(server.get_url())
424
            self.assertIsInstance(
425
                transport, bzrlib.transport.fakenfs.FakeNFSTransportDecorator)
426
            self.assertEqual(False, transport.listable())
427
            self.assertEqual(True, transport.should_cache())
428
            self.assertEqual(True, transport.is_readonly())
429
        finally:
430
            server.tearDown()
431
432
    def test_fakenfs_server_default(self):
433
        # a FakeNFSServer() should bring up a local relpath server for itself
434
        import bzrlib.transport.fakenfs as fakenfs
435
        server = fakenfs.FakeNFSServer()
436
        server.setUp()
437
        try:
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
438
            # the url should be decorated appropriately
1951.2.3 by Martin Pool
Localtransport cleanup review (john)
439
            self.assertStartsWith(server.get_url(), 'fakenfs+')
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
440
            # and we should be able to get a transport for it
441
            transport = get_transport(server.get_url())
442
            # which must be a FakeNFSTransportDecorator instance.
443
            self.assertIsInstance(
444
                transport, fakenfs.FakeNFSTransportDecorator)
445
        finally:
446
            server.tearDown()
447
448
    def test_fakenfs_rename_semantics(self):
449
        # a FakeNFS transport must mangle the way rename errors occur to
450
        # look like NFS problems.
451
        transport = self.get_nfs_transport('.')
452
        self.build_tree(['from/', 'from/foo', 'to/', 'to/bar'],
453
                        transport=transport)
454
        self.assertRaises(bzrlib.errors.ResourceBusy,
455
                          transport.rename, 'from', 'to')
456
457
1608.2.4 by Martin Pool
[broken] Add FakeFVATTransport
458
class FakeVFATDecoratorTests(TestCaseInTempDir):
459
    """Tests for simulation of VFAT restrictions"""
460
461
    def get_vfat_transport(self, url):
462
        """Return vfat-backed transport for test directory"""
463
        from bzrlib.transport.fakevfat import FakeVFATTransportDecorator
464
        return FakeVFATTransportDecorator('vfat+' + url)
465
466
    def test_transport_creation(self):
467
        from bzrlib.transport.fakevfat import FakeVFATTransportDecorator
468
        transport = self.get_vfat_transport('.')
469
        self.assertIsInstance(transport, FakeVFATTransportDecorator)
470
471
    def test_transport_mkdir(self):
472
        transport = self.get_vfat_transport('.')
473
        transport.mkdir('HELLO')
474
        self.assertTrue(transport.has('hello'))
475
        self.assertTrue(transport.has('Hello'))
476
1608.2.11 by Martin Pool
(FakeVFAT) add test for detection of invalid characters
477
    def test_forbidden_chars(self):
478
        transport = self.get_vfat_transport('.')
479
        self.assertRaises(ValueError, transport.has, "<NU>")
480
481
1540.3.8 by Martin Pool
Some support for falling back between transport implementations.
482
class BadTransportHandler(Transport):
483
    def __init__(self, base_url):
484
        raise DependencyNotPresent('some_lib', 'testing missing dependency')
485
486
487
class BackupTransportHandler(Transport):
488
    """Test transport that works as a backup for the BadTransportHandler"""
1540.3.10 by Martin Pool
[broken] keep hooking pycurl into test framework
489
    pass
1871.1.2 by Robert Collins
Reduce code duplication in transport-parameterised tests.
490
491
492
class TestTransportImplementation(TestCaseInTempDir):
493
    """Implementation verification for transports.
494
    
495
    To verify a transport we need a server factory, which is a callable
496
    that accepts no parameters and returns an implementation of
497
    bzrlib.transport.Server.
498
    
499
    That Server is then used to construct transport instances and test
500
    the transport via loopback activity.
501
502
    Currently this assumes that the Transport object is connected to the 
503
    current working directory.  So that whatever is done 
504
    through the transport, should show up in the working 
505
    directory, and vice-versa. This is a bug, because its possible to have
506
    URL schemes which provide access to something that may not be 
507
    result in storage on the local disk, i.e. due to file system limits, or 
508
    due to it being a database or some other non-filesystem tool.
509
510
    This also tests to make sure that the functions work with both
511
    generators and lists (assuming iter(list) is effectively a generator)
512
    """
513
    
514
    def setUp(self):
515
        super(TestTransportImplementation, self).setUp()
516
        self._server = self.transport_server()
517
        self._server.setUp()
518
519
    def tearDown(self):
520
        super(TestTransportImplementation, self).tearDown()
521
        self._server.tearDown()
522
        
523
    def get_transport(self):
524
        """Return a connected transport to the local directory."""
525
        base_url = self._server.get_url()
526
        # try getting the transport via the regular interface:
527
        t = get_transport(base_url)
1986.2.5 by Robert Collins
Unbreak transport tests.
528
        if not isinstance(t, self.transport_class):
1871.1.2 by Robert Collins
Reduce code duplication in transport-parameterised tests.
529
            # we did not get the correct transport class type. Override the
530
            # regular connection behaviour by direct construction.
531
            t = self.transport_class(base_url)
532
        return t
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
533
534
535
class TestLocalTransports(TestCase):
536
537
    def test_get_transport_from_abspath(self):
538
        here = os.path.abspath('.')
539
        t = get_transport(here)
540
        self.assertIsInstance(t, LocalTransport)
541
        self.assertEquals(t.base, urlutils.local_path_to_url(here) + '/')
542
543
    def test_get_transport_from_relpath(self):
544
        here = os.path.abspath('.')
545
        t = get_transport('.')
546
        self.assertIsInstance(t, LocalTransport)
1951.2.3 by Martin Pool
Localtransport cleanup review (john)
547
        self.assertEquals(t.base, urlutils.local_path_to_url('.') + '/')
1951.2.1 by Martin Pool
Change to using LocalURLServer for testing.
548
549
    def test_get_transport_from_local_url(self):
550
        here = os.path.abspath('.')
551
        here_url = urlutils.local_path_to_url(here) + '/'
552
        t = get_transport(here_url)
553
        self.assertIsInstance(t, LocalTransport)
554
        self.assertEquals(t.base, here_url)
2245.6.1 by Alexander Belchenko
win32 UNC path: recursive cloning UNC path to root stops on //HOST, not on //
555
556
557
class TestWin32LocalTransport(TestCase):
558
559
    def test_unc_clone_to_root(self):
560
        # Win32 UNC path like \\HOST\path
561
        # clone to root should stop at least at \\HOST part
562
        # not on \\
2245.6.2 by Alexander Belchenko
Fix name of emulated Win32LocalTransport as Robert suggested.
563
        t = EmulatedWin32LocalTransport('file://HOST/path/to/some/dir/')
2245.6.1 by Alexander Belchenko
win32 UNC path: recursive cloning UNC path to root stops on //HOST, not on //
564
        for i in xrange(4):
565
            t = t.clone('..')
566
        self.assertEquals(t.base, 'file://HOST/')
567
        # make sure we reach the root
568
        t = t.clone('..')
569
        self.assertEquals(t.base, 'file://HOST/')