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