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
24
from bzrlib.errors import InvalidURL, InvalidURLJoin
24
25
from bzrlib.tests import TestCaseInTempDir, TestCase, TestSkipped
27
28
class TestUrlToPath(TestCase):
29
30
def test_basename(self):
30
31
# bzrlib.urlutils.basename
31
32
# Test bzrlib.urlutils.split()
299
300
from_url('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
300
301
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
301
302
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
304
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
306
def test_win32_local_path_to_url(self):
311
307
to_url = urlutils._win32_local_path_to_url
535
525
'sftp://host/home/jelmer/branch/2b')
536
526
test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
537
527
'http://host/home/jelmer/branch/feature/%2b')
538
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
528
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
539
529
'http://host/home/jelmer/branch/feature/2b')
540
530
# relative_url should preserve a trailing slash
541
531
test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
623
613
self.assertEqual("bar", derive("http://foo/bar"))
624
614
self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
625
615
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'))