~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bundle.py

Merge hpss-call-counts branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
from cStringIO import StringIO
18
18
import os
19
19
import socket
 
20
import SocketServer
20
21
import sys
21
22
import threading
22
23
 
41
42
from bzrlib.bundle.serializer.v4 import BundleSerializerV4
42
43
from bzrlib.repofmt import knitrepo
43
44
from bzrlib.tests import (
 
45
    features,
 
46
    test_commit,
44
47
    test_read_bundle,
45
 
    test_commit,
 
48
    test_server,
46
49
    )
47
50
from bzrlib.transform import TreeTransform
48
 
from bzrlib.tests import (
49
 
    features,
50
 
    )
51
51
 
52
52
 
53
53
def get_text(vf, key):
1836
1836
        bundle, then the ConnectionReset error should be propagated.
1837
1837
        """
1838
1838
        # Instantiate a server that will provoke a ConnectionReset
1839
 
        sock_server = _DisconnectingTCPServer()
 
1839
        sock_server = DisconnectingServer()
1840
1840
        self.start_server(sock_server)
1841
1841
        # We don't really care what the url is since the server will close the
1842
1842
        # connection without interpreting it
1844
1844
        self.assertRaises(errors.ConnectionReset, read_mergeable_from_url, url)
1845
1845
 
1846
1846
 
1847
 
class _DisconnectingTCPServer(object):
1848
 
    """A TCP server that immediately closes any connection made to it."""
1849
 
 
1850
 
    def start_server(self):
1851
 
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1852
 
        self.sock.bind(('127.0.0.1', 0))
1853
 
        self.sock.listen(1)
1854
 
        self.port = self.sock.getsockname()[1]
1855
 
        self.thread = threading.Thread(
1856
 
            name='%s (port %d)' % (self.__class__.__name__, self.port),
1857
 
            target=self.accept_and_close)
1858
 
        self.thread.start()
1859
 
 
1860
 
    def accept_and_close(self):
1861
 
        conn, addr = self.sock.accept()
1862
 
        conn.shutdown(socket.SHUT_RDWR)
1863
 
        conn.close()
 
1847
class DisconnectingHandler(SocketServer.BaseRequestHandler):
 
1848
    """A request handler that immediately closes any connection made to it."""
 
1849
 
 
1850
    def handle(self):
 
1851
        self.request.close()
 
1852
 
 
1853
 
 
1854
class DisconnectingServer(test_server.TestingTCPServerInAThread):
 
1855
 
 
1856
    def __init__(self):
 
1857
        super(DisconnectingServer, self).__init__(
 
1858
            ('127.0.0.1', 0),
 
1859
            test_server.TestingTCPServer,
 
1860
            DisconnectingHandler)
1864
1861
 
1865
1862
    def get_url(self):
1866
 
        return 'bzr://127.0.0.1:%d/' % (self.port,)
1867
 
 
1868
 
    def stop_server(self):
1869
 
        try:
1870
 
            # make sure the thread dies by connecting to the listening socket,
1871
 
            # just in case the test failed to do so.
1872
 
            conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1873
 
            conn.connect(self.sock.getsockname())
1874
 
            conn.close()
1875
 
        except socket.error:
1876
 
            pass
1877
 
        self.sock.close()
1878
 
        self.thread.join()
 
1863
        """Return the url of the server"""
 
1864
        return "bzr://%s:%d/" % self.server.server_address