520
518
self.assertTransportMode(t, 'dir777', 0777)
522
520
def test_put_bytes_unicode(self):
521
# Expect put_bytes to raise AssertionError or UnicodeEncodeError if
522
# given unicode "bytes". UnicodeEncodeError doesn't really make sense
523
# (we don't want to encode unicode here at all, callers should be
524
# strictly passing bytes to put_bytes), but we allow it for backwards
525
# compatibility. At some point we should use a specific exception.
526
# See https://bugs.launchpad.net/bzr/+bug/106898.
523
527
t = self.get_transport()
524
528
if t.is_readonly():
526
530
unicode_string = u'\u1234'
527
self.assertRaises(TypeError, t.put_bytes, 'foo', unicode_string)
532
(AssertionError, UnicodeEncodeError),
533
t.put_bytes, 'foo', unicode_string)
535
def test_put_file_unicode(self):
536
# Like put_bytes, except with a StringIO.StringIO of a unicode string.
537
# This situation can happen (and has) if code is careless about the type
538
# of "string" they initialise/write to a StringIO with. We cannot use
539
# cStringIO, because it never returns unicode from read.
540
# Like put_bytes, UnicodeEncodeError isn't quite the right exception to
541
# raise, but we raise it for hysterical raisins.
542
t = self.get_transport()
545
unicode_file = pyStringIO(u'\u1234')
546
self.assertRaises(UnicodeEncodeError, t.put_file, 'foo', unicode_file)
529
548
def test_mkdir(self):
530
549
t = self.get_transport()
609
628
def test_opening_a_file_stream_can_set_mode(self):
610
629
t = self.get_transport()
611
630
if t.is_readonly():
612
self.assertRaises((TransportNotPossible, NotImplementedError),
613
t.open_write_stream, 'foo')
615
632
if not t._can_roundtrip_unix_modebits():
616
633
# Can't roundtrip, so no need to run this test
619
635
def check_mode(name, mode, expected):
620
636
handle = t.open_write_stream(name, mode=mode)
988
1000
# perhaps all of this could be done in a subdirectory
990
1002
t.put_bytes('a', 'a first file\n')
991
self.assertEqual([True, False], list(t.has_multi(['a', 'b'])))
1003
self.assertEquals([True, False], list(t.has_multi(['a', 'b'])))
993
1005
t.move('a', 'b')
994
1006
self.assertTrue(t.has('b'))
995
1007
self.assertFalse(t.has('a'))
997
1009
self.check_transport_contents('a first file\n', t, 'b')
998
self.assertEqual([False, True], list(t.has_multi(['a', 'b'])))
1010
self.assertEquals([False, True], list(t.has_multi(['a', 'b'])))
1000
1012
# Overwrite a file
1001
1013
t.put_bytes('c', 'c this file\n')
1038
1050
except NotImplementedError:
1039
1051
raise TestSkipped("Transport %s has no bogus URL support." %
1040
1052
self._server.__class__)
1041
t = _mod_transport.get_transport_from_url(url)
1053
t = _mod_transport.get_transport(url)
1042
1054
self.assertRaises((ConnectionError, NoSuchFile), t.get, '.bzr/branch')
1044
1056
def test_stat(self):
1194
1206
raise TestSkipped("not a connected transport")
1196
1208
t2 = t1.clone('subdir')
1197
self.assertEqual(t1._parsed_url.scheme, t2._parsed_url.scheme)
1198
self.assertEqual(t1._parsed_url.user, t2._parsed_url.user)
1199
self.assertEqual(t1._parsed_url.password, t2._parsed_url.password)
1200
self.assertEqual(t1._parsed_url.host, t2._parsed_url.host)
1201
self.assertEqual(t1._parsed_url.port, t2._parsed_url.port)
1209
self.assertEquals(t1._parsed_url.scheme, t2._parsed_url.scheme)
1210
self.assertEquals(t1._parsed_url.user, t2._parsed_url.user)
1211
self.assertEquals(t1._parsed_url.password, t2._parsed_url.password)
1212
self.assertEquals(t1._parsed_url.host, t2._parsed_url.host)
1213
self.assertEquals(t1._parsed_url.port, t2._parsed_url.port)
1203
1215
def test__reuse_for(self):
1204
1216
t = self.get_transport()
1407
1419
# smoke test for abspath on win32.
1408
1420
# a transport based on 'file:///' never fully qualifies the drive.
1409
transport = _mod_transport.get_transport_from_url("file:///")
1421
transport = _mod_transport.get_transport("file:///")
1410
1422
self.assertEqual(transport.abspath("/"), "file:///")
1412
1424
# but a transport that starts with a drive spec must keep it.
1413
transport = _mod_transport.get_transport_from_url("file:///C:/")
1425
transport = _mod_transport.get_transport("file:///C:/")
1414
1426
self.assertEqual(transport.abspath("/"), "file:///C:/")
1416
1428
def test_local_abspath(self):
1768
1780
"""Segment parameters should be stripped and stored in
1769
1781
transport.segment_parameters."""
1770
1782
transport = self.get_transport("foo")
1771
self.assertEqual({}, transport.get_segment_parameters())
1783
self.assertEquals({}, transport.get_segment_parameters())
1773
1785
def test_segment_parameters(self):
1774
1786
"""Segment parameters should be stripped and stored in
1776
1788
base_url = self._server.get_url()
1777
1789
parameters = {"key1": "val1", "key2": "val2"}
1778
1790
url = urlutils.join_segment_parameters(base_url, parameters)
1779
transport = _mod_transport.get_transport_from_url(url)
1780
self.assertEqual(parameters, transport.get_segment_parameters())
1782
def test_set_segment_parameters(self):
1783
"""Segment parameters can be set and show up in base."""
1784
transport = self.get_transport("foo")
1785
orig_base = transport.base
1786
transport.set_segment_parameter("arm", "board")
1787
self.assertEqual("%s,arm=board" % orig_base, transport.base)
1788
self.assertEqual({"arm": "board"}, transport.get_segment_parameters())
1789
transport.set_segment_parameter("arm", None)
1790
transport.set_segment_parameter("nonexistant", None)
1791
self.assertEqual({}, transport.get_segment_parameters())
1792
self.assertEqual(orig_base, transport.base)
1791
transport = _mod_transport.get_transport(url)
1792
self.assertEquals(parameters, transport.get_segment_parameters())
1794
1794
def test_stat_symlink(self):
1795
1795
# if a transport points directly to a symlink (and supports symlinks
1802
1802
t2 = t.clone('link')
1803
1803
st = t2.stat('')
1804
1804
self.assertTrue(stat.S_ISLNK(st.st_mode))
1806
def test_abspath_url_unquote_unreserved(self):
1807
"""URLs from abspath should have unreserved characters unquoted
1809
Need consistent quoting notably for tildes, see lp:842223 for more.
1811
t = self.get_transport()
1812
needlessly_escaped_dir = "%2D%2E%30%39%41%5A%5F%61%7A%7E/"
1813
self.assertEqual(t.base + "-.09AZ_az~",
1814
t.abspath(needlessly_escaped_dir))
1816
def test_clone_url_unquote_unreserved(self):
1817
"""Base URL of a cloned branch needs unreserved characters unquoted
1819
Cloned transports should be prefix comparable for things like the
1820
isolation checking of tests, see lp:842223 for more.
1822
t1 = self.get_transport()
1823
needlessly_escaped_dir = "%2D%2E%30%39%41%5A%5F%61%7A%7E/"
1824
self.build_tree([needlessly_escaped_dir], transport=t1)
1825
t2 = t1.clone(needlessly_escaped_dir)
1826
self.assertEqual(t1.base + "-.09AZ_az~/", t2.base)
1828
def test_hook_post_connection_one(self):
1829
"""Fire post_connect hook after a ConnectedTransport is first used"""
1831
Transport.hooks.install_named_hook("post_connect", log.append, None)
1832
t = self.get_transport()
1833
self.assertEqual([], log)
1834
t.has("non-existant")
1835
if isinstance(t, RemoteTransport):
1836
self.assertEqual([t.get_smart_medium()], log)
1837
elif isinstance(t, ConnectedTransport):
1838
self.assertEqual([t], log)
1840
self.assertEqual([], log)
1842
def test_hook_post_connection_multi(self):
1843
"""Fire post_connect hook once per unshared underlying connection"""
1845
Transport.hooks.install_named_hook("post_connect", log.append, None)
1846
t1 = self.get_transport()
1848
t3 = self.get_transport()
1849
self.assertEqual([], log)
1853
if isinstance(t1, RemoteTransport):
1854
self.assertEqual([t.get_smart_medium() for t in [t1, t3]], log)
1855
elif isinstance(t1, ConnectedTransport):
1856
self.assertEqual([t1, t3], log)
1858
self.assertEqual([], log)