/brz/remove-bazaar

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