/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"))
7290.10.2 by Jelmer Vernooij
Fix formatting.
602
        self.assertRaises(
603
            urlutils.InvalidURL, split_segment_parameters,
7290.10.1 by Jelmer Vernooij
Raise better error when path subsegments lack =.
604
            "foo/base,key1")
6278.1.2 by Martin Packman
Comment which checks tests for split_segment_parameters are actually doing currently
605
        # TODO: Check full URLs as well as relative references
5163.2.3 by Jelmer Vernooij
Add join_segment_parameters / split_segment_parameters.
606
2162.2.6 by Alexander Belchenko
Change tests for win32 UNC path to new file://HOST/path scheme
607
    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.
608
        strip = urlutils._win32_strip_local_trailing_slash
609
        self.assertEqual('file://', strip('file://'))
610
        self.assertEqual('file:///', strip('file:///'))
611
        self.assertEqual('file:///C', strip('file:///C'))
612
        self.assertEqual('file:///C:', strip('file:///C:'))
613
        self.assertEqual('file:///d|', strip('file:///d|'))
614
        self.assertEqual('file:///C:/', strip('file:///C:/'))
615
        self.assertEqual('file:///C:/a', strip('file:///C:/a/'))
616
1685.1.48 by John Arbash Meinel
Updated strip_trailing_slash to support lots more url stuff, added tests
617
    def test_strip_trailing_slash(self):
618
        sts = urlutils.strip_trailing_slash
619
        if sys.platform == 'win32':
620
            self.assertEqual('file:///C|/', sts('file:///C|/'))
1685.1.79 by Wouter van Heyst
cleanup urlutils
621
            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
622
            self.assertEqual('file:///C|/foo', sts('file:///C|/foo/'))
623
        else:
624
            self.assertEqual('file:///', sts('file:///'))
625
            self.assertEqual('file:///foo', sts('file:///foo'))
626
            self.assertEqual('file:///foo', sts('file:///foo/'))
627
628
        self.assertEqual('http://host/', sts('http://host/'))
629
        self.assertEqual('http://host/foo', sts('http://host/foo'))
630
        self.assertEqual('http://host/foo', sts('http://host/foo/'))
631
632
        # No need to fail just because the slash is missing
633
        self.assertEqual('http://host', sts('http://host'))
634
        # TODO: jam 20060502 Should this raise InvalidURL?
635
        self.assertEqual('file://', sts('file://'))
636
637
        self.assertEqual('random+scheme://user:pass@ahost:port/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
638
                         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
639
        self.assertEqual('random+scheme://user:pass@ahost:port/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
640
                         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
641
        self.assertEqual('random+scheme://user:pass@ahost:port/',
7143.15.2 by Jelmer Vernooij
Run autopep8.
642
                         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
643
644
        # Make sure relative paths work too
645
        self.assertEqual('path/to/foo', sts('path/to/foo'))
646
        self.assertEqual('path/to/foo', sts('path/to/foo/'))
647
        self.assertEqual('../to/foo', sts('../to/foo/'))
648
        self.assertEqual('path/../foo', sts('path/../foo/'))
649
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
650
    def test_unescape_for_display_utf8(self):
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
651
        # 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.
652
        def test(expected, url, encoding='utf-8'):
653
            disp_url = urlutils.unescape_for_display(url, encoding=encoding)
6973.6.2 by Jelmer Vernooij
Fix more tests.
654
            self.assertIsInstance(disp_url, text_type)
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
655
            self.assertEqual(expected, disp_url)
1685.1.79 by Wouter van Heyst
cleanup urlutils
656
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
657
        test('http://foo', 'http://foo')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
658
        if sys.platform == 'win32':
1711.7.13 by John Arbash Meinel
Fix expected value for urlutils tests
659
            test('C:/foo/path', 'file:///C|/foo/path')
660
            test('C:/foo/path', 'file:///C:/foo/path')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
661
        else:
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
662
            test('/foo/path', 'file:///foo/path')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
663
1685.1.54 by John Arbash Meinel
url_for_display now makes sure output can be properly encoded.
664
        test('http://foo/%2Fbaz', 'http://foo/%2Fbaz')
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
665
        test(u'http://host/r\xe4ksm\xf6rg\xe5s',
666
             'http://host/r%C3%A4ksm%C3%B6rg%C3%A5s')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
667
668
        # 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.
669
        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
670
             '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
671
672
        # Can we handle sections that don't have utf-8 encoding?
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
673
        test(u'http://host/%EE%EE%EE/r\xe4ksm\xf6rg\xe5s',
674
             '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.
675
676
        # Test encoding into output that can handle some characters
1685.1.58 by Martin Pool
urlutils.unescape_for_display should return Unicode
677
        test(u'http://host/%EE%EE%EE/r\xe4ksm\xf6rg\xe5s',
678
             'http://host/%EE%EE%EE/r%C3%A4ksm%C3%B6rg%C3%A5s',
679
             encoding='iso-8859-1')
680
681
        # This one can be encoded into utf8
682
        test(u'http://host/\u062c\u0648\u062c\u0648',
683
             'http://host/%d8%ac%d9%88%d8%ac%d9%88',
684
             encoding='utf-8')
685
686
        # This can't be put into 8859-1 and so stays as escapes
687
        test(u'http://host/%d8%ac%d9%88%d8%ac%d9%88',
688
             'http://host/%d8%ac%d9%88%d8%ac%d9%88',
689
             encoding='iso-8859-1')
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
690
691
    def test_escape(self):
692
        self.assertEqual('%25', urlutils.escape('%'))
693
        self.assertEqual('%C3%A5', urlutils.escape(u'\xe5'))
7058.4.21 by Jelmer Vernooij
Fix some urlutils tests.
694
        self.assertIsInstance(urlutils.escape(u'\xe5'), str)
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
695
4098.3.1 by Jonathan Lange
Don't escape tildes
696
    def test_escape_tildes(self):
697
        self.assertEqual('~foo', urlutils.escape('~foo'))
698
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
699
    def test_unescape(self):
700
        self.assertEqual('%', urlutils.unescape('%25'))
701
        self.assertEqual(u'\xe5', urlutils.unescape('%C3%A5'))
702
7045.3.2 by Jelmer Vernooij
Fix tests.
703
        if not PY3:
704
            self.assertRaises(urlutils.InvalidURL, urlutils.unescape, u'\xe5')
7143.15.2 by Jelmer Vernooij
Run autopep8.
705
        self.assertRaises((TypeError, urlutils.InvalidURL),
706
                          urlutils.unescape, b'\xe5')
7045.3.2 by Jelmer Vernooij
Fix tests.
707
        if not PY3:
708
            self.assertRaises(urlutils.InvalidURL, urlutils.unescape, '%E5')
709
        else:
710
            self.assertEqual('\xe5', urlutils.unescape('%C3%A5'))
1685.1.45 by John Arbash Meinel
Moved url functions into bzrlib.urlutils
711
712
    def test_escape_unescape(self):
713
        self.assertEqual(u'\xe5', urlutils.unescape(urlutils.escape(u'\xe5')))
714
        self.assertEqual('%', urlutils.unescape(urlutils.escape('%')))
715
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
716
    def test_relative_url(self):
717
        def test(expected, base, other):
718
            result = urlutils.relative_url(base, other)
719
            self.assertEqual(expected, result)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
720
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
721
        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
722
        test('http://entirely/different', 'sftp://host/branch',
7143.15.2 by Jelmer Vernooij
Run autopep8.
723
             'http://entirely/different')
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
724
        test('../person/feature', 'http://host/branch/mainline',
7143.15.2 by Jelmer Vernooij
Run autopep8.
725
             'http://host/branch/person/feature')
1685.1.70 by Wouter van Heyst
working on get_parent, set_parent and relative urls, broken
726
        test('..', 'http://host/branch', 'http://host/')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
727
        test('http://host2/branch', 'http://host1/branch',
728
             'http://host2/branch')
1685.1.71 by Wouter van Heyst
change branch.{get,set}_parent to store a relative path but return full urls
729
        test('.', 'http://host1/branch', 'http://host1/branch')
730
        test('../../../branch/2b', 'file:///home/jelmer/foo/bar/2b',
7143.15.2 by Jelmer Vernooij
Run autopep8.
731
             '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
732
        test('../../branch/2b', 'sftp://host/home/jelmer/bar/2b',
7143.15.2 by Jelmer Vernooij
Run autopep8.
733
             'sftp://host/home/jelmer/branch/2b')
1685.1.79 by Wouter van Heyst
cleanup urlutils
734
        test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
7143.15.2 by Jelmer Vernooij
Run autopep8.
735
             'http://host/home/jelmer/branch/feature/%2b')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
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
        # relative_url should preserve a trailing slash
739
        test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
7143.15.2 by Jelmer Vernooij
Run autopep8.
740
             '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
741
        test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b',
7143.15.2 by Jelmer Vernooij
Run autopep8.
742
             '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
743
744
        # TODO: treat http://host as http://host/
745
        #       relative_url is typically called from a branch.base or
746
        #       transport.base which always ends with a /
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
747
        # 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
748
        test('http://host/a', 'http://host', 'http://host/a')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
749
        # 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
750
        test('http://host/', 'http://host', 'http://host/')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
751
        # 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
752
        test('http://host', 'http://host/', 'http://host')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
753
3139.2.1 by Alexander Belchenko
bugfix #90847: fix problem with parent location on another logical drive
754
        # On Windows file:///C:/path/to and file:///D:/other/path
755
        # should not use relative url over the non-existent '/' directory.
756
        if sys.platform == 'win32':
757
            # on the same drive
758
            test('../../other/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
759
                 'file:///C:/path/to', 'file:///C:/other/path')
760
            # ~next two tests is failed, i.e. urlutils.relative_url expects
761
            # ~to see normalized file URLs?
762
            # ~test('../../other/path',
763
            # ~    'file:///C:/path/to', 'file:///c:/other/path')
764
            # ~test('../../other/path',
765
            # ~    '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
766
767
            # check UNC paths too
768
            test('../../other/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
769
                 '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
770
            # on different drives
771
            test('file:///D:/other/path',
7143.15.2 by Jelmer Vernooij
Run autopep8.
772
                 '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
773
            # TODO: strictly saying in UNC path //HOST/base is full analog
774
            # of drive letter for hard disk, and this situation is also
775
            # should be exception from rules. [bialix 20071221]
776
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
777
778
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.
779
    """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
780
781
    def test_dot(self):
782
        # 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
783
        os.mkdir('mytest')
784
        os.chdir('mytest')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
785
786
        url = urlutils.local_path_to_url('.')
1830.3.17 by John Arbash Meinel
list_files() with wrong normalized_filename code raises exceptions. Fix this
787
        self.assertEndsWith(url, '/mytest')
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
788
789
    def test_non_ascii(self):
790
        try:
791
            os.mkdir(u'dod\xe9')
792
        except UnicodeError:
793
            raise TestSkipped('cannot create unicode directory')
794
795
        os.chdir(u'dod\xe9')
796
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
797
        # On Mac OSX this directory is actually:
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
798
        #   u'/dode\u0301' => '/dode\xcc\x81
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
799
        # but we should normalize it back to
1830.3.13 by John Arbash Meinel
Add a test that urlutils creates normalized paths
800
        #   u'/dod\xe9' => '/dod\xc3\xa9'
801
        url = urlutils.local_path_to_url('.')
802
        self.assertEndsWith(url, '/dod%C3%A9')
2512.4.1 by Ian Clatworthy
Fixes #115491 - 'branch lp:projname' now creates ./projname as exected
803
804
805
class TestDeriveToLocation(TestCase):
806
    """Test that the mapping of FROM_LOCATION to TO_LOCATION works."""
807
808
    def test_to_locations_derived_from_paths(self):
809
        derive = urlutils.derive_to_location
810
        self.assertEqual("bar", derive("bar"))
811
        self.assertEqual("bar", derive("../bar"))
812
        self.assertEqual("bar", derive("/foo/bar"))
813
        self.assertEqual("bar", derive("c:/foo/bar"))
814
        self.assertEqual("bar", derive("c:bar"))
815
816
    def test_to_locations_derived_from_urls(self):
817
        derive = urlutils.derive_to_location
818
        self.assertEqual("bar", derive("http://foo/bar"))
819
        self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
820
        self.assertEqual("foo-bar", derive("lp:foo-bar"))
3242.3.26 by Aaron Bentley
Implement rebase_url
821
822
823
class TestRebaseURL(TestCase):
824
    """Test the behavior of rebase_url."""
825
826
    def test_non_relative(self):
827
        result = urlutils.rebase_url('file://foo', 'file://foo',
828
                                     'file://foo/bar')
829
        self.assertEqual('file://foo', result)
830
        result = urlutils.rebase_url('/foo', 'file://foo',
831
                                     'file://foo/bar')
832
        self.assertEqual('/foo', result)
833
3242.3.36 by Aaron Bentley
Updates from review comments
834
    def test_different_ports(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
835
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.36 by Aaron Bentley
Updates from review comments
836
                              'foo', 'http://bar:80', 'http://bar:81')
837
        self.assertEqual(str(e), "URLs differ by more than path:"
838
                         " 'http://bar:80' and 'http://bar:81'")
839
840
    def test_different_hosts(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
841
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.33 by Aaron Bentley
Handle relative URL stacking cleanly
842
                              'foo', 'http://bar', 'http://baz')
843
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
844
                         " and 'http://baz'")
3242.3.26 by Aaron Bentley
Implement rebase_url
845
3242.3.36 by Aaron Bentley
Updates from review comments
846
    def test_different_protocol(self):
6729.6.1 by Jelmer Vernooij
Move urlutils errors.
847
        e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
3242.3.36 by Aaron Bentley
Updates from review comments
848
                              'foo', 'http://bar', 'ftp://bar')
849
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
850
                         " and 'ftp://bar'")
851
3242.3.26 by Aaron Bentley
Implement rebase_url
852
    def test_rebase_success(self):
853
        self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
7143.15.2 by Jelmer Vernooij
Run autopep8.
854
                                                       'http://baz/qux'))
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
855
        self.assertEqual(
856
            'qux/bar',
857
            urlutils.rebase_url('bar', 'http://baz/qux', 'http://baz/'))
858
        self.assertEqual(
859
            '.', urlutils.rebase_url('foo', 'http://bar/', 'http://bar/foo/'))
860
        self.assertEqual(
861
            'qux/bar',
862
            urlutils.rebase_url('../bar', 'http://baz/qux/foo', 'http://baz/'))
3242.3.26 by Aaron Bentley
Implement rebase_url
863
864
    def test_determine_relative_path(self):
865
        self.assertEqual('../../baz/bar',
866
                         urlutils.determine_relative_path(
7143.15.2 by Jelmer Vernooij
Run autopep8.
867
                             '/qux/quxx', '/baz/bar'))
3242.3.26 by Aaron Bentley
Implement rebase_url
868
        self.assertEqual('..',
869
                         urlutils.determine_relative_path(
7143.15.2 by Jelmer Vernooij
Run autopep8.
870
                             '/bar/baz', '/bar'))
3242.3.26 by Aaron Bentley
Implement rebase_url
871
        self.assertEqual('baz',
872
                         urlutils.determine_relative_path(
7143.15.2 by Jelmer Vernooij
Run autopep8.
873
                             '/bar', '/bar/baz'))
3242.3.26 by Aaron Bentley
Implement rebase_url
874
        self.assertEqual('.', urlutils.determine_relative_path(
875
                         '/bar', '/bar'))
3873.3.1 by Martin Pool
Move Transport._split_url to urlutils, and ad a simple test
876
877
878
class TestParseURL(TestCase):
879
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
880
    def test_parse_simple(self):
881
        parsed = urlutils.parse_url('http://example.com:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
882
        self.assertEqual(('http', None, None, 'example.com', 80, '/one'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
883
                         parsed)
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
884
885
    def test_ipv6(self):
886
        parsed = urlutils.parse_url('http://[1:2:3::40]/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
887
        self.assertEqual(('http', None, None, '1:2:3::40', None, '/one'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
888
                         parsed)
6055.2.1 by Jelmer Vernooij
Add UnparsedUrl.
889
890
    def test_ipv6_port(self):
891
        parsed = urlutils.parse_url('http://[1:2:3::40]:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
892
        self.assertEqual(('http', None, None, '1:2:3::40', 80, '/one'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
893
                         parsed)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
894
895
896
class TestURL(TestCase):
897
898
    def test_parse_simple(self):
899
        parsed = urlutils.URL.from_string('http://example.com:80/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
900
        self.assertEqual('http', parsed.scheme)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
901
        self.assertIs(None, parsed.user)
902
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
903
        self.assertEqual('example.com', parsed.host)
904
        self.assertEqual(80, parsed.port)
905
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
906
907
    def test_ipv6(self):
908
        parsed = urlutils.URL.from_string('http://[1:2:3::40]/one')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
909
        self.assertEqual('http', parsed.scheme)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
910
        self.assertIs(None, parsed.port)
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('1:2:3::40', parsed.host)
914
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
915
916
    def test_ipv6_port(self):
917
        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.
918
        self.assertEqual('http', parsed.scheme)
919
        self.assertEqual('1:2:3::40', parsed.host)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
920
        self.assertIs(None, parsed.user)
921
        self.assertIs(None, parsed.password)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
922
        self.assertEqual(80, parsed.port)
923
        self.assertEqual('/one', parsed.path)
6055.2.7 by Jelmer Vernooij
Change parse_url to URL.from_string.
924
925
    def test_quoted(self):
926
        parsed = urlutils.URL.from_string(
927
            'http://ro%62ey:h%40t@ex%41mple.com:2222/path')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
928
        self.assertEqual(parsed.quoted_host, 'ex%41mple.com')
929
        self.assertEqual(parsed.host, 'exAmple.com')
930
        self.assertEqual(parsed.port, 2222)
931
        self.assertEqual(parsed.quoted_user, 'ro%62ey')
932
        self.assertEqual(parsed.user, 'robey')
933
        self.assertEqual(parsed.quoted_password, 'h%40t')
934
        self.assertEqual(parsed.password, 'h@t')
935
        self.assertEqual(parsed.path, '/path')
6055.2.8 by Jelmer Vernooij
Add repr()
936
937
    def test_eq(self):
938
        parsed1 = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
939
        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.
940
        self.assertEqual(parsed1, parsed2)
941
        self.assertEqual(parsed1, parsed1)
6055.2.8 by Jelmer Vernooij
Add repr()
942
        parsed2.path = '/two'
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
943
        self.assertNotEqual(parsed1, parsed2)
6055.2.8 by Jelmer Vernooij
Add repr()
944
945
    def test_repr(self):
946
        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.
947
        self.assertEqual(
6055.2.11 by Jelmer Vernooij
Fix tests.
948
            "<URL('http', None, None, '1:2:3::40', 80, '/one')>",
6055.2.8 by Jelmer Vernooij
Add repr()
949
            repr(parsed))
950
6055.2.13 by Jelmer Vernooij
Add URL.__str__.
951
    def test_str(self):
952
        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.
953
        self.assertEqual('http://[1:2:3::40]:80/one', str(parsed))
6055.2.13 by Jelmer Vernooij
Add URL.__str__.
954
6055.2.15 by Jelmer Vernooij
Add URL._combine_paths.
955
    def test__combine_paths(self):
956
        combine = urlutils.URL._combine_paths
957
        self.assertEqual('/home/sarah/project/foo',
958
                         combine('/home/sarah', 'project/foo'))
959
        self.assertEqual('/etc',
960
                         combine('/home/sarah', '../../etc'))
961
        self.assertEqual('/etc',
962
                         combine('/home/sarah', '../../../etc'))
963
        self.assertEqual('/etc',
964
                         combine('/home/sarah', '/etc'))
6055.2.17 by Jelmer Vernooij
Add URL.clone().
965
966
    def test_clone(self):
967
        url = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
968
        url1 = url.clone("two")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
969
        self.assertEqual("/one/two", url1.path)
6055.2.17 by Jelmer Vernooij
Add URL.clone().
970
        url2 = url.clone("/two")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
971
        self.assertEqual("/two", url2.path)
6055.2.17 by Jelmer Vernooij
Add URL.clone().
972
        url3 = url.clone()
973
        self.assertIsNot(url, url3)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
974
        self.assertEqual(url, url3)
6240.4.2 by Jelmer Vernooij
Moar tests.
975
7096.2.1 by Jelmer Vernooij
Allow port to be empty when parsing URL.
976
    def test_parse_empty_port(self):
977
        parsed = urlutils.URL.from_string('http://example.com:/one')
978
        self.assertEqual('http', parsed.scheme)
979
        self.assertIs(None, parsed.user)
980
        self.assertIs(None, parsed.password)
981
        self.assertEqual('example.com', parsed.host)
982
        self.assertIs(None, parsed.port)
983
        self.assertEqual('/one', parsed.path)
984
6240.4.2 by Jelmer Vernooij
Moar tests.
985
986
class TestFileRelpath(TestCase):
987
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
988
    # GZ 2011-11-18: A way to override all path handling functions to one
989
    #                platform or another for testing would be nice.
990
991
    def _with_posix_paths(self):
992
        self.overrideAttr(urlutils, "local_path_from_url",
7143.15.2 by Jelmer Vernooij
Run autopep8.
993
                          urlutils._posix_local_path_from_url)
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
994
        self.overrideAttr(urlutils, "MIN_ABS_FILEURL_LENGTH", len("file:///"))
995
        self.overrideAttr(osutils, "normpath", osutils._posix_normpath)
996
        self.overrideAttr(osutils, "abspath", osutils._posix_abspath)
997
        self.overrideAttr(osutils, "normpath", osutils._posix_normpath)
998
        self.overrideAttr(osutils, "pathjoin", osutils.posixpath.join)
999
        self.overrideAttr(osutils, "split", osutils.posixpath.split)
1000
        self.overrideAttr(osutils, "MIN_ABS_PATHLENGTH", 1)
1001
1002
    def _with_win32_paths(self):
1003
        self.overrideAttr(urlutils, "local_path_from_url",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1004
                          urlutils._win32_local_path_from_url)
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1005
        self.overrideAttr(urlutils, "MIN_ABS_FILEURL_LENGTH",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1006
                          urlutils.WIN32_MIN_ABS_FILEURL_LENGTH)
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1007
        self.overrideAttr(osutils, "abspath", osutils._win32_abspath)
1008
        self.overrideAttr(osutils, "normpath", osutils._win32_normpath)
1009
        self.overrideAttr(osutils, "pathjoin", osutils._win32_pathjoin)
1010
        self.overrideAttr(osutils, "split", osutils.ntpath.split)
1011
        self.overrideAttr(osutils, "MIN_ABS_PATHLENGTH", 3)
1012
1013
    def test_same_url_posix(self):
1014
        self._with_posix_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1015
        self.assertEqual("",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1016
                         urlutils.file_relpath("file:///a", "file:///a"))
1017
        self.assertEqual("",
1018
                         urlutils.file_relpath("file:///a", "file:///a/"))
1019
        self.assertEqual("",
1020
                         urlutils.file_relpath("file:///a/", "file:///a"))
6240.4.2 by Jelmer Vernooij
Moar tests.
1021
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1022
    def test_same_url_win32(self):
1023
        self._with_win32_paths()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1024
        self.assertEqual("",
7143.15.2 by Jelmer Vernooij
Run autopep8.
1025
                         urlutils.file_relpath("file:///A:/", "file:///A:/"))
1026
        self.assertEqual("",
1027
                         urlutils.file_relpath("file:///A|/", "file:///A:/"))
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1028
        self.assertEqual(
1029
            "", urlutils.file_relpath("file:///A:/b/", "file:///A:/b/"))
1030
        self.assertEqual(
1031
            "", urlutils.file_relpath("file:///A:/b", "file:///A:/b/"))
1032
        self.assertEqual(
1033
            "", 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
1034
1035
    def test_child_posix(self):
1036
        self._with_posix_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1037
        self.assertEqual(
1038
            "b", urlutils.file_relpath("file:///a", "file:///a/b"))
1039
        self.assertEqual(
1040
            "b", urlutils.file_relpath("file:///a/", "file:///a/b"))
1041
        self.assertEqual(
1042
            "b/c", urlutils.file_relpath("file:///a", "file:///a/b/c"))
6240.4.2 by Jelmer Vernooij
Moar tests.
1043
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1044
    def test_child_win32(self):
1045
        self._with_win32_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1046
        self.assertEqual(
1047
            "b", urlutils.file_relpath("file:///A:/", "file:///A:/b"))
1048
        self.assertEqual(
1049
            "b", urlutils.file_relpath("file:///A|/", "file:///A:/b"))
1050
        self.assertEqual(
1051
            "c", urlutils.file_relpath("file:///A:/b", "file:///A:/b/c"))
1052
        self.assertEqual(
1053
            "c", urlutils.file_relpath("file:///A:/b/", "file:///A:/b/c"))
1054
        self.assertEqual(
1055
            "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
1056
1057
    def test_sibling_posix(self):
1058
        self._with_posix_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
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")
1065
        self.assertRaises(
1066
            PathNotChild,
1067
            urlutils.file_relpath, "file:///a/b/", "file:///a/c/")
6240.4.2 by Jelmer Vernooij
Moar tests.
1068
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1069
    def test_sibling_win32(self):
1070
        self._with_win32_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
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")
1077
        self.assertRaises(
1078
            PathNotChild,
1079
            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
1080
1081
    def test_parent_posix(self):
1082
        self._with_posix_paths()
6240.4.2 by Jelmer Vernooij
Moar tests.
1083
        self.assertRaises(PathNotChild,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1084
                          urlutils.file_relpath, "file:///a/b", "file:///a")
6240.4.2 by Jelmer Vernooij
Moar tests.
1085
        self.assertRaises(PathNotChild,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1086
                          urlutils.file_relpath, "file:///a/b", "file:///a/")
6240.4.4 by Martin Packman
Test urlutils.file_relpath against both posix and win32 implementations
1087
1088
    def test_parent_win32(self):
1089
        self._with_win32_paths()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
1090
        self.assertRaises(
1091
            PathNotChild,
1092
            urlutils.file_relpath, "file:///A:/b", "file:///A:/")
1093
        self.assertRaises(
1094
            PathNotChild,
1095
            urlutils.file_relpath, "file:///A:/b/c", "file:///A:/b")
6379.4.4 by Jelmer Vernooij
Add some tests.
1096
1097
1098
class QuoteTests(TestCase):
1099
1100
    def test_quote(self):
1101
        self.assertEqual('abc%20def', urlutils.quote('abc def'))
1102
        self.assertEqual('abc%2Fdef', urlutils.quote('abc/def', safe=''))
1103
        self.assertEqual('abc/def', urlutils.quote('abc/def', safe='/'))
1104
1105
    def test_quote_tildes(self):
7206.3.11 by Jelmer Vernooij
Fix more tests.
1106
        # Whether ~ is quoted by default depends on the python version
1107
        if sys.version_info[:2] >= (3, 7):
1108
            # https://docs.python.org/3/whatsnew/3.7.html#urllib-parse
1109
            self.assertEqual('~foo', urlutils.quote('~foo'))
1110
        else:
1111
            self.assertEqual('%7Efoo', urlutils.quote('~foo'))
6379.4.4 by Jelmer Vernooij
Add some tests.
1112
        self.assertEqual('~foo', urlutils.quote('~foo', safe='/~'))
1113
1114
    def test_unquote(self):
1115
        self.assertEqual('%', urlutils.unquote('%25'))
7058.4.21 by Jelmer Vernooij
Fix some urlutils tests.
1116
        if PY3:
1117
            self.assertEqual('\xe5', urlutils.unquote('%C3%A5'))
1118
        else:
1119
            self.assertEqual('\xc3\xa5', urlutils.unquote('%C3%A5'))
6379.4.4 by Jelmer Vernooij
Add some tests.
1120
        self.assertEqual(u"\xe5", urlutils.unquote(u'\xe5'))
7058.4.21 by Jelmer Vernooij
Fix some urlutils tests.
1121
1122
    def test_unquote_to_bytes(self):
1123
        self.assertEqual(b'%', urlutils.unquote_to_bytes('%25'))
1124
        self.assertEqual(b'\xc3\xa5', urlutils.unquote_to_bytes('%C3%A5'))