~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bundle.py

(jelmer) Reduce the number of connections made during "bzr branch
 --stacked". (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
from cStringIO import StringIO
18
18
import os
19
 
import SocketServer
 
19
import socket
20
20
import sys
 
21
import threading
21
22
 
22
23
from bzrlib import (
23
24
    bzrdir,
40
41
from bzrlib.bundle.serializer.v4 import BundleSerializerV4
41
42
from bzrlib.repofmt import knitrepo
42
43
from bzrlib.tests import (
43
 
    features,
 
44
    test_read_bundle,
44
45
    test_commit,
45
 
    test_read_bundle,
46
 
    test_server,
47
46
    )
48
47
from bzrlib.transform import TreeTransform
 
48
from bzrlib.tests import (
 
49
    features,
 
50
    )
49
51
 
50
52
 
51
53
def get_text(vf, key):
1418
1420
            from bzrlib.testament import Testament
1419
1421
            # monkey patch gpg signing mechanism
1420
1422
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
1421
 
            new_config = test_commit.MustSignConfig()
1422
 
            commit.Commit(config_stack=new_config).commit(message="base",
 
1423
            new_config = test_commit.MustSignConfig(branch)
 
1424
            commit.Commit(config=new_config).commit(message="base",
1423
1425
                                                    allow_pointless=True,
1424
1426
                                                    rev_id='B',
1425
1427
                                                    working_tree=tree_a)
1834
1836
        bundle, then the ConnectionReset error should be propagated.
1835
1837
        """
1836
1838
        # Instantiate a server that will provoke a ConnectionReset
1837
 
        sock_server = DisconnectingServer()
 
1839
        sock_server = _DisconnectingTCPServer()
1838
1840
        self.start_server(sock_server)
1839
1841
        # We don't really care what the url is since the server will close the
1840
1842
        # connection without interpreting it
1842
1844
        self.assertRaises(errors.ConnectionReset, read_mergeable_from_url, url)
1843
1845
 
1844
1846
 
1845
 
class DisconnectingHandler(SocketServer.BaseRequestHandler):
1846
 
    """A request handler that immediately closes any connection made to it."""
1847
 
 
1848
 
    def handle(self):
1849
 
        self.request.close()
1850
 
 
1851
 
 
1852
 
class DisconnectingServer(test_server.TestingTCPServerInAThread):
1853
 
 
1854
 
    def __init__(self):
1855
 
        super(DisconnectingServer, self).__init__(
1856
 
            ('127.0.0.1', 0),
1857
 
            test_server.TestingTCPServer,
1858
 
            DisconnectingHandler)
 
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()
1859
1864
 
1860
1865
    def get_url(self):
1861
 
        """Return the url of the server"""
1862
 
        return "bzr://%s:%d/" % self.server.server_address
 
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()