/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bundle.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-09-12 13:52:47 UTC
  • mfrom: (3703.2.3 smart-pull-bug-246233)
  • Revision ID: pqm@pqm.ubuntu.com-20080912135247-pyukwwmlmz79d61r
Fix bug #246233: TooManyConcurrentRequests errors at the start of
        pull/merge. (Andrew Bennetts)

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 socket
19
20
import sys
 
21
import threading
20
22
 
21
23
from bzrlib import (
22
24
    bzrdir,
1587
1589
        self.build_tree_contents([('./foo:bar', out.getvalue())])
1588
1590
        self.assertRaises(errors.NotABundle, read_mergeable_from_url,
1589
1591
                          'foo:bar')
 
1592
 
 
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.
 
1596
        """
 
1597
        # Instantiate a server that will provoke a ConnectionReset
 
1598
        sock_server = _DisconnectingTCPServer()
 
1599
        sock_server.setUp()
 
1600
        self.addCleanup(sock_server.tearDown)
 
1601
        url = sock_server.get_url()
 
1602
        self.assertRaises(errors.ConnectionReset, read_mergeable_from_url, url)
 
1603
 
 
1604
 
 
1605
class _DisconnectingTCPServer(object):
 
1606
    """A TCP server that immediately closes any connection made to it."""
 
1607
 
 
1608
    def setUp(self):
 
1609
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
1610
        self.sock.bind(('127.0.0.1', 0))
 
1611
        self.sock.listen(1)
 
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)
 
1616
        self.thread.start()
 
1617
 
 
1618
    def accept_and_close(self):
 
1619
        conn, addr = self.sock.accept()
 
1620
        conn.shutdown(socket.SHUT_RDWR)
 
1621
        conn.close()
 
1622
 
 
1623
    def get_url(self):
 
1624
        return 'bzr://127.0.0.1:%d/' % (self.port,)
 
1625
 
 
1626
    def tearDown(self):
 
1627
        try:
 
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())
 
1632
            conn.close()
 
1633
        except socket.error:
 
1634
            pass
 
1635
        self.sock.close()
 
1636
        self.thread.join()
 
1637