~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_serve.py

Merge from bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
import signal
21
21
 
22
22
from bzrlib.branch import Branch
 
23
from bzrlib.bzrdir import BzrDir
23
24
from bzrlib.tests import TestCaseWithTransport
 
25
from bzrlib.transport import smart
 
26
 
 
27
 
 
28
class DoesNotCloseStdOutClient(smart.SmartStreamClient):
 
29
    """A client that doesn't close stdout upon disconnect().
 
30
    
 
31
    We wish to let stdout remain open so that we can see if the server writes
 
32
    anything to stdout during its shutdown.
 
33
    """
 
34
 
 
35
    def disconnect(self):
 
36
        if self._connected:
 
37
            self._connected = False
 
38
            # The client's out is the server's in.
 
39
            self._out.close()
24
40
 
25
41
 
26
42
class TestBzrServe(TestCaseWithTransport):
 
43
 
 
44
    def test_bzr_serve_inet(self):
 
45
        # Make a branch
 
46
        self.make_branch('.')
 
47
 
 
48
        # Serve that branch from the current directory
 
49
        process = self.start_bzr_subprocess(['serve', '--inet'])
 
50
 
 
51
        # Connect to the server
 
52
        # We use this url because while this is no valid URL to connect to this
 
53
        # server instance, the transport needs a URL.
 
54
        client = DoesNotCloseStdOutClient(
 
55
            lambda: (process.stdout, process.stdin))
 
56
        transport = smart.SmartTransport('bzr://localhost/', client=client)
 
57
 
 
58
        # We get a working branch
 
59
        branch = BzrDir.open_from_transport(transport).open_branch()
 
60
        branch.repository.get_revision_graph()
 
61
        self.assertEqual(None, branch.last_revision())
 
62
 
 
63
        # finish with the transport
 
64
        del transport
 
65
        # Disconnect the client forcefully JUST IN CASE because of __del__'s use
 
66
        # in the smart module.
 
67
        client.disconnect()
 
68
 
 
69
        # Shutdown the server: the client should have disconnected cleanly and
 
70
        # closed stdin, so the server process should shut itself down.
 
71
        self.assertTrue(process.stdin.closed)
 
72
        # Hide stdin from the subprocess module, so it won't fail to close it.
 
73
        process.stdin = None
 
74
        result = self.finish_bzr_subprocess(process, retcode=0)
 
75
        self.assertEqual('', result[0])
 
76
        self.assertEqual('', result[1])
27
77
    
28
78
    def test_bzr_serve_port(self):
29
79
        # Make a branch
30
80
        self.make_branch('.')
31
81
 
32
82
        # Serve that branch from the current directory
33
 
        process = self.start_bzr_subprocess('serve', '--port', 'localhost:0')
 
83
        process = self.start_bzr_subprocess(['serve', '--port', 'localhost:0'],
 
84
                                            skip_if_plan_to_signal=True)
34
85
        port_line = process.stdout.readline()
35
86
        prefix = 'listening on port: '
36
87
        self.assertStartsWith(port_line, prefix)