1587
1589
self.build_tree_contents([('./foo:bar', out.getvalue())])
1588
1590
self.assertRaises(errors.NotABundle, read_mergeable_from_url,
1593
def test_smart_server_connection_reset(self):
1594
"""If a smart server connection fails during the attempt to read a
1595
bundle, then the ConnectionReset error should be propagated.
1597
# Instantiate a server that will provoke a ConnectionReset
1598
sock_server = _DisconnectingTCPServer()
1600
self.addCleanup(sock_server.tearDown)
1601
url = sock_server.get_url()
1602
self.assertRaises(errors.ConnectionReset, read_mergeable_from_url, url)
1605
class _DisconnectingTCPServer(object):
1606
"""A TCP server that immediately closes any connection made to it."""
1609
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1610
self.sock.bind(('127.0.0.1', 0))
1612
self.port = self.sock.getsockname()[1]
1613
self.thread = threading.Thread(
1614
name='%s (port %d)' % (self.__class__.__name__, self.port),
1615
target=self.accept_and_close)
1618
def accept_and_close(self):
1619
conn, addr = self.sock.accept()
1620
conn.shutdown(socket.SHUT_RDWR)
1624
return 'bzr://127.0.0.1:%d/' % (self.port,)
1628
# make sure the thread dies by connecting to the listening socket,
1629
# just in case the test failed to do so.
1630
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1631
conn.connect(self.sock.getsockname())
1633
except socket.error: