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