/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
7143.15.2 by Jelmer Vernooij
Run autopep8.
718
        self.assertRaises((TypeError, urlutils.InvalidURL),
719
                          urlutils.unescape, b'\xe5')
7479.2.1 by Jelmer Vernooij
Drop python2 support.
720
        self.assertEqual('\xe5', urlutils.unescape('%C3%A5'))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
721
722
    def test_escape_unescape(self):
723
        self.assertEqual(u'\xe5', urlutils.unescape(urlutils.escape(u'\xe5')))
724
        self.assertEqual('%', urlutils.unescape(urlutils.escape('%')))
725
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
726
    def test_relative_url(self):
727
        def test(expected, base, other):
728
            result = urlutils.relative_url(base, other)
729
            self.assertEqual(expected, result)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
730
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
731
        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
732
        test('http://entirely/different', 'sftp://host/branch',
7143.15.2 by Jelmer Vernooij
Run autopep8.
733
             'http://entirely/different')
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
734
        test('../person/feature', 'http://host/branch/mainline',
7143.15.2 by Jelmer Vernooij
Run autopep8.
735
             'http://host/branch/person/feature')
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
736
        test('..', 'http://host/branch', 'http://host/')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
737
        test('http://host2/branch', 'http://host1/branch',
738
             'http://host2/branch')
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
739
        test('.', 'http://host1/branch', 'http://host1/branch')
740
        test('../../../branch/2b', 'file:///home/jelmer/foo/bar/2b',
7143.15.2 by Jelmer Vernooij
Run autopep8.
741
             '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
742
        test('../../branch/2b', 'sftp://host/home/jelmer/bar/2b',
7143.15.2 by Jelmer Vernooij
Run autopep8.
743
             'sftp://host/home/jelmer/branch/2b')
1685.1.79 by Wouter van Heyst
cleanup urlutils
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')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
746
        test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
7143.15.2 by Jelmer Vernooij
Run autopep8.
747
             '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
748
        # relative_url should preserve a trailing slash
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
        test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b',
7143.15.2 by Jelmer Vernooij
Run autopep8.
752
             '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
753
754
        # TODO: treat http://host as http://host/
755
        #       relative_url is typically called from a branch.base or
756
        #       transport.base which always ends with a /
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
757
        # 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
758
        test('http://host/a', 'http://host', 'http://host/a')
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/')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
761
        # 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
762
        test('http://host', 'http://host/', 'http://host')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
763
3139.2.1 by Alexander Belchenko
bugfix #90847: fix problem with parent location on another logical drive
764
        # On Windows file:///C:/path/to and file:///D:/other/path
765
        # should not use relative url over the non-existent '/' directory.
766
        if sys.platform == 'win32':
767
            # on the same drive
768
            test('../../other/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
769
                 'file:///C:/path/to', 'file:///C:/other/path')
770
            # ~next two tests is failed, i.e. urlutils.relative_url expects
771
            # ~to see normalized file URLs?
772
            # ~test('../../other/path',
773
            # ~    'file:///C:/path/to', 'file:///c:/other/path')
774
            # ~test('../../other/path',
775
            # ~    '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
776
777
            # check UNC paths too
778
            test('../../other/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
779
                 '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
780
            # on different drives
781
            test('file:///D:/other/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
782
                 '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
783
            # TODO: strictly saying in UNC path //HOST/base is full analog
784
            # of drive letter for hard disk, and this situation is also
785
            # should be exception from rules. [bialix 20071221]
786
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
787
788
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.
789
    """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
790
791
    def test_dot(self):
792
        # 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
793
        os.mkdir('mytest')
794
        os.chdir('mytest')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
795
796
        url = urlutils.local_path_to_url('.')
1830.3.17 by John Arbash Meinel
list_files() with wrong normalized_filename code raises exceptions. Fix this
797
        self.assertEndsWith(url, '/mytest')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
798
799
    def test_non_ascii(self):
800
        try:
801
            os.mkdir(u'dod\xe9')
802
        except UnicodeError:
803
            raise TestSkipped('cannot create unicode directory')
804
805
        os.chdir(u'dod\xe9')
806
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
807
        # On Mac OSX this directory is actually:
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
808
        #   u'/dode\u0301' => '/dode\xcc\x81
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
809
        # but we should normalize it back to
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
810
        #   u'/dod\xe9' => '/dod\xc3\xa9'
811
        url = urlutils.local_path_to_url('.')
812
        self.assertEndsWith(url, '/dod%C3%A9')
2512.4.1 by Ian Clatworthy
Fixes #115491 - 'branch lp:projname' now creates ./projname as exected
813
814
815
class TestDeriveToLocation(TestCase):
816
    """Test that the mapping of FROM_LOCATION to TO_LOCATION works."""
817
818
    def test_to_locations_derived_from_paths(self):
819
        derive = urlutils.derive_to_location
820
        self.assertEqual("bar", derive("bar"))
821
        self.assertEqual("bar", derive("../bar"))
822
        self.assertEqual("bar", derive("/foo/bar"))
823
        self.assertEqual("bar", derive("c:/foo/bar"))
824
        self.assertEqual("bar", derive("c:bar"))
825
826
    def test_to_locations_derived_from_urls(self):
827
        derive = urlutils.derive_to_location
828
        self.assertEqual("bar", derive("http://foo/bar"))
829
        self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
830
        self.assertEqual("foo-bar", derive("lp:foo-bar"))
3242.3.26 by Aaron Bentley
Implement rebase_url
831
832
833
class TestRebaseURL(TestCase):
834
    """Test the behavior of rebase_url."""
835
836
    def test_non_relative(self):
837
        result = urlutils.rebase_url('file://foo', 'file://foo',
838
                                     'file://foo/bar')
839
        self.assertEqual('file://foo', result)
840
        result = urlutils.rebase_url('/foo', 'file://foo',
841
                                     'file://foo/bar')
842
        self.assertEqual('/foo', result)
843
3242.3.36 by Aaron Bentley
Updates from review comments
844
    def test_different_ports(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
845
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.36 by Aaron Bentley
Updates from review comments
846
                              'foo', 'http://bar:80', 'http://bar:81')
847
        self.assertEqual(str(e), "URLs differ by more than path:"
848
                         " 'http://bar:80' and 'http://bar:81'")
849
850
    def test_different_hosts(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
851
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
852
                              'foo', 'http://bar', 'http://baz')
853
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
854
                         " and 'http://baz'")
3242.3.26 by Aaron Bentley
Implement rebase_url
855
3242.3.36 by Aaron Bentley
Updates from review comments
856
    def test_different_protocol(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
857
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.36 by Aaron Bentley
Updates from review comments
858
                              'foo', 'http://bar', 'ftp://bar')
859
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
860
                         " and 'ftp://bar'")
861
3242.3.26 by Aaron Bentley
Implement rebase_url
862
    def test_rebase_success(self):
863
        self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
7143.15.2 by Jelmer Vernooij
Run autopep8.
864
                                                       'http://baz/qux'))
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
865
        self.assertEqual(
866
            'qux/bar',
867
            urlutils.rebase_url('bar', 'http://baz/qux', 'http://baz/'))
868
        self.assertEqual(
869
            '.', urlutils.rebase_url('foo', 'http://bar/', 'http://bar/foo/'))
870
        self.assertEqual(
871
            'qux/bar',
872
            urlutils.rebase_url('../bar', 'http://baz/qux/foo', 'http://baz/'))
3242.3.26 by Aaron Bentley
Implement rebase_url
873
874
    def test_determine_relative_path(self):
875
        self.assertEqual('../../baz/bar',
876
                         urlutils.determine_relative_path(
7143.15.2 by Jelmer Vernooij
Run autopep8.
877
                             '/qux/quxx', '/baz/bar'))
3242.3.26 by Aaron Bentley
Implement rebase_url
878
        self.assertEqual('..',
879
                         urlutils.determine_relative_path(
7143.15.2 by Jelmer Vernooij
Run autopep8.
880
                             '/bar/baz', '/bar'))
3242.3.26 by Aaron Bentley
Implement rebase_url
881
        self.assertEqual('baz',
882
                         urlutils.determine_relative_path(
7143.15.2 by Jelmer Vernooij
Run autopep8.
883
                             '/bar', '/bar/baz'))
3242.3.26 by Aaron Bentley
Implement rebase_url
884
        self.assertEqual('.', urlutils.determine_relative_path(
885
                         '/bar', '/bar'))
3873.3.1 by Martin Pool
Move Transport._split_url to urlutils, and ad a simple test
886
887
888
class TestParseURL(TestCase):
889
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
890
    def test_parse_simple(self):
891
        parsed = urlutils.parse_url('http://example.com:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
892
        self.assertEqual(('http', None, None, 'example.com', 80, '/one'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
893
                         parsed)
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
894
895
    def test_ipv6(self):
896
        parsed = urlutils.parse_url('http://[1:2:3::40]/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
897
        self.assertEqual(('http', None, None, '1:2:3::40', None, '/one'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
898
                         parsed)
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
899
900
    def test_ipv6_port(self):
901
        parsed = urlutils.parse_url('http://[1:2:3::40]:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
902
        self.assertEqual(('http', None, None, '1:2:3::40', 80, '/one'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
903
                         parsed)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
904
905
906
class TestURL(TestCase):
907
908
    def test_parse_simple(self):
909
        parsed = urlutils.URL.from_string('http://example.com:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
910
        self.assertEqual('http', parsed.scheme)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
911
        self.assertIs(None, parsed.user)
912
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
913
        self.assertEqual('example.com', parsed.host)
914
        self.assertEqual(80, parsed.port)
915
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
916
917
    def test_ipv6(self):
918
        parsed = urlutils.URL.from_string('http://[1:2:3::40]/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
919
        self.assertEqual('http', parsed.scheme)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
920
        self.assertIs(None, parsed.port)
921
        self.assertIs(None, parsed.user)
922
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
923
        self.assertEqual('1:2:3::40', parsed.host)
924
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
925
926
    def test_ipv6_port(self):
927
        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.
928
        self.assertEqual('http', parsed.scheme)
929
        self.assertEqual('1:2:3::40', parsed.host)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
930
        self.assertIs(None, parsed.user)
931
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
932
        self.assertEqual(80, parsed.port)
933
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
934
935
    def test_quoted(self):
936
        parsed = urlutils.URL.from_string(
937
            'http://ro%62ey:h%40t@ex%41mple.com:2222/path')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
938
        self.assertEqual(parsed.quoted_host, 'ex%41mple.com')
939
        self.assertEqual(parsed.host, 'exAmple.com')
940
        self.assertEqual(parsed.port, 2222)
941
        self.assertEqual(parsed.quoted_user, 'ro%62ey')
942
        self.assertEqual(parsed.user, 'robey')
943
        self.assertEqual(parsed.quoted_password, 'h%40t')
944
        self.assertEqual(parsed.password, 'h@t')
945
        self.assertEqual(parsed.path, '/path')
6055.2.8 by Jelmer Vernooij
Add repr()
946
947
    def test_eq(self):
948
        parsed1 = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
949
        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.
950
        self.assertEqual(parsed1, parsed2)
951
        self.assertEqual(parsed1, parsed1)
6055.2.8 by Jelmer Vernooij
Add repr()
952
        parsed2.path = '/two'
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
953
        self.assertNotEqual(parsed1, parsed2)
6055.2.8 by Jelmer Vernooij
Add repr()
954
955
    def test_repr(self):
956
        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.
957
        self.assertEqual(
6055.2.11 by Jelmer Vernooij
Fix tests.
958
            "<URL('http', None, None, '1:2:3::40', 80, '/one')>",
6055.2.8 by Jelmer Vernooij
Add repr()
959
            repr(parsed))
960
6055.2.13 by Jelmer Vernooij
Add URL.__str__.
961
    def test_str(self):
962
        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.
963
        self.assertEqual('http://[1:2:3::40]:80/one', str(parsed))
6055.2.13 by Jelmer Vernooij
Add URL.__str__.
964
6055.2.15 by Jelmer Vernooij
Add URL._combine_paths.
965
    def test__combine_paths(self):
966
        combine = urlutils.URL._combine_paths
967
        self.assertEqual('/home/sarah/project/foo',
968
                         combine('/home/sarah', 'project/foo'))
969
        self.assertEqual('/etc',
970
                         combine('/home/sarah', '../../etc'))
971
        self.assertEqual('/etc',
972
                         combine('/home/sarah', '../../../etc'))
973
        self.assertEqual('/etc',
974
                         combine('/home/sarah', '/etc'))
6055.2.17 by Jelmer Vernooij
Add URL.clone().
975
976
    def test_clone(self):
977
        url = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
978
        url1 = url.clone("two")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
979
        self.assertEqual("/one/two", url1.path)
6055.2.17 by Jelmer Vernooij
Add URL.clone().
980
        url2 = url.clone("/two")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
981
        self.assertEqual("/two", url2.path)
6055.2.17 by Jelmer Vernooij
Add URL.clone().
982
        url3 = url.clone()
983
        self.assertIsNot(url, url3)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
984
        self.assertEqual(url, url3)
6240.4.2 by Jelmer Vernooij
Moar tests.
985
7096.2.1 by Jelmer Vernooij
Allow port to be empty when parsing URL.
986
    def test_parse_empty_port(self):
987
        parsed = urlutils.URL.from_string('http://example.com:/one')
988
        self.assertEqual('http', parsed.scheme)
989
        self.assertIs(None, parsed.user)
990
        self.assertIs(None, parsed.password)
991
        self.assertEqual('example.com', parsed.host)
992
        self.assertIs(None, parsed.port)
993
        self.assertEqual('/one', parsed.path)
994
6240.4.2 by Jelmer Vernooij
Moar tests.
995
996
class TestFileRelpath(TestCase):
997
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
998
    # GZ 2011-11-18: A way to override all path handling functions to one
999
    #                platform or another for testing would be nice.
1000
1001
    def _with_posix_paths(self):
1002
        self.overrideAttr(urlutils, "local_path_from_url",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1003
                          urlutils._posix_local_path_from_url)
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1004
        self.overrideAttr(urlutils, "MIN_ABS_FILEURL_LENGTH", len("file:///"))
1005
        self.overrideAttr(osutils, "normpath", osutils._posix_normpath)
1006
        self.overrideAttr(osutils, "abspath", osutils._posix_abspath)
1007
        self.overrideAttr(osutils, "normpath", osutils._posix_normpath)
1008
        self.overrideAttr(osutils, "pathjoin", osutils.posixpath.join)
1009
        self.overrideAttr(osutils, "split", osutils.posixpath.split)
1010
        self.overrideAttr(osutils, "MIN_ABS_PATHLENGTH", 1)
1011
1012
    def _with_win32_paths(self):
1013
        self.overrideAttr(urlutils, "local_path_from_url",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1014
                          urlutils._win32_local_path_from_url)
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1015
        self.overrideAttr(urlutils, "MIN_ABS_FILEURL_LENGTH",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1016
                          urlutils.WIN32_MIN_ABS_FILEURL_LENGTH)
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1017
        self.overrideAttr(osutils, "abspath", osutils._win32_abspath)
1018
        self.overrideAttr(osutils, "normpath", osutils._win32_normpath)
1019
        self.overrideAttr(osutils, "pathjoin", osutils._win32_pathjoin)
1020
        self.overrideAttr(osutils, "split", osutils.ntpath.split)
1021
        self.overrideAttr(osutils, "MIN_ABS_PATHLENGTH", 3)
1022
1023
    def test_same_url_posix(self):
1024
        self._with_posix_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1025
        self.assertEqual("",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1026
                         urlutils.file_relpath("file:///a", "file:///a"))
1027
        self.assertEqual("",
1028
                         urlutils.file_relpath("file:///a", "file:///a/"))
1029
        self.assertEqual("",
1030
                         urlutils.file_relpath("file:///a/", "file:///a"))
6240.4.2 by Jelmer Vernooij
Moar tests.
1031
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1032
    def test_same_url_win32(self):
1033
        self._with_win32_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1034
        self.assertEqual("",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1035
                         urlutils.file_relpath("file:///A:/", "file:///A:/"))
1036
        self.assertEqual("",
1037
                         urlutils.file_relpath("file:///A|/", "file:///A:/"))
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
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/"))
1042
        self.assertEqual(
1043
            "", 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
1044
1045
    def test_child_posix(self):
1046
        self._with_posix_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1047
        self.assertEqual(
1048
            "b", urlutils.file_relpath("file:///a", "file:///a/b"))
1049
        self.assertEqual(
1050
            "b", urlutils.file_relpath("file:///a/", "file:///a/b"))
1051
        self.assertEqual(
1052
            "b/c", urlutils.file_relpath("file:///a", "file:///a/b/c"))
6240.4.2 by Jelmer Vernooij
Moar tests.
1053
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1054
    def test_child_win32(self):
1055
        self._with_win32_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1056
        self.assertEqual(
1057
            "b", urlutils.file_relpath("file:///A:/", "file:///A:/b"))
1058
        self.assertEqual(
1059
            "b", urlutils.file_relpath("file:///A|/", "file:///A:/b"))
1060
        self.assertEqual(
1061
            "c", urlutils.file_relpath("file:///A:/b", "file:///A:/b/c"))
1062
        self.assertEqual(
1063
            "c", urlutils.file_relpath("file:///A:/b/", "file:///A:/b/c"))
1064
        self.assertEqual(
1065
            "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
1066
1067
    def test_sibling_posix(self):
1068
        self._with_posix_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1069
        self.assertRaises(
1070
            PathNotChild,
1071
            urlutils.file_relpath, "file:///a/b", "file:///a/c")
1072
        self.assertRaises(
1073
            PathNotChild,
1074
            urlutils.file_relpath, "file:///a/b/", "file:///a/c")
1075
        self.assertRaises(
1076
            PathNotChild,
1077
            urlutils.file_relpath, "file:///a/b/", "file:///a/c/")
6240.4.2 by Jelmer Vernooij
Moar tests.
1078
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1079
    def test_sibling_win32(self):
1080
        self._with_win32_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1081
        self.assertRaises(
1082
            PathNotChild,
1083
            urlutils.file_relpath, "file:///A:/b", "file:///A:/c")
1084
        self.assertRaises(
1085
            PathNotChild,
1086
            urlutils.file_relpath, "file:///A:/b/", "file:///A:/c")
1087
        self.assertRaises(
1088
            PathNotChild,
1089
            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
1090
1091
    def test_parent_posix(self):
1092
        self._with_posix_paths()
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.2 by Jelmer Vernooij
Moar tests.
1095
        self.assertRaises(PathNotChild,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1096
                          urlutils.file_relpath, "file:///a/b", "file:///a/")
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1097
1098
    def test_parent_win32(self):
1099
        self._with_win32_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1100
        self.assertRaises(
1101
            PathNotChild,
1102
            urlutils.file_relpath, "file:///A:/b", "file:///A:/")
1103
        self.assertRaises(
1104
            PathNotChild,
1105
            urlutils.file_relpath, "file:///A:/b/c", "file:///A:/b")
6379.4.4 by Jelmer Vernooij
Add some tests.
1106
1107
1108
class QuoteTests(TestCase):
1109
1110
    def test_quote(self):
1111
        self.assertEqual('abc%20def', urlutils.quote('abc def'))
1112
        self.assertEqual('abc%2Fdef', urlutils.quote('abc/def', safe=''))
1113
        self.assertEqual('abc/def', urlutils.quote('abc/def', safe='/'))
1114
1115
    def test_quote_tildes(self):
7206.3.11 by Jelmer Vernooij
Fix more tests.
1116
        # Whether ~ is quoted by default depends on the python version
1117
        if sys.version_info[:2] >= (3, 7):
1118
            # https://docs.python.org/3/whatsnew/3.7.html#urllib-parse
1119
            self.assertEqual('~foo', urlutils.quote('~foo'))
1120
        else:
1121
            self.assertEqual('%7Efoo', urlutils.quote('~foo'))
6379.4.4 by Jelmer Vernooij
Add some tests.
1122
        self.assertEqual('~foo', urlutils.quote('~foo', safe='/~'))
1123
1124
    def test_unquote(self):
1125
        self.assertEqual('%', urlutils.unquote('%25'))
7479.2.1 by Jelmer Vernooij
Drop python2 support.
1126
        self.assertEqual('\xe5', urlutils.unquote('%C3%A5'))
6379.4.4 by Jelmer Vernooij
Add some tests.
1127
        self.assertEqual(u"\xe5", urlutils.unquote(u'\xe5'))
7058.4.21 by Jelmer Vernooij
Fix some urlutils tests.
1128
1129
    def test_unquote_to_bytes(self):
1130
        self.assertEqual(b'%', urlutils.unquote_to_bytes('%25'))
1131
        self.assertEqual(b'\xc3\xa5', urlutils.unquote_to_bytes('%C3%A5'))