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