13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""Tests for the urlutils wrapper."""
22
23
from bzrlib import osutils, urlutils, win32utils
23
from bzrlib.errors import InvalidURL, InvalidURLJoin, InvalidRebaseURLs
25
from bzrlib.errors import InvalidURL, InvalidURLJoin
24
26
from bzrlib.tests import TestCaseInTempDir, TestCase, TestSkipped
27
29
class TestUrlToPath(TestCase):
29
31
def test_basename(self):
30
32
# bzrlib.urlutils.basename
31
33
# Test bzrlib.urlutils.split()
195
191
dirname('path/to/foo/', exclude_trailing_slash=False))
196
192
self.assertEqual('path/..', dirname('path/../foo'))
197
193
self.assertEqual('../path', dirname('../path/foo'))
199
def test_is_url(self):
200
self.assertTrue(urlutils.is_url('http://foo/bar'))
201
self.assertTrue(urlutils.is_url('bzr+ssh://foo/bar'))
202
self.assertTrue(urlutils.is_url('lp:foo/bar'))
203
self.assertTrue(urlutils.is_url('file:///foo/bar'))
204
self.assertFalse(urlutils.is_url(''))
205
self.assertFalse(urlutils.is_url('foo'))
206
self.assertFalse(urlutils.is_url('foo/bar'))
207
self.assertFalse(urlutils.is_url('/foo'))
208
self.assertFalse(urlutils.is_url('/foo/bar'))
209
self.assertFalse(urlutils.is_url('C:/'))
210
self.assertFalse(urlutils.is_url('C:/foo'))
211
self.assertFalse(urlutils.is_url('C:/foo/bar'))
213
195
def test_join(self):
214
196
def test(expected, *args):
235
215
test('http://bar/', 'http://foo', 'http://bar/')
236
216
test('http://bar/a', 'http://foo', 'http://bar/a')
237
217
test('http://bar/a/', 'http://foo', 'http://bar/a/')
238
test('lp:bar', 'http://foo', 'lp:bar')
239
test('lp:bar', 'lp:foo', 'lp:bar')
240
test('file:///stuff', 'lp:foo', 'file:///stuff')
242
219
# From a base path
243
220
test('file:///foo', 'file:///', 'foo')
244
221
test('file:///bar/foo', 'file:///bar/', 'foo')
245
222
test('http://host/foo', 'http://host/', 'foo')
246
223
test('http://host/', 'http://host', '')
248
225
# Invalid joinings
249
226
# Cannot go above root
250
227
# Implicitly at root:
283
260
# Test joining to a path with a trailing slash
284
261
test('foo/bar', 'foo/', 'bar')
286
263
# Invalid joinings
287
264
# Cannot go above root
288
265
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '../baz')
289
266
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '..')
290
267
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '/..')
292
def test_join_segment_parameters_raw(self):
293
join_segment_parameters_raw = urlutils.join_segment_parameters_raw
294
self.assertEquals("/somedir/path",
295
join_segment_parameters_raw("/somedir/path"))
296
self.assertEquals("/somedir/path,rawdata",
297
join_segment_parameters_raw("/somedir/path", "rawdata"))
298
self.assertRaises(InvalidURLJoin,
299
join_segment_parameters_raw, "/somedir/path",
300
"rawdata1,rawdata2,rawdata3")
301
self.assertEquals("/somedir/path,bla,bar",
302
join_segment_parameters_raw("/somedir/path", "bla", "bar"))
303
self.assertEquals("/somedir,exist=some/path,bla,bar",
304
join_segment_parameters_raw("/somedir,exist=some/path",
306
self.assertRaises(TypeError, join_segment_parameters_raw,
309
def test_join_segment_parameters(self):
310
join_segment_parameters = urlutils.join_segment_parameters
311
self.assertEquals("/somedir/path",
312
join_segment_parameters("/somedir/path", {}))
313
self.assertEquals("/somedir/path,key1=val1",
314
join_segment_parameters("/somedir/path", {"key1": "val1"}))
315
self.assertRaises(InvalidURLJoin,
316
join_segment_parameters, "/somedir/path",
317
{"branch": "brr,brr,brr"})
318
self.assertRaises(InvalidURLJoin,
319
join_segment_parameters, "/somedir/path", {"key1=val1": "val2"})
320
self.assertEquals("/somedir/path,key1=val1,key2=val2",
321
join_segment_parameters("/somedir/path", {
322
"key1": "val1", "key2": "val2"}))
323
self.assertEquals("/somedir/path,key1=val1,key2=val2",
324
join_segment_parameters("/somedir/path,key1=val1", {
326
self.assertEquals("/somedir/path,key1=val2",
327
join_segment_parameters("/somedir/path,key1=val1", {
329
self.assertEquals("/somedir,exist=some/path,key1=val1",
330
join_segment_parameters("/somedir,exist=some/path",
332
self.assertEquals("/,key1=val1,key2=val2",
333
join_segment_parameters("/,key1=val1", {"key2": "val2"}))
334
self.assertRaises(TypeError,
335
join_segment_parameters, "/,key1=val1", {"foo": 42})
337
269
def test_function_type(self):
338
270
if sys.platform == 'win32':
339
271
self.assertEqual(urlutils._win32_local_path_to_url, urlutils.local_path_to_url)
478
398
self.assertEqual(('path/..', 'foo'), split('path/../foo'))
479
399
self.assertEqual(('../path', 'foo'), split('../path/foo'))
481
def test_split_segment_parameters_raw(self):
482
split_segment_parameters_raw = urlutils.split_segment_parameters_raw
483
self.assertEquals(("/some/path", []),
484
split_segment_parameters_raw("/some/path"))
485
self.assertEquals(("/some/path", ["tip"]),
486
split_segment_parameters_raw("/some/path,tip"))
487
self.assertEquals(("/some,dir/path", ["tip"]),
488
split_segment_parameters_raw("/some,dir/path,tip"))
489
self.assertEquals(("/somedir/path", ["heads%2Ftip"]),
490
split_segment_parameters_raw("/somedir/path,heads%2Ftip"))
491
self.assertEquals(("/somedir/path", ["heads%2Ftip", "bar"]),
492
split_segment_parameters_raw("/somedir/path,heads%2Ftip,bar"))
493
self.assertEquals(("/", ["key1=val1"]),
494
split_segment_parameters_raw(",key1=val1"))
495
self.assertEquals(("foo/", ["key1=val1"]),
496
split_segment_parameters_raw("foo/,key1=val1"))
497
self.assertEquals(("foo/base,la=bla/other/elements", []),
498
split_segment_parameters_raw("foo/base,la=bla/other/elements"))
499
self.assertEquals(("foo/base,la=bla/other/elements", ["a=b"]),
500
split_segment_parameters_raw("foo/base,la=bla/other/elements,a=b"))
502
def test_split_segment_parameters(self):
503
split_segment_parameters = urlutils.split_segment_parameters
504
self.assertEquals(("/some/path", {}),
505
split_segment_parameters("/some/path"))
506
self.assertEquals(("/some/path", {"branch": "tip"}),
507
split_segment_parameters("/some/path,branch=tip"))
508
self.assertEquals(("/some,dir/path", {"branch": "tip"}),
509
split_segment_parameters("/some,dir/path,branch=tip"))
510
self.assertEquals(("/somedir/path", {"ref": "heads%2Ftip"}),
511
split_segment_parameters("/somedir/path,ref=heads%2Ftip"))
512
self.assertEquals(("/somedir/path",
513
{"ref": "heads%2Ftip", "key1": "val1"}),
514
split_segment_parameters(
515
"/somedir/path,ref=heads%2Ftip,key1=val1"))
516
self.assertEquals(("/somedir/path", {"ref": "heads%2F=tip"}),
517
split_segment_parameters("/somedir/path,ref=heads%2F=tip"))
518
self.assertEquals(("/", {"key1": "val1"}),
519
split_segment_parameters(",key1=val1"))
520
self.assertEquals(("foo/", {"key1": "val1"}),
521
split_segment_parameters("foo/,key1=val1"))
522
self.assertEquals(("foo/base,key1=val1/other/elements", {}),
523
split_segment_parameters("foo/base,key1=val1/other/elements"))
524
self.assertEquals(("foo/base,key1=val1/other/elements",
525
{"key2": "val2"}), split_segment_parameters(
526
"foo/base,key1=val1/other/elements,key2=val2"))
528
401
def test_win32_strip_local_trailing_slash(self):
529
402
strip = urlutils._win32_strip_local_trailing_slash
530
403
self.assertEqual('file://', strip('file://'))
666
535
#test('.', 'http://host/', 'http://host')
667
536
test('http://host', 'http://host/', 'http://host')
669
# On Windows file:///C:/path/to and file:///D:/other/path
670
# should not use relative url over the non-existent '/' directory.
671
if sys.platform == 'win32':
673
test('../../other/path',
674
'file:///C:/path/to', 'file:///C:/other/path')
675
#~next two tests is failed, i.e. urlutils.relative_url expects
676
#~to see normalized file URLs?
677
#~test('../../other/path',
678
#~ 'file:///C:/path/to', 'file:///c:/other/path')
679
#~test('../../other/path',
680
#~ 'file:///C:/path/to', 'file:///C|/other/path')
682
# check UNC paths too
683
test('../../other/path',
684
'file://HOST/base/path/to', 'file://HOST/base/other/path')
685
# on different drives
686
test('file:///D:/other/path',
687
'file:///C:/path/to', 'file:///D:/other/path')
688
# TODO: strictly saying in UNC path //HOST/base is full analog
689
# of drive letter for hard disk, and this situation is also
690
# should be exception from rules. [bialix 20071221]
693
539
class TestCwdToURL(TestCaseInTempDir):
694
540
"""Test that local_path_to_url works base on the cwd"""
713
559
os.chdir(u'dod\xe9')
715
# On Mac OSX this directory is actually:
561
# On Mac OSX this directory is actually:
716
562
# u'/dode\u0301' => '/dode\xcc\x81
717
# but we should normalize it back to
563
# but we should normalize it back to
718
564
# u'/dod\xe9' => '/dod\xc3\xa9'
719
565
url = urlutils.local_path_to_url('.')
720
566
self.assertEndsWith(url, '/dod%C3%A9')
723
class TestDeriveToLocation(TestCase):
724
"""Test that the mapping of FROM_LOCATION to TO_LOCATION works."""
726
def test_to_locations_derived_from_paths(self):
727
derive = urlutils.derive_to_location
728
self.assertEqual("bar", derive("bar"))
729
self.assertEqual("bar", derive("../bar"))
730
self.assertEqual("bar", derive("/foo/bar"))
731
self.assertEqual("bar", derive("c:/foo/bar"))
732
self.assertEqual("bar", derive("c:bar"))
734
def test_to_locations_derived_from_urls(self):
735
derive = urlutils.derive_to_location
736
self.assertEqual("bar", derive("http://foo/bar"))
737
self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
738
self.assertEqual("foo-bar", derive("lp:foo-bar"))
741
class TestRebaseURL(TestCase):
742
"""Test the behavior of rebase_url."""
744
def test_non_relative(self):
745
result = urlutils.rebase_url('file://foo', 'file://foo',
747
self.assertEqual('file://foo', result)
748
result = urlutils.rebase_url('/foo', 'file://foo',
750
self.assertEqual('/foo', result)
752
def test_different_ports(self):
753
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
754
'foo', 'http://bar:80', 'http://bar:81')
755
self.assertEqual(str(e), "URLs differ by more than path:"
756
" 'http://bar:80' and 'http://bar:81'")
758
def test_different_hosts(self):
759
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
760
'foo', 'http://bar', 'http://baz')
761
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
764
def test_different_protocol(self):
765
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
766
'foo', 'http://bar', 'ftp://bar')
767
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
770
def test_rebase_success(self):
771
self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
773
self.assertEqual('qux/bar', urlutils.rebase_url('bar',
774
'http://baz/qux', 'http://baz/'))
775
self.assertEqual('.', urlutils.rebase_url('foo',
776
'http://bar/', 'http://bar/foo/'))
777
self.assertEqual('qux/bar', urlutils.rebase_url('../bar',
778
'http://baz/qux/foo', 'http://baz/'))
780
def test_determine_relative_path(self):
781
self.assertEqual('../../baz/bar',
782
urlutils.determine_relative_path(
783
'/qux/quxx', '/baz/bar'))
784
self.assertEqual('..',
785
urlutils.determine_relative_path(
787
self.assertEqual('baz',
788
urlutils.determine_relative_path(
790
self.assertEqual('.', urlutils.determine_relative_path(
794
class TestParseURL(TestCase):
796
def test_parse_url(self):
797
self.assertEqual(urlutils.parse_url('http://example.com:80/one'),
798
('http', None, None, 'example.com', 80, '/one'))
799
self.assertEqual(urlutils.parse_url('http://[1:2:3::40]/one'),
800
('http', None, None, '1:2:3::40', None, '/one'))
801
self.assertEqual(urlutils.parse_url('http://[1:2:3::40]:80/one'),
802
('http', None, None, '1:2:3::40', 80, '/one'))