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()
299
301
from_url('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
300
302
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
301
303
from_url('file:///path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
302
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
303
from_url('file://localhost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
305
305
self.assertRaises(InvalidURL, from_url, '/path/to/foo')
307
InvalidURL, from_url,
308
'file://remotehost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s')
310
307
def test_win32_local_path_to_url(self):
311
308
to_url = urlutils._win32_local_path_to_url
535
526
'sftp://host/home/jelmer/branch/2b')
536
527
test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
537
528
'http://host/home/jelmer/branch/feature/%2b')
538
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
529
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
539
530
'http://host/home/jelmer/branch/feature/2b')
540
531
# relative_url should preserve a trailing slash
541
532
test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
623
614
self.assertEqual("bar", derive("http://foo/bar"))
624
615
self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
625
616
self.assertEqual("foo-bar", derive("lp:foo-bar"))
628
class TestRebaseURL(TestCase):
629
"""Test the behavior of rebase_url."""
631
def test_non_relative(self):
632
result = urlutils.rebase_url('file://foo', 'file://foo',
634
self.assertEqual('file://foo', result)
635
result = urlutils.rebase_url('/foo', 'file://foo',
637
self.assertEqual('/foo', result)
639
def test_different_ports(self):
640
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
641
'foo', 'http://bar:80', 'http://bar:81')
642
self.assertEqual(str(e), "URLs differ by more than path:"
643
" 'http://bar:80' and 'http://bar:81'")
645
def test_different_hosts(self):
646
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
647
'foo', 'http://bar', 'http://baz')
648
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
651
def test_different_protocol(self):
652
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
653
'foo', 'http://bar', 'ftp://bar')
654
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
657
def test_rebase_success(self):
658
self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
660
self.assertEqual('qux/bar', urlutils.rebase_url('bar',
661
'http://baz/qux', 'http://baz/'))
662
self.assertEqual('.', urlutils.rebase_url('foo',
663
'http://bar/', 'http://bar/foo/'))
664
self.assertEqual('qux/bar', urlutils.rebase_url('../bar',
665
'http://baz/qux/foo', 'http://baz/'))
667
def test_determine_relative_path(self):
668
self.assertEqual('../../baz/bar',
669
urlutils.determine_relative_path(
670
'/qux/quxx', '/baz/bar'))
671
self.assertEqual('..',
672
urlutils.determine_relative_path(
674
self.assertEqual('baz',
675
urlutils.determine_relative_path(
677
self.assertEqual('.', urlutils.determine_relative_path(
681
class TestParseURL(TestCase):
683
def test_parse_url(self):
684
self.assertEqual(urlutils.parse_url('http://example.com:80/one'),
685
('http', None, None, 'example.com', 80, '/one'))
686
self.assertEqual(urlutils.parse_url('http://[1:2:3::40]/one'),
687
('http', None, None, '1:2:3::40', None, '/one'))
688
self.assertEqual(urlutils.parse_url('http://[1:2:3::40]:80/one'),
689
('http', None, None, '1:2:3::40', 80, '/one'))