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