/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
1
# Copyright (C) 2006-2012, 2015, 2016 Canonical Ltd
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
2
#
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.
7
#
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.
12
#
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
16
17
"""Tests for the urlutils wrapper."""
18
19
import os
20
import sys
21
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
22
from .. import osutils, urlutils, win32utils
23
from ..errors import (
6240.4.2 by Jelmer Vernooij
Moar tests.
24
    PathNotChild,
25
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
26
from . import features, TestCaseInTempDir, TestCase, TestSkipped
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
27
28
29
class TestUrlToPath(TestCase):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
30
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
31
    def test_basename(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
32
        # breezy.urlutils.basename
33
        # Test breezy.urlutils.split()
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
34
        basename = urlutils.basename
35
        if sys.platform == 'win32':
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
36
            self.assertRaises(urlutils.InvalidURL, basename,
37
                    'file:///path/to/foo')
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
38
            self.assertEqual('foo', basename('file:///C|/foo'))
1685.1.78 by Wouter van Heyst
more code cleanup
39
            self.assertEqual('foo', basename('file:///C:/foo'))
40
            self.assertEqual('', basename('file:///C:/'))
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
41
        else:
42
            self.assertEqual('foo', basename('file:///foo'))
43
            self.assertEqual('', basename('file:///'))
44
45
        self.assertEqual('foo', basename('http://host/path/to/foo'))
46
        self.assertEqual('foo', basename('http://host/path/to/foo/'))
47
        self.assertEqual('',
48
            basename('http://host/path/to/foo/', exclude_trailing_slash=False))
49
        self.assertEqual('path', basename('http://host/path'))
50
        self.assertEqual('', basename('http://host/'))
51
        self.assertEqual('', basename('http://host'))
52
        self.assertEqual('path', basename('http:///nohost/path'))
53
54
        self.assertEqual('path', basename('random+scheme://user:pass@ahost:port/path'))
55
        self.assertEqual('path', basename('random+scheme://user:pass@ahost:port/path/'))
56
        self.assertEqual('', basename('random+scheme://user:pass@ahost:port/'))
57
58
        # relative paths
59
        self.assertEqual('foo', basename('path/to/foo'))
60
        self.assertEqual('foo', basename('path/to/foo/'))
61
        self.assertEqual('', basename('path/to/foo/',
62
            exclude_trailing_slash=False))
63
        self.assertEqual('foo', basename('path/../foo'))
64
        self.assertEqual('foo', basename('../path/foo'))
65
1685.1.51 by John Arbash Meinel
Working on getting normalize_url working.
66
    def test_normalize_url_files(self):
67
        # Test that local paths are properly normalized
68
        normalize_url = urlutils.normalize_url
69
70
        def norm_file(expected, path):
71
            url = normalize_url(path)
72
            self.assertStartsWith(url, 'file:///')
73
            if sys.platform == 'win32':
74
                url = url[len('file:///C:'):]
75
            else:
76
                url = url[len('file://'):]
77
1685.1.53 by John Arbash Meinel
Updated normalize_url
78
            self.assertEndsWith(url, expected)
1685.1.51 by John Arbash Meinel
Working on getting normalize_url working.
79
80
        norm_file('path/to/foo', 'path/to/foo')
81
        norm_file('/path/to/foo', '/path/to/foo')
82
        norm_file('path/to/foo', '../path/to/foo')
83
84
        # Local paths are assumed to *not* be escaped at all
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
85
        try:
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
86
            u'uni/\xb5'.encode(osutils.get_user_encoding())
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
87
        except UnicodeError:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
88
            # locale cannot handle unicode
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
89
            pass
90
        else:
91
            norm_file('uni/%C2%B5', u'uni/\xb5')
92
1685.1.51 by John Arbash Meinel
Working on getting normalize_url working.
93
        norm_file('uni/%25C2%25B5', u'uni/%C2%B5')
94
        norm_file('uni/%20b', u'uni/ b')
95
        # All the crazy characters get escaped in local paths => file:/// urls
1711.4.4 by John Arbash Meinel
Fix some broken tests because of stupid ntpath.abspath behavior
96
        # The ' ' character must not be at the end, because on win32
97
        # it gets stripped off by ntpath.abspath
5268.7.4 by Jelmer Vernooij
Only skip escaping , and = when actually necessary.
98
        norm_file('%27%20%3B/%3F%3A%40%26%3D%2B%24%2C%23', "' ;/?:@&=+$,#")
1685.1.51 by John Arbash Meinel
Working on getting normalize_url working.
99
100
    def test_normalize_url_hybrid(self):
101
        # Anything with a scheme:// should be treated as a hybrid url
102
        # which changes what characters get escaped.
103
        normalize_url = urlutils.normalize_url
104
105
        eq = self.assertEqual
106
        eq('file:///foo/', normalize_url(u'file:///foo/'))
107
        eq('file:///foo/%20', normalize_url(u'file:///foo/ '))
108
        eq('file:///foo/%20', normalize_url(u'file:///foo/%20'))
109
        # Don't escape reserved characters
110
        eq('file:///ab_c.d-e/%f:?g&h=i+j;k,L#M$',
111
            normalize_url('file:///ab_c.d-e/%f:?g&h=i+j;k,L#M$'))
112
        eq('http://ab_c.d-e/%f:?g&h=i+j;k,L#M$',
113
            normalize_url('http://ab_c.d-e/%f:?g&h=i+j;k,L#M$'))
114
115
        # Escape unicode characters, but not already escaped chars
116
        eq('http://host/ab/%C2%B5/%C2%B5',
117
            normalize_url(u'http://host/ab/%C2%B5/\xb5'))
118
2208.4.1 by Andrew Bennetts
normalize_url should normalise escaping of unreserved characters, like '~'.
119
        # Unescape characters that don't need to be escaped
120
        eq('http://host/~bob%2525-._',
121
                normalize_url('http://host/%7Ebob%2525%2D%2E%5F'))
122
        eq('http://host/~bob%2525-._',
123
                normalize_url(u'http://host/%7Ebob%2525%2D%2E%5F'))
124
1685.1.51 by John Arbash Meinel
Working on getting normalize_url working.
125
        # Normalize verifies URLs when they are not unicode
126
        # (indicating they did not come from the user)
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
127
        self.assertRaises(urlutils.InvalidURL, normalize_url,
128
                'http://host/\xb5')
129
        self.assertRaises(urlutils.InvalidURL, normalize_url, 'http://host/ ')
1685.1.50 by John Arbash Meinel
Added an re for handling scheme paths.
130
131
    def test_url_scheme_re(self):
132
        # Test paths that may be URLs
133
        def test_one(url, scheme_and_path):
134
            """Assert that _url_scheme_re correctly matches
135
136
            :param scheme_and_path: The (scheme, path) that should be matched
137
                can be None, to indicate it should not match
138
            """
139
            m = urlutils._url_scheme_re.match(url)
140
            if scheme_and_path is None:
141
                self.assertEqual(None, m)
142
            else:
143
                self.assertEqual(scheme_and_path[0], m.group('scheme'))
144
                self.assertEqual(scheme_and_path[1], m.group('path'))
145
146
        # Local paths
147
        test_one('/path', None)
148
        test_one('C:/path', None)
149
        test_one('../path/to/foo', None)
150
        test_one(u'../path/to/fo\xe5', None)
151
152
        # Real URLS
153
        test_one('http://host/path/', ('http', 'host/path/'))
154
        test_one('sftp://host/path/to/foo', ('sftp', 'host/path/to/foo'))
155
        test_one('file:///usr/bin', ('file', '/usr/bin'))
156
        test_one('file:///C:/Windows', ('file', '/C:/Windows'))
157
        test_one('file:///C|/Windows', ('file', '/C|/Windows'))
158
        test_one(u'readonly+sftp://host/path/\xe5', ('readonly+sftp', u'host/path/\xe5'))
159
160
        # Weird stuff
161
        # Can't have slashes or colons in the scheme
162
        test_one('/path/to/://foo', None)
5254.1.5 by Gordon Tyler
Fixes according to spiv's review.
163
        test_one('scheme:stuff://foo', ('scheme', 'stuff://foo'))
1685.1.50 by John Arbash Meinel
Added an re for handling scheme paths.
164
        # Must have more than one character for scheme
165
        test_one('C://foo', None)
166
        test_one('ab://foo', ('ab', 'foo'))
167
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
168
    def test_dirname(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
169
        # Test breezy.urlutils.dirname()
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
170
        dirname = urlutils.dirname
171
        if sys.platform == 'win32':
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
172
            self.assertRaises(urlutils.InvalidURL, dirname,
173
                'file:///path/to/foo')
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
174
            self.assertEqual('file:///C|/', dirname('file:///C|/foo'))
175
            self.assertEqual('file:///C|/', dirname('file:///C|/'))
176
        else:
177
            self.assertEqual('file:///', dirname('file:///foo'))
178
            self.assertEqual('file:///', dirname('file:///'))
179
180
        self.assertEqual('http://host/path/to', dirname('http://host/path/to/foo'))
181
        self.assertEqual('http://host/path/to', dirname('http://host/path/to/foo/'))
182
        self.assertEqual('http://host/path/to/foo',
183
            dirname('http://host/path/to/foo/', exclude_trailing_slash=False))
184
        self.assertEqual('http://host/', dirname('http://host/path'))
185
        self.assertEqual('http://host/', dirname('http://host/'))
186
        self.assertEqual('http://host', dirname('http://host'))
187
        self.assertEqual('http:///nohost', dirname('http:///nohost/path'))
188
189
        self.assertEqual('random+scheme://user:pass@ahost:port/',
190
            dirname('random+scheme://user:pass@ahost:port/path'))
191
        self.assertEqual('random+scheme://user:pass@ahost:port/',
192
            dirname('random+scheme://user:pass@ahost:port/path/'))
193
        self.assertEqual('random+scheme://user:pass@ahost:port/',
194
            dirname('random+scheme://user:pass@ahost:port/'))
195
196
        # relative paths
197
        self.assertEqual('path/to', dirname('path/to/foo'))
198
        self.assertEqual('path/to', dirname('path/to/foo/'))
199
        self.assertEqual('path/to/foo',
200
            dirname('path/to/foo/', exclude_trailing_slash=False))
201
        self.assertEqual('path/..', dirname('path/../foo'))
202
        self.assertEqual('../path', dirname('../path/foo'))
5254.2.1 by Gordon Tyler
Fixed how get_transport's convert_path_to_url tests whether a path is actually a URL.
203
    
204
    def test_is_url(self):
205
        self.assertTrue(urlutils.is_url('http://foo/bar'))
206
        self.assertTrue(urlutils.is_url('bzr+ssh://foo/bar'))
207
        self.assertTrue(urlutils.is_url('lp:foo/bar'))
208
        self.assertTrue(urlutils.is_url('file:///foo/bar'))
209
        self.assertFalse(urlutils.is_url(''))
210
        self.assertFalse(urlutils.is_url('foo'))
211
        self.assertFalse(urlutils.is_url('foo/bar'))
212
        self.assertFalse(urlutils.is_url('/foo'))
213
        self.assertFalse(urlutils.is_url('/foo/bar'))
214
        self.assertFalse(urlutils.is_url('C:/'))
215
        self.assertFalse(urlutils.is_url('C:/foo'))
5254.2.5 by Andrew Bennetts
Revert debugging change accidentally committed by Gordon Tyler.
216
        self.assertFalse(urlutils.is_url('C:/foo/bar'))
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
217
1685.1.55 by John Arbash Meinel
Adding bzrlib.urlutils.join() to handle joining URLs
218
    def test_join(self):
219
        def test(expected, *args):
220
            joined = urlutils.join(*args)
221
            self.assertEqual(expected, joined)
222
223
        # Test relative path joining
2018.5.100 by Andrew Bennetts
Fix IndexError in urlutils.join with 'http://host/a' and '../../b'.
224
        test('foo', 'foo') # relative fragment with nothing is preserved.
1685.1.55 by John Arbash Meinel
Adding bzrlib.urlutils.join() to handle joining URLs
225
        test('foo/bar', 'foo', 'bar')
226
        test('http://foo/bar', 'http://foo', 'bar')
227
        test('http://foo/bar', 'http://foo', '.', 'bar')
228
        test('http://foo/baz', 'http://foo', 'bar', '../baz')
229
        test('http://foo/bar/baz', 'http://foo', 'bar/baz')
230
        test('http://foo/baz', 'http://foo', 'bar/../baz')
2018.5.93 by Andrew Bennetts
Fix another bug in urlutils.join.
231
        test('http://foo/baz', 'http://foo/bar/', '../baz')
5254.1.1 by Gordon Tyler
Added support to urlutils for URLs such as Launchpad's lp:foobar.
232
        test('lp:foo/bar', 'lp:foo', 'bar')
233
        test('lp:foo/bar/baz', 'lp:foo', 'bar/baz')
1685.1.55 by John Arbash Meinel
Adding bzrlib.urlutils.join() to handle joining URLs
234
235
        # Absolute paths
2018.5.100 by Andrew Bennetts
Fix IndexError in urlutils.join with 'http://host/a' and '../../b'.
236
        test('http://foo', 'http://foo') # abs url with nothing is preserved.
1685.1.55 by John Arbash Meinel
Adding bzrlib.urlutils.join() to handle joining URLs
237
        test('http://bar', 'http://foo', 'http://bar')
238
        test('sftp://bzr/foo', 'http://foo', 'bar', 'sftp://bzr/foo')
239
        test('file:///bar', 'foo', 'file:///bar')
2018.5.92 by Andrew Bennetts
Small bugfix to urlutils.join: join('anything', 'http://bar/a/') should not strip the trailing slash.
240
        test('http://bar/', 'http://foo', 'http://bar/')
241
        test('http://bar/a', 'http://foo', 'http://bar/a')
242
        test('http://bar/a/', 'http://foo', 'http://bar/a/')
5254.1.1 by Gordon Tyler
Added support to urlutils for URLs such as Launchpad's lp:foobar.
243
        test('lp:bar', 'http://foo', 'lp:bar')
244
        test('lp:bar', 'lp:foo', 'lp:bar')
245
        test('file:///stuff', 'lp:foo', 'file:///stuff')
1711.2.49 by John Arbash Meinel
urlutils.join should work for root paths.
246
247
        # From a base path
248
        test('file:///foo', 'file:///', 'foo')
249
        test('file:///bar/foo', 'file:///bar/', 'foo')
250
        test('http://host/foo', 'http://host/', 'foo')
251
        test('http://host/', 'http://host', '')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
252
1685.1.55 by John Arbash Meinel
Adding bzrlib.urlutils.join() to handle joining URLs
253
        # Invalid joinings
254
        # Cannot go above root
2018.5.100 by Andrew Bennetts
Fix IndexError in urlutils.join with 'http://host/a' and '../../b'.
255
        # Implicitly at root:
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
256
        self.assertRaises(urlutils.InvalidURLJoin, urlutils.join,
1685.1.55 by John Arbash Meinel
Adding bzrlib.urlutils.join() to handle joining URLs
257
                'http://foo', '../baz')
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
258
        self.assertRaises(urlutils.InvalidURLJoin, urlutils.join,
2018.5.54 by Andrew Bennetts
Fix ChrootTransportDecorator's abspath method to be consistent with its clone
259
                'http://foo', '/..')
2018.5.100 by Andrew Bennetts
Fix IndexError in urlutils.join with 'http://host/a' and '../../b'.
260
        # Joining from a path explicitly under the root.
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
261
        self.assertRaises(urlutils.InvalidURLJoin, urlutils.join,
2018.5.100 by Andrew Bennetts
Fix IndexError in urlutils.join with 'http://host/a' and '../../b'.
262
                'http://foo/a', '../../b')
2379.1.1 by Robert Collins
urlutils improvements from hpss.
263
2018.5.46 by Andrew Bennetts
Fix ChrootTransportDecorator's clone to pass less surprising offsets to the decorated transport's clone.
264
    def test_joinpath(self):
265
        def test(expected, *args):
266
            joined = urlutils.joinpath(*args)
267
            self.assertEqual(expected, joined)
268
269
        # Test a single element
270
        test('foo', 'foo')
271
272
        # Test relative path joining
273
        test('foo/bar', 'foo', 'bar')
274
        test('foo/bar', 'foo', '.', 'bar')
275
        test('foo/baz', 'foo', 'bar', '../baz')
276
        test('foo/bar/baz', 'foo', 'bar/baz')
277
        test('foo/baz', 'foo', 'bar/../baz')
278
279
        # Test joining to an absolute path
280
        test('/foo', '/foo')
281
        test('/foo', '/foo', '.')
282
        test('/foo/bar', '/foo', 'bar')
283
        test('/', '/foo', '..')
284
285
        # Test joining with an absolute path
286
        test('/bar', 'foo', '/bar')
2018.5.53 by Andrew Bennetts
Small fix to urlutils.joinpath that was causing a misbehaviour in
287
288
        # Test joining to a path with a trailing slash
289
        test('foo/bar', 'foo/', 'bar')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
290
2018.5.46 by Andrew Bennetts
Fix ChrootTransportDecorator's clone to pass less surprising offsets to the decorated transport's clone.
291
        # Invalid joinings
292
        # Cannot go above root
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
293
        self.assertRaises(urlutils.InvalidURLJoin, urlutils.joinpath, '/',
294
                '../baz')
295
        self.assertRaises(urlutils.InvalidURLJoin, urlutils.joinpath, '/',
296
                '..')
297
        self.assertRaises(urlutils.InvalidURLJoin, urlutils.joinpath, '/',
298
                '/..')
2018.5.46 by Andrew Bennetts
Fix ChrootTransportDecorator's clone to pass less surprising offsets to the decorated transport's clone.
299
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
300
    def test_join_segment_parameters_raw(self):
301
        join_segment_parameters_raw = urlutils.join_segment_parameters_raw
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
302
        self.assertEqual("/somedir/path", 
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
303
            join_segment_parameters_raw("/somedir/path"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
304
        self.assertEqual("/somedir/path,rawdata", 
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
305
            join_segment_parameters_raw("/somedir/path", "rawdata"))
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
306
        self.assertRaises(urlutils.InvalidURLJoin,
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
307
            join_segment_parameters_raw, "/somedir/path",
308
                "rawdata1,rawdata2,rawdata3")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
309
        self.assertEqual("/somedir/path,bla,bar",
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
310
            join_segment_parameters_raw("/somedir/path", "bla", "bar"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
311
        self.assertEqual("/somedir,exist=some/path,bla,bar",
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
312
            join_segment_parameters_raw("/somedir,exist=some/path",
313
                "bla", "bar"))
5163.2.7 by Jelmer Vernooij
Add type checking.
314
        self.assertRaises(TypeError, join_segment_parameters_raw, 
315
            "/somepath", 42)
5163.2.2 by Jelmer Vernooij
Add bzrlib.urlutils.join_subsegments.
316
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
317
    def test_join_segment_parameters(self):
318
        join_segment_parameters = urlutils.join_segment_parameters
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
319
        self.assertEqual("/somedir/path", 
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
320
            join_segment_parameters("/somedir/path", {}))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
321
        self.assertEqual("/somedir/path,key1=val1", 
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
322
            join_segment_parameters("/somedir/path", {"key1": "val1"}))
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
323
        self.assertRaises(urlutils.InvalidURLJoin,
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
324
            join_segment_parameters, "/somedir/path",
325
            {"branch": "brr,brr,brr"})
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
326
        self.assertRaises(urlutils.InvalidURLJoin,
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
327
            join_segment_parameters, "/somedir/path", {"key1=val1": "val2"})
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
328
        self.assertEqual("/somedir/path,key1=val1,key2=val2",
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
329
            join_segment_parameters("/somedir/path", {
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
330
                "key1": "val1", "key2": "val2"}))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
331
        self.assertEqual("/somedir/path,key1=val1,key2=val2",
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
332
            join_segment_parameters("/somedir/path,key1=val1", {
333
                "key2": "val2"}))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
334
        self.assertEqual("/somedir/path,key1=val2",
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
335
            join_segment_parameters("/somedir/path,key1=val1", {
336
                "key1": "val2"}))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
337
        self.assertEqual("/somedir,exist=some/path,key1=val1",
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
338
            join_segment_parameters("/somedir,exist=some/path",
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
339
                {"key1": "val1"}))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
340
        self.assertEqual("/,key1=val1,key2=val2",
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
341
            join_segment_parameters("/,key1=val1", {"key2": "val2"}))
5163.2.7 by Jelmer Vernooij
Add type checking.
342
        self.assertRaises(TypeError,
343
            join_segment_parameters, "/,key1=val1", {"foo": 42})
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
344
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
345
    def test_function_type(self):
346
        if sys.platform == 'win32':
5268.7.21 by Jelmer Vernooij
Cope with segment parameters in urls.
347
            self.assertEqual(urlutils._win32_local_path_to_url,
348
                urlutils.local_path_to_url)
349
            self.assertEqual(urlutils._win32_local_path_from_url,
350
                urlutils.local_path_from_url)
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
351
        else:
5268.7.21 by Jelmer Vernooij
Cope with segment parameters in urls.
352
            self.assertEqual(urlutils._posix_local_path_to_url,
353
                urlutils.local_path_to_url)
354
            self.assertEqual(urlutils._posix_local_path_from_url,
355
                urlutils.local_path_from_url)
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
356
357
    def test_posix_local_path_to_url(self):
358
        to_url = urlutils._posix_local_path_to_url
359
        self.assertEqual('file:///path/to/foo',
360
            to_url('/path/to/foo'))
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
361
5268.7.4 by Jelmer Vernooij
Only skip escaping , and = when actually necessary.
362
        self.assertEqual('file:///path/to/foo%2Cbar',
363
            to_url('/path/to/foo,bar'))
364
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
365
        try:
366
            result = to_url(u'/path/to/r\xe4ksm\xf6rg\xe5s')
367
        except UnicodeError:
368
            raise TestSkipped("local encoding cannot handle unicode")
369
370
        self.assertEqual('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
3234.3.1 by Alexander Belchenko
ensure that local_path_to_url() always returns plain string, not unicode.
371
        self.assertFalse(isinstance(result, unicode))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
372
373
    def test_posix_local_path_from_url(self):
374
        from_url = urlutils._posix_local_path_from_url
375
        self.assertEqual('/path/to/foo',
376
            from_url('file:///path/to/foo'))
5268.7.21 by Jelmer Vernooij
Cope with segment parameters in urls.
377
        self.assertEqual('/path/to/foo',
378
            from_url('file:///path/to/foo,branch=foo'))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
379
        self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
380
            from_url('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
381
        self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
382
            from_url('file:///path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
4828.1.1 by Michael Hudson
test and fix
383
        self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
384
            from_url('file://localhost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
385
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
386
        self.assertRaises(urlutils.InvalidURL, from_url, '/path/to/foo')
4828.1.1 by Michael Hudson
test and fix
387
        self.assertRaises(
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
388
            urlutils.InvalidURL, from_url,
4828.1.1 by Michael Hudson
test and fix
389
            'file://remotehost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
390
391
    def test_win32_local_path_to_url(self):
392
        to_url = urlutils._win32_local_path_to_url
1711.4.28 by John Arbash Meinel
Update the test suite for Alexander's patch.
393
        self.assertEqual('file:///C:/path/to/foo',
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
394
            to_url('C:/path/to/foo'))
1711.4.4 by John Arbash Meinel
Fix some broken tests because of stupid ntpath.abspath behavior
395
        # BOGUS: on win32, ntpath.abspath will strip trailing
396
        #       whitespace, so this will always fail
397
        #       Though under linux, it fakes abspath support
398
        #       and thus will succeed
399
        # self.assertEqual('file:///C:/path/to/foo%20',
400
        #     to_url('C:/path/to/foo '))
1711.4.28 by John Arbash Meinel
Update the test suite for Alexander's patch.
401
        self.assertEqual('file:///C:/path/to/f%20oo',
1711.4.4 by John Arbash Meinel
Fix some broken tests because of stupid ntpath.abspath behavior
402
            to_url('C:/path/to/f oo'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
403
3503.1.2 by adwi2
Permits Windows to serve all paths on all drives.
404
        self.assertEqual('file:///', to_url('/'))
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
405
5268.7.4 by Jelmer Vernooij
Only skip escaping , and = when actually necessary.
406
        self.assertEqual('file:///C:/path/to/foo%2Cbar',
407
            to_url('C:/path/to/foo,bar'))
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
408
        try:
409
            result = to_url(u'd:/path/to/r\xe4ksm\xf6rg\xe5s')
410
        except UnicodeError:
411
            raise TestSkipped("local encoding cannot handle unicode")
412
1711.4.28 by John Arbash Meinel
Update the test suite for Alexander's patch.
413
        self.assertEqual('file:///D:/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
3234.3.1 by Alexander Belchenko
ensure that local_path_to_url() always returns plain string, not unicode.
414
        self.assertFalse(isinstance(result, unicode))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
415
2162.2.1 by Alexander Belchenko
Testing UNC path conversion
416
    def test_win32_unc_path_to_url(self):
6603.1.2 by Vincent Ladeuil
Skip the windows tests when not running on windows.
417
        self.requireFeature(features.win32_feature)
2162.2.1 by Alexander Belchenko
Testing UNC path conversion
418
        to_url = urlutils._win32_local_path_to_url
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
419
        self.assertEqual('file://HOST/path',
2162.2.1 by Alexander Belchenko
Testing UNC path conversion
420
            to_url(r'\\HOST\path'))
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
421
        self.assertEqual('file://HOST/path',
2162.2.1 by Alexander Belchenko
Testing UNC path conversion
422
            to_url('//HOST/path'))
423
2162.2.5 by Alexander Belchenko
Expand test_win32_unc_path_to_url to check unicode
424
        try:
425
            result = to_url(u'//HOST/path/to/r\xe4ksm\xf6rg\xe5s')
426
        except UnicodeError:
427
            raise TestSkipped("local encoding cannot handle unicode")
428
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
429
        self.assertEqual('file://HOST/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
3234.3.1 by Alexander Belchenko
ensure that local_path_to_url() always returns plain string, not unicode.
430
        self.assertFalse(isinstance(result, unicode))
2162.2.5 by Alexander Belchenko
Expand test_win32_unc_path_to_url to check unicode
431
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
432
    def test_win32_local_path_from_url(self):
433
        from_url = urlutils._win32_local_path_from_url
1711.4.28 by John Arbash Meinel
Update the test suite for Alexander's patch.
434
        self.assertEqual('C:/path/to/foo',
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
435
            from_url('file:///C|/path/to/foo'))
1711.4.28 by John Arbash Meinel
Update the test suite for Alexander's patch.
436
        self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
437
            from_url('file:///d|/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
1711.4.28 by John Arbash Meinel
Update the test suite for Alexander's patch.
438
        self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
1685.1.79 by Wouter van Heyst
cleanup urlutils
439
            from_url('file:///d:/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
3503.1.2 by adwi2
Permits Windows to serve all paths on all drives.
440
        self.assertEqual('/', from_url('file:///'))
5268.7.21 by Jelmer Vernooij
Cope with segment parameters in urls.
441
        self.assertEqual('C:/path/to/foo',
442
            from_url('file:///C|/path/to/foo,branch=foo'))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
443
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
444
        self.assertRaises(urlutils.InvalidURL, from_url, 'file:///C:')
445
        self.assertRaises(urlutils.InvalidURL, from_url, 'file:///c')
446
        self.assertRaises(urlutils.InvalidURL, from_url, '/path/to/foo')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
447
        # Not a valid _win32 url, no drive letter
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
448
        self.assertRaises(urlutils.InvalidURL, from_url, 'file:///path/to/foo')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
449
2162.2.1 by Alexander Belchenko
Testing UNC path conversion
450
    def test_win32_unc_path_from_url(self):
451
        from_url = urlutils._win32_local_path_from_url
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
452
        self.assertEqual('//HOST/path', from_url('file://HOST/path'))
5268.7.21 by Jelmer Vernooij
Cope with segment parameters in urls.
453
        self.assertEqual('//HOST/path',
454
            from_url('file://HOST/path,branch=foo'))
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
455
        # despite IE allows 2, 4, 5 and 6 slashes in URL to another machine
456
        # we want to use only 2 slashes
457
        # Firefox understand only 5 slashes in URL, but it's ugly
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
458
        self.assertRaises(urlutils.InvalidURL, from_url, 'file:////HOST/path')
459
        self.assertRaises(urlutils.InvalidURL, from_url, 'file://///HOST/path')
460
        self.assertRaises(urlutils.InvalidURL, from_url, 'file://////HOST/path')
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
461
        # check for file://C:/ instead of file:///C:/
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
462
        self.assertRaises(urlutils.InvalidURL, from_url, 'file://C:/path')
2162.2.1 by Alexander Belchenko
Testing UNC path conversion
463
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
464
    def test_win32_extract_drive_letter(self):
1711.2.43 by John Arbash Meinel
Split out win32 specific code so that it can be tested on all platforms.
465
        extract = urlutils._win32_extract_drive_letter
466
        self.assertEqual(('file:///C:', '/foo'), extract('file://', '/C:/foo'))
467
        self.assertEqual(('file:///d|', '/path'), extract('file://', '/d|/path'))
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
468
        self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/path')
6123.3.1 by Martin
More comprehensive testing for urlutils._win32_extract_drive_letter
469
        # Root drives without slash treated as invalid, see bug #841322
470
        self.assertEqual(('file:///C:', '/'), extract('file://', '/C:/'))
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
471
        self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/C:')
6123.3.1 by Martin
More comprehensive testing for urlutils._win32_extract_drive_letter
472
        # Invalid without drive separator or following forward slash
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
473
        self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/C')
474
        self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/C:ool')
1711.2.43 by John Arbash Meinel
Split out win32 specific code so that it can be tested on all platforms.
475
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
476
    def test_split(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
477
        # Test breezy.urlutils.split()
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
478
        split = urlutils.split
479
        if sys.platform == 'win32':
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
480
            self.assertRaises(urlutils.InvalidURL, split, 'file:///path/to/foo')
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
481
            self.assertEqual(('file:///C|/', 'foo'), split('file:///C|/foo'))
1685.1.79 by Wouter van Heyst
cleanup urlutils
482
            self.assertEqual(('file:///C:/', ''), split('file:///C:/'))
1685.1.49 by John Arbash Meinel
Added bzrlib.urlutils.split and basename + dirname
483
        else:
484
            self.assertEqual(('file:///', 'foo'), split('file:///foo'))
485
            self.assertEqual(('file:///', ''), split('file:///'))
486
487
        self.assertEqual(('http://host/path/to', 'foo'), split('http://host/path/to/foo'))
488
        self.assertEqual(('http://host/path/to', 'foo'), split('http://host/path/to/foo/'))
489
        self.assertEqual(('http://host/path/to/foo', ''),
490
            split('http://host/path/to/foo/', exclude_trailing_slash=False))
491
        self.assertEqual(('http://host/', 'path'), split('http://host/path'))
492
        self.assertEqual(('http://host/', ''), split('http://host/'))
493
        self.assertEqual(('http://host', ''), split('http://host'))
494
        self.assertEqual(('http:///nohost', 'path'), split('http:///nohost/path'))
495
496
        self.assertEqual(('random+scheme://user:pass@ahost:port/', 'path'),
497
            split('random+scheme://user:pass@ahost:port/path'))
498
        self.assertEqual(('random+scheme://user:pass@ahost:port/', 'path'),
499
            split('random+scheme://user:pass@ahost:port/path/'))
500
        self.assertEqual(('random+scheme://user:pass@ahost:port/', ''),
501
            split('random+scheme://user:pass@ahost:port/'))
502
503
        # relative paths
504
        self.assertEqual(('path/to', 'foo'), split('path/to/foo'))
505
        self.assertEqual(('path/to', 'foo'), split('path/to/foo/'))
506
        self.assertEqual(('path/to/foo', ''),
507
            split('path/to/foo/', exclude_trailing_slash=False))
508
        self.assertEqual(('path/..', 'foo'), split('path/../foo'))
509
        self.assertEqual(('../path', 'foo'), split('../path/foo'))
510
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
511
    def test_split_segment_parameters_raw(self):
512
        split_segment_parameters_raw = urlutils.split_segment_parameters_raw
6278.1.2 by Martin Packman
Comment which checks tests for split_segment_parameters are actually doing currently
513
        # Check relative references with absolute paths
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
514
        self.assertEqual(("/some/path", []),
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
515
            split_segment_parameters_raw("/some/path"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
516
        self.assertEqual(("/some/path", ["tip"]),
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
517
            split_segment_parameters_raw("/some/path,tip"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
518
        self.assertEqual(("/some,dir/path", ["tip"]),
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
519
            split_segment_parameters_raw("/some,dir/path,tip"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
520
        self.assertEqual(("/somedir/path", ["heads%2Ftip"]),
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
521
            split_segment_parameters_raw("/somedir/path,heads%2Ftip"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
522
        self.assertEqual(("/somedir/path", ["heads%2Ftip", "bar"]),
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
523
            split_segment_parameters_raw("/somedir/path,heads%2Ftip,bar"))
6278.1.2 by Martin Packman
Comment which checks tests for split_segment_parameters are actually doing currently
524
        # Check relative references with relative paths
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
525
        self.assertEqual(("", ["key1=val1"]),
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
526
            split_segment_parameters_raw(",key1=val1"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
527
        self.assertEqual(("foo/", ["key1=val1"]),
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
528
            split_segment_parameters_raw("foo/,key1=val1"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
529
        self.assertEqual(("foo", ["key1=val1"]),
5268.7.21 by Jelmer Vernooij
Cope with segment parameters in urls.
530
            split_segment_parameters_raw("foo,key1=val1"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
531
        self.assertEqual(("foo/base,la=bla/other/elements", []),
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
532
            split_segment_parameters_raw("foo/base,la=bla/other/elements"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
533
        self.assertEqual(("foo/base,la=bla/other/elements", ["a=b"]),
5163.2.5 by Jelmer Vernooij
rename {split,join}_subsegments -> {split,join}_segment_parameters_raw and add more tests.
534
            split_segment_parameters_raw("foo/base,la=bla/other/elements,a=b"))
6278.1.2 by Martin Packman
Comment which checks tests for split_segment_parameters are actually doing currently
535
        # TODO: Check full URLs as well as relative references
5163.2.1 by Jelmer Vernooij
Add urlutils.split_subsegments.
536
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
537
    def test_split_segment_parameters(self):
538
        split_segment_parameters = urlutils.split_segment_parameters
6278.1.2 by Martin Packman
Comment which checks tests for split_segment_parameters are actually doing currently
539
        # Check relative references with absolute paths
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
540
        self.assertEqual(("/some/path", {}),
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
541
            split_segment_parameters("/some/path"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
542
        self.assertEqual(("/some/path", {"branch": "tip"}),
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
543
            split_segment_parameters("/some/path,branch=tip"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
544
        self.assertEqual(("/some,dir/path", {"branch": "tip"}),
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
545
            split_segment_parameters("/some,dir/path,branch=tip"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
546
        self.assertEqual(("/somedir/path", {"ref": "heads%2Ftip"}),
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
547
            split_segment_parameters("/somedir/path,ref=heads%2Ftip"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
548
        self.assertEqual(("/somedir/path",
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
549
            {"ref": "heads%2Ftip", "key1": "val1"}),
550
            split_segment_parameters(
551
                "/somedir/path,ref=heads%2Ftip,key1=val1"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
552
        self.assertEqual(("/somedir/path", {"ref": "heads%2F=tip"}),
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
553
            split_segment_parameters("/somedir/path,ref=heads%2F=tip"))
6278.1.2 by Martin Packman
Comment which checks tests for split_segment_parameters are actually doing currently
554
        # Check relative references with relative paths
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
555
        self.assertEqual(("", {"key1": "val1"}),
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
556
            split_segment_parameters(",key1=val1"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
557
        self.assertEqual(("foo/", {"key1": "val1"}),
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
558
            split_segment_parameters("foo/,key1=val1"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
559
        self.assertEqual(("foo/base,key1=val1/other/elements", {}),
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
560
            split_segment_parameters("foo/base,key1=val1/other/elements"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
561
        self.assertEqual(("foo/base,key1=val1/other/elements",
5163.2.6 by Jelmer Vernooij
Fix example names in tests.
562
            {"key2": "val2"}), split_segment_parameters(
563
                "foo/base,key1=val1/other/elements,key2=val2"))
6278.1.2 by Martin Packman
Comment which checks tests for split_segment_parameters are actually doing currently
564
        # TODO: Check full URLs as well as relative references
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
565
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
566
    def test_win32_strip_local_trailing_slash(self):
1711.2.44 by John Arbash Meinel
Factor out another win32 special case and add platform independent tests for it.
567
        strip = urlutils._win32_strip_local_trailing_slash
568
        self.assertEqual('file://', strip('file://'))
569
        self.assertEqual('file:///', strip('file:///'))
570
        self.assertEqual('file:///C', strip('file:///C'))
571
        self.assertEqual('file:///C:', strip('file:///C:'))
572
        self.assertEqual('file:///d|', strip('file:///d|'))
573
        self.assertEqual('file:///C:/', strip('file:///C:/'))
574
        self.assertEqual('file:///C:/a', strip('file:///C:/a/'))
575
1685.1.48 by John Arbash Meinel
Updated strip_trailing_slash to support lots more url stuff, added tests
576
    def test_strip_trailing_slash(self):
577
        sts = urlutils.strip_trailing_slash
578
        if sys.platform == 'win32':
579
            self.assertEqual('file:///C|/', sts('file:///C|/'))
1685.1.79 by Wouter van Heyst
cleanup urlutils
580
            self.assertEqual('file:///C:/foo', sts('file:///C:/foo'))
1685.1.48 by John Arbash Meinel
Updated strip_trailing_slash to support lots more url stuff, added tests
581
            self.assertEqual('file:///C|/foo', sts('file:///C|/foo/'))
582
        else:
583
            self.assertEqual('file:///', sts('file:///'))
584
            self.assertEqual('file:///foo', sts('file:///foo'))
585
            self.assertEqual('file:///foo', sts('file:///foo/'))
586
587
        self.assertEqual('http://host/', sts('http://host/'))
588
        self.assertEqual('http://host/foo', sts('http://host/foo'))
589
        self.assertEqual('http://host/foo', sts('http://host/foo/'))
590
591
        # No need to fail just because the slash is missing
592
        self.assertEqual('http://host', sts('http://host'))
593
        # TODO: jam 20060502 Should this raise InvalidURL?
594
        self.assertEqual('file://', sts('file://'))
595
596
        self.assertEqual('random+scheme://user:pass@ahost:port/path',
597
            sts('random+scheme://user:pass@ahost:port/path'))
598
        self.assertEqual('random+scheme://user:pass@ahost:port/path',
599
            sts('random+scheme://user:pass@ahost:port/path/'))
600
        self.assertEqual('random+scheme://user:pass@ahost:port/',
601
            sts('random+scheme://user:pass@ahost:port/'))
602
603
        # Make sure relative paths work too
604
        self.assertEqual('path/to/foo', sts('path/to/foo'))
605
        self.assertEqual('path/to/foo', sts('path/to/foo/'))
606
        self.assertEqual('../to/foo', sts('../to/foo/'))
607
        self.assertEqual('path/../foo', sts('path/../foo/'))
608
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
609
    def test_unescape_for_display_utf8(self):
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
610
        # Test that URLs are converted to nice unicode strings for display
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
611
        def test(expected, url, encoding='utf-8'):
612
            disp_url = urlutils.unescape_for_display(url, encoding=encoding)
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
613
            self.assertIsInstance(disp_url, unicode)
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
614
            self.assertEqual(expected, disp_url)
1685.1.79 by Wouter van Heyst
cleanup urlutils
615
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
616
        test('http://foo', 'http://foo')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
617
        if sys.platform == 'win32':
1711.7.13 by John Arbash Meinel
Fix expected value for urlutils tests
618
            test('C:/foo/path', 'file:///C|/foo/path')
619
            test('C:/foo/path', 'file:///C:/foo/path')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
620
        else:
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
621
            test('/foo/path', 'file:///foo/path')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
622
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
623
        test('http://foo/%2Fbaz', 'http://foo/%2Fbaz')
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
624
        test(u'http://host/r\xe4ksm\xf6rg\xe5s',
625
             'http://host/r%C3%A4ksm%C3%B6rg%C3%A5s')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
626
627
        # Make sure special escaped characters stay escaped
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
628
        test(u'http://host/%3B%2F%3F%3A%40%26%3D%2B%24%2C%23',
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
629
             'http://host/%3B%2F%3F%3A%40%26%3D%2B%24%2C%23')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
630
631
        # Can we handle sections that don't have utf-8 encoding?
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
632
        test(u'http://host/%EE%EE%EE/r\xe4ksm\xf6rg\xe5s',
633
             'http://host/%EE%EE%EE/r%C3%A4ksm%C3%B6rg%C3%A5s')
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
634
635
        # Test encoding into output that can handle some characters
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
636
        test(u'http://host/%EE%EE%EE/r\xe4ksm\xf6rg\xe5s',
637
             'http://host/%EE%EE%EE/r%C3%A4ksm%C3%B6rg%C3%A5s',
638
             encoding='iso-8859-1')
639
640
        # This one can be encoded into utf8
641
        test(u'http://host/\u062c\u0648\u062c\u0648',
642
             'http://host/%d8%ac%d9%88%d8%ac%d9%88',
643
             encoding='utf-8')
644
645
        # This can't be put into 8859-1 and so stays as escapes
646
        test(u'http://host/%d8%ac%d9%88%d8%ac%d9%88',
647
             'http://host/%d8%ac%d9%88%d8%ac%d9%88',
648
             encoding='iso-8859-1')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
649
650
    def test_escape(self):
651
        self.assertEqual('%25', urlutils.escape('%'))
652
        self.assertEqual('%C3%A5', urlutils.escape(u'\xe5'))
3234.3.1 by Alexander Belchenko
ensure that local_path_to_url() always returns plain string, not unicode.
653
        self.assertFalse(isinstance(urlutils.escape(u'\xe5'), unicode))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
654
4098.3.1 by Jonathan Lange
Don't escape tildes
655
    def test_escape_tildes(self):
656
        self.assertEqual('~foo', urlutils.escape('~foo'))
657
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
658
    def test_unescape(self):
659
        self.assertEqual('%', urlutils.unescape('%25'))
660
        self.assertEqual(u'\xe5', urlutils.unescape('%C3%A5'))
661
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
662
        self.assertRaises(urlutils.InvalidURL, urlutils.unescape, u'\xe5')
663
        self.assertRaises(urlutils.InvalidURL, urlutils.unescape, '\xe5')
664
        self.assertRaises(urlutils.InvalidURL, urlutils.unescape, '%E5')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
665
666
    def test_escape_unescape(self):
667
        self.assertEqual(u'\xe5', urlutils.unescape(urlutils.escape(u'\xe5')))
668
        self.assertEqual('%', urlutils.unescape(urlutils.escape('%')))
669
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
670
    def test_relative_url(self):
671
        def test(expected, base, other):
672
            result = urlutils.relative_url(base, other)
673
            self.assertEqual(expected, result)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
674
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
675
        test('a', 'http://host/', 'http://host/a')
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
676
        test('http://entirely/different', 'sftp://host/branch',
677
                    'http://entirely/different')
678
        test('../person/feature', 'http://host/branch/mainline',
679
                    'http://host/branch/person/feature')
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
680
        test('..', 'http://host/branch', 'http://host/')
681
        test('http://host2/branch', 'http://host1/branch', 'http://host2/branch')
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
682
        test('.', 'http://host1/branch', 'http://host1/branch')
683
        test('../../../branch/2b', 'file:///home/jelmer/foo/bar/2b',
684
                    'file:///home/jelmer/branch/2b')
685
        test('../../branch/2b', 'sftp://host/home/jelmer/bar/2b',
686
                    'sftp://host/home/jelmer/branch/2b')
1685.1.79 by Wouter van Heyst
cleanup urlutils
687
        test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
688
                    'http://host/home/jelmer/branch/feature/%2b')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
689
        test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
690
                    'http://host/home/jelmer/branch/feature/2b')
691
        # relative_url should preserve a trailing slash
692
        test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
693
                    'http://host/home/jelmer/branch/feature/2b/')
694
        test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b',
695
                    'http://host/home/jelmer/branch/feature/2b/')
696
697
        # TODO: treat http://host as http://host/
698
        #       relative_url is typically called from a branch.base or
699
        #       transport.base which always ends with a /
700
        #test('a', 'http://host', 'http://host/a')
701
        test('http://host/a', 'http://host', 'http://host/a')
702
        #test('.', 'http://host', 'http://host/')
703
        test('http://host/', 'http://host', 'http://host/')
704
        #test('.', 'http://host/', 'http://host')
705
        test('http://host', 'http://host/', 'http://host')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
706
3139.2.1 by Alexander Belchenko
bugfix #90847: fix problem with parent location on another logical drive
707
        # On Windows file:///C:/path/to and file:///D:/other/path
708
        # should not use relative url over the non-existent '/' directory.
709
        if sys.platform == 'win32':
710
            # on the same drive
711
            test('../../other/path',
712
                'file:///C:/path/to', 'file:///C:/other/path')
713
            #~next two tests is failed, i.e. urlutils.relative_url expects
714
            #~to see normalized file URLs?
715
            #~test('../../other/path',
716
            #~    'file:///C:/path/to', 'file:///c:/other/path')
717
            #~test('../../other/path',
718
            #~    'file:///C:/path/to', 'file:///C|/other/path')
719
720
            # check UNC paths too
721
            test('../../other/path',
722
                'file://HOST/base/path/to', 'file://HOST/base/other/path')
723
            # on different drives
724
            test('file:///D:/other/path',
725
                'file:///C:/path/to', 'file:///D:/other/path')
726
            # TODO: strictly saying in UNC path //HOST/base is full analog
727
            # of drive letter for hard disk, and this situation is also
728
            # should be exception from rules. [bialix 20071221]
729
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
730
731
class TestCwdToURL(TestCaseInTempDir):
6423.1.1 by Vincent Ladeuil
Cleanup old blackbox tests and then some. Remove os.chdir() calls, caught a few bugs, make sure we don't leave file handles opened.
732
    """Test that local_path_to_url works based on the cwd"""
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
733
734
    def test_dot(self):
735
        # This test will fail if getcwd is not ascii
1830.3.17 by John Arbash Meinel
list_files() with wrong normalized_filename code raises exceptions. Fix this
736
        os.mkdir('mytest')
737
        os.chdir('mytest')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
738
739
        url = urlutils.local_path_to_url('.')
1830.3.17 by John Arbash Meinel
list_files() with wrong normalized_filename code raises exceptions. Fix this
740
        self.assertEndsWith(url, '/mytest')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
741
742
    def test_non_ascii(self):
743
        try:
744
            os.mkdir(u'dod\xe9')
745
        except UnicodeError:
746
            raise TestSkipped('cannot create unicode directory')
747
748
        os.chdir(u'dod\xe9')
749
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
750
        # On Mac OSX this directory is actually:
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
751
        #   u'/dode\u0301' => '/dode\xcc\x81
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
752
        # but we should normalize it back to
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
753
        #   u'/dod\xe9' => '/dod\xc3\xa9'
754
        url = urlutils.local_path_to_url('.')
755
        self.assertEndsWith(url, '/dod%C3%A9')
2512.4.1 by Ian Clatworthy
Fixes #115491 - 'branch lp:projname' now creates ./projname as exected
756
757
758
class TestDeriveToLocation(TestCase):
759
    """Test that the mapping of FROM_LOCATION to TO_LOCATION works."""
760
761
    def test_to_locations_derived_from_paths(self):
762
        derive = urlutils.derive_to_location
763
        self.assertEqual("bar", derive("bar"))
764
        self.assertEqual("bar", derive("../bar"))
765
        self.assertEqual("bar", derive("/foo/bar"))
766
        self.assertEqual("bar", derive("c:/foo/bar"))
767
        self.assertEqual("bar", derive("c:bar"))
768
769
    def test_to_locations_derived_from_urls(self):
770
        derive = urlutils.derive_to_location
771
        self.assertEqual("bar", derive("http://foo/bar"))
772
        self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
773
        self.assertEqual("foo-bar", derive("lp:foo-bar"))
3242.3.26 by Aaron Bentley
Implement rebase_url
774
775
776
class TestRebaseURL(TestCase):
777
    """Test the behavior of rebase_url."""
778
779
    def test_non_relative(self):
780
        result = urlutils.rebase_url('file://foo', 'file://foo',
781
                                     'file://foo/bar')
782
        self.assertEqual('file://foo', result)
783
        result = urlutils.rebase_url('/foo', 'file://foo',
784
                                     'file://foo/bar')
785
        self.assertEqual('/foo', result)
786
3242.3.36 by Aaron Bentley
Updates from review comments
787
    def test_different_ports(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
788
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.36 by Aaron Bentley
Updates from review comments
789
                              'foo', 'http://bar:80', 'http://bar:81')
790
        self.assertEqual(str(e), "URLs differ by more than path:"
791
                         " 'http://bar:80' and 'http://bar:81'")
792
793
    def test_different_hosts(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
794
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
795
                              'foo', 'http://bar', 'http://baz')
796
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
797
                         " and 'http://baz'")
3242.3.26 by Aaron Bentley
Implement rebase_url
798
3242.3.36 by Aaron Bentley
Updates from review comments
799
    def test_different_protocol(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
800
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.36 by Aaron Bentley
Updates from review comments
801
                              'foo', 'http://bar', 'ftp://bar')
802
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
803
                         " and 'ftp://bar'")
804
3242.3.26 by Aaron Bentley
Implement rebase_url
805
    def test_rebase_success(self):
806
        self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
807
                         'http://baz/qux'))
808
        self.assertEqual('qux/bar', urlutils.rebase_url('bar',
809
                         'http://baz/qux', 'http://baz/'))
810
        self.assertEqual('.', urlutils.rebase_url('foo',
811
                         'http://bar/', 'http://bar/foo/'))
3567.2.1 by Michael Hudson
urlutils.rebase_url handles '..' path segments in 'url'
812
        self.assertEqual('qux/bar', urlutils.rebase_url('../bar',
813
                         'http://baz/qux/foo', 'http://baz/'))
3242.3.26 by Aaron Bentley
Implement rebase_url
814
815
    def test_determine_relative_path(self):
816
        self.assertEqual('../../baz/bar',
817
                         urlutils.determine_relative_path(
818
                         '/qux/quxx', '/baz/bar'))
819
        self.assertEqual('..',
820
                         urlutils.determine_relative_path(
821
                         '/bar/baz', '/bar'))
822
        self.assertEqual('baz',
823
                         urlutils.determine_relative_path(
824
                         '/bar', '/bar/baz'))
825
        self.assertEqual('.', urlutils.determine_relative_path(
826
                         '/bar', '/bar'))
3873.3.1 by Martin Pool
Move Transport._split_url to urlutils, and ad a simple test
827
828
829
class TestParseURL(TestCase):
830
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
831
    def test_parse_simple(self):
832
        parsed = urlutils.parse_url('http://example.com:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
833
        self.assertEqual(('http', None, None, 'example.com', 80, '/one'),
6055.2.6 by Jelmer Vernooij
Split out parse_url.
834
            parsed)
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
835
836
    def test_ipv6(self):
837
        parsed = urlutils.parse_url('http://[1:2:3::40]/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
838
        self.assertEqual(('http', None, None, '1:2:3::40', None, '/one'),
6055.2.6 by Jelmer Vernooij
Split out parse_url.
839
            parsed)
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
840
841
    def test_ipv6_port(self):
842
        parsed = urlutils.parse_url('http://[1:2:3::40]:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
843
        self.assertEqual(('http', None, None, '1:2:3::40', 80, '/one'),
6055.2.6 by Jelmer Vernooij
Split out parse_url.
844
            parsed)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
845
846
847
class TestURL(TestCase):
848
849
    def test_parse_simple(self):
850
        parsed = urlutils.URL.from_string('http://example.com:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
851
        self.assertEqual('http', parsed.scheme)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
852
        self.assertIs(None, parsed.user)
853
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
854
        self.assertEqual('example.com', parsed.host)
855
        self.assertEqual(80, parsed.port)
856
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
857
858
    def test_ipv6(self):
859
        parsed = urlutils.URL.from_string('http://[1:2:3::40]/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
860
        self.assertEqual('http', parsed.scheme)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
861
        self.assertIs(None, parsed.port)
862
        self.assertIs(None, parsed.user)
863
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
864
        self.assertEqual('1:2:3::40', parsed.host)
865
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
866
867
    def test_ipv6_port(self):
868
        parsed = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
869
        self.assertEqual('http', parsed.scheme)
870
        self.assertEqual('1:2:3::40', parsed.host)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
871
        self.assertIs(None, parsed.user)
872
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
873
        self.assertEqual(80, parsed.port)
874
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
875
876
    def test_quoted(self):
877
        parsed = urlutils.URL.from_string(
878
            'http://ro%62ey:h%40t@ex%41mple.com:2222/path')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
879
        self.assertEqual(parsed.quoted_host, 'ex%41mple.com')
880
        self.assertEqual(parsed.host, 'exAmple.com')
881
        self.assertEqual(parsed.port, 2222)
882
        self.assertEqual(parsed.quoted_user, 'ro%62ey')
883
        self.assertEqual(parsed.user, 'robey')
884
        self.assertEqual(parsed.quoted_password, 'h%40t')
885
        self.assertEqual(parsed.password, 'h@t')
886
        self.assertEqual(parsed.path, '/path')
6055.2.8 by Jelmer Vernooij
Add repr()
887
888
    def test_eq(self):
889
        parsed1 = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
890
        parsed2 = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
891
        self.assertEqual(parsed1, parsed2)
892
        self.assertEqual(parsed1, parsed1)
6055.2.8 by Jelmer Vernooij
Add repr()
893
        parsed2.path = '/two'
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
894
        self.assertNotEqual(parsed1, parsed2)
6055.2.8 by Jelmer Vernooij
Add repr()
895
896
    def test_repr(self):
897
        parsed = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
898
        self.assertEqual(
6055.2.11 by Jelmer Vernooij
Fix tests.
899
            "<URL('http', None, None, '1:2:3::40', 80, '/one')>",
6055.2.8 by Jelmer Vernooij
Add repr()
900
            repr(parsed))
901
6055.2.13 by Jelmer Vernooij
Add URL.__str__.
902
    def test_str(self):
903
        parsed = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
904
        self.assertEqual('http://[1:2:3::40]:80/one', str(parsed))
6055.2.13 by Jelmer Vernooij
Add URL.__str__.
905
6055.2.15 by Jelmer Vernooij
Add URL._combine_paths.
906
    def test__combine_paths(self):
907
        combine = urlutils.URL._combine_paths
908
        self.assertEqual('/home/sarah/project/foo',
909
                         combine('/home/sarah', 'project/foo'))
910
        self.assertEqual('/etc',
911
                         combine('/home/sarah', '../../etc'))
912
        self.assertEqual('/etc',
913
                         combine('/home/sarah', '../../../etc'))
914
        self.assertEqual('/etc',
915
                         combine('/home/sarah', '/etc'))
6055.2.17 by Jelmer Vernooij
Add URL.clone().
916
917
    def test_clone(self):
918
        url = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
919
        url1 = url.clone("two")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
920
        self.assertEqual("/one/two", url1.path)
6055.2.17 by Jelmer Vernooij
Add URL.clone().
921
        url2 = url.clone("/two")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
922
        self.assertEqual("/two", url2.path)
6055.2.17 by Jelmer Vernooij
Add URL.clone().
923
        url3 = url.clone()
924
        self.assertIsNot(url, url3)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
925
        self.assertEqual(url, url3)
6240.4.2 by Jelmer Vernooij
Moar tests.
926
927
928
class TestFileRelpath(TestCase):
929
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
930
    # GZ 2011-11-18: A way to override all path handling functions to one
931
    #                platform or another for testing would be nice.
932
933
    def _with_posix_paths(self):
934
        self.overrideAttr(urlutils, "local_path_from_url",
935
            urlutils._posix_local_path_from_url)
936
        self.overrideAttr(urlutils, "MIN_ABS_FILEURL_LENGTH", len("file:///"))
937
        self.overrideAttr(osutils, "normpath", osutils._posix_normpath)
938
        self.overrideAttr(osutils, "abspath", osutils._posix_abspath)
939
        self.overrideAttr(osutils, "normpath", osutils._posix_normpath)
940
        self.overrideAttr(osutils, "pathjoin", osutils.posixpath.join)
941
        self.overrideAttr(osutils, "split", osutils.posixpath.split)
942
        self.overrideAttr(osutils, "MIN_ABS_PATHLENGTH", 1)
943
944
    def _with_win32_paths(self):
945
        self.overrideAttr(urlutils, "local_path_from_url",
946
            urlutils._win32_local_path_from_url)
947
        self.overrideAttr(urlutils, "MIN_ABS_FILEURL_LENGTH",
948
            urlutils.WIN32_MIN_ABS_FILEURL_LENGTH)
949
        self.overrideAttr(osutils, "abspath", osutils._win32_abspath)
950
        self.overrideAttr(osutils, "normpath", osutils._win32_normpath)
951
        self.overrideAttr(osutils, "pathjoin", osutils._win32_pathjoin)
952
        self.overrideAttr(osutils, "split", osutils.ntpath.split)
953
        self.overrideAttr(osutils, "MIN_ABS_PATHLENGTH", 3)
954
955
    def test_same_url_posix(self):
956
        self._with_posix_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
957
        self.assertEqual("",
6240.4.2 by Jelmer Vernooij
Moar tests.
958
            urlutils.file_relpath("file:///a", "file:///a"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
959
        self.assertEqual("",
6240.4.2 by Jelmer Vernooij
Moar tests.
960
            urlutils.file_relpath("file:///a", "file:///a/"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
961
        self.assertEqual("",
6240.4.2 by Jelmer Vernooij
Moar tests.
962
            urlutils.file_relpath("file:///a/", "file:///a"))
963
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
964
    def test_same_url_win32(self):
965
        self._with_win32_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
966
        self.assertEqual("",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
967
            urlutils.file_relpath("file:///A:/", "file:///A:/"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
968
        self.assertEqual("",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
969
            urlutils.file_relpath("file:///A|/", "file:///A:/"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
970
        self.assertEqual("",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
971
            urlutils.file_relpath("file:///A:/b/", "file:///A:/b/"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
972
        self.assertEqual("",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
973
            urlutils.file_relpath("file:///A:/b", "file:///A:/b/"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
974
        self.assertEqual("",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
975
            urlutils.file_relpath("file:///A:/b/", "file:///A:/b"))
976
977
    def test_child_posix(self):
978
        self._with_posix_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
979
        self.assertEqual("b",
6240.4.2 by Jelmer Vernooij
Moar tests.
980
            urlutils.file_relpath("file:///a", "file:///a/b"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
981
        self.assertEqual("b",
6240.4.2 by Jelmer Vernooij
Moar tests.
982
            urlutils.file_relpath("file:///a/", "file:///a/b"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
983
        self.assertEqual("b/c",
6240.4.2 by Jelmer Vernooij
Moar tests.
984
            urlutils.file_relpath("file:///a", "file:///a/b/c"))
985
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
986
    def test_child_win32(self):
987
        self._with_win32_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
988
        self.assertEqual("b",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
989
            urlutils.file_relpath("file:///A:/", "file:///A:/b"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
990
        self.assertEqual("b",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
991
            urlutils.file_relpath("file:///A|/", "file:///A:/b"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
992
        self.assertEqual("c",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
993
            urlutils.file_relpath("file:///A:/b", "file:///A:/b/c"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
994
        self.assertEqual("c",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
995
            urlutils.file_relpath("file:///A:/b/", "file:///A:/b/c"))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
996
        self.assertEqual("c/d",
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
997
            urlutils.file_relpath("file:///A:/b", "file:///A:/b/c/d"))
998
999
    def test_sibling_posix(self):
1000
        self._with_posix_paths()
6240.4.2 by Jelmer Vernooij
Moar tests.
1001
        self.assertRaises(PathNotChild,
1002
            urlutils.file_relpath, "file:///a/b", "file:///a/c")
1003
        self.assertRaises(PathNotChild,
1004
            urlutils.file_relpath, "file:///a/b/", "file:///a/c")
1005
        self.assertRaises(PathNotChild,
1006
            urlutils.file_relpath, "file:///a/b/", "file:///a/c/")
1007
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1008
    def test_sibling_win32(self):
1009
        self._with_win32_paths()
1010
        self.assertRaises(PathNotChild,
1011
            urlutils.file_relpath, "file:///A:/b", "file:///A:/c")
1012
        self.assertRaises(PathNotChild,
1013
            urlutils.file_relpath, "file:///A:/b/", "file:///A:/c")
1014
        self.assertRaises(PathNotChild,
1015
            urlutils.file_relpath, "file:///A:/b/", "file:///A:/c/")
1016
1017
    def test_parent_posix(self):
1018
        self._with_posix_paths()
6240.4.2 by Jelmer Vernooij
Moar tests.
1019
        self.assertRaises(PathNotChild,
1020
            urlutils.file_relpath, "file:///a/b", "file:///a")
1021
        self.assertRaises(PathNotChild,
1022
            urlutils.file_relpath, "file:///a/b", "file:///a/")
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1023
1024
    def test_parent_win32(self):
1025
        self._with_win32_paths()
1026
        self.assertRaises(PathNotChild,
1027
            urlutils.file_relpath, "file:///A:/b", "file:///A:/")
1028
        self.assertRaises(PathNotChild,
1029
            urlutils.file_relpath, "file:///A:/b/c", "file:///A:/b")
6379.4.4 by Jelmer Vernooij
Add some tests.
1030
1031
1032
class QuoteTests(TestCase):
1033
1034
    def test_quote(self):
1035
        self.assertEqual('abc%20def', urlutils.quote('abc def'))
1036
        self.assertEqual('abc%2Fdef', urlutils.quote('abc/def', safe=''))
1037
        self.assertEqual('abc/def', urlutils.quote('abc/def', safe='/'))
1038
1039
    def test_quote_tildes(self):
1040
        self.assertEqual('%7Efoo', urlutils.quote('~foo'))
1041
        self.assertEqual('~foo', urlutils.quote('~foo', safe='/~'))
1042
1043
    def test_unquote(self):
1044
        self.assertEqual('%', urlutils.unquote('%25'))
1045
        self.assertEqual('\xc3\xa5', urlutils.unquote('%C3%A5'))
1046
        self.assertEqual(u"\xe5", urlutils.unquote(u'\xe5'))