/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
1
# Copyright (C) 2007 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
16
2822.1.1 by v.ladeuil+lp at free
Fix #59150 (again) by handling paramiko availability for transport_util.py.
17
import bzrlib.hooks
18
19
# SFTPTransport offers better performances but relies on paramiko, if paramiko
20
# is not available, we fallback to FtpTransport
21
from bzrlib.tests import test_sftp_transport
22
if test_sftp_transport.paramiko_loaded:
23
    from bzrlib.transport import sftp
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
24
    _backing_scheme = 'sftp'
2822.1.1 by v.ladeuil+lp at free
Fix #59150 (again) by handling paramiko availability for transport_util.py.
25
    _backing_transport_class = sftp.SFTPTransport
26
    _backing_test_class = test_sftp_transport.TestCaseWithSFTPServer
27
else:
28
    from bzrlib.transport import ftp
29
    from bzrlib.tests import test_ftp_transport
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
30
    _backing_scheme = 'ftp'
2822.1.1 by v.ladeuil+lp at free
Fix #59150 (again) by handling paramiko availability for transport_util.py.
31
    _backing_transport_class = ftp.FtpTransport
32
    _backing_test_class = test_ftp_transport.TestCaseWithFTPServer
33
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
34
from bzrlib.transport import (
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
35
    ConnectedTransport,
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
36
    get_transport,
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
37
    register_transport,
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
38
    register_urlparse_netloc_protocol,
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
39
    unregister_transport,
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
40
    _unregister_urlparse_netloc_protocol,
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
41
    )
2822.1.1 by v.ladeuil+lp at free
Fix #59150 (again) by handling paramiko availability for transport_util.py.
42
43
44
45
class TransportHooks(bzrlib.hooks.Hooks):
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
46
    """Dict-mapping hook name to a list of callables for transport hooks"""
47
48
    def __init__(self):
2822.1.1 by v.ladeuil+lp at free
Fix #59150 (again) by handling paramiko availability for transport_util.py.
49
        super(TransportHooks, self).__init__()
2485.8.34 by Vincent Ladeuil
Refactor mutiple connections detection and fix false positives. Only
50
        # Invoked when the transport has just created a new connection.
51
        # The api signature is (transport, connection, credentials)
52
        self['_set_connection'] = []
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
53
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
54
_hooked_scheme = 'hooked'
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
55
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
56
def _change_scheme_in(url, actual, desired):
2822.1.4 by Vincent Ladeuil
Review feedback.
57
    if not url.startswith(actual + '://'):
2822.1.5 by Vincent Ladeuil
Review feeback.
58
        raise AssertionError('url "%r" does not start with "%r]"'
59
                             % (url, actual))
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
60
    return desired + url[len(actual):]
61
62
2822.1.1 by v.ladeuil+lp at free
Fix #59150 (again) by handling paramiko availability for transport_util.py.
63
class InstrumentedTransport(_backing_transport_class):
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
64
    """Instrumented transport class to test commands behavior"""
65
66
    hooks = TransportHooks()
67
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
68
    def __init__(self, base, _from_transport=None):
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
69
        if not base.startswith(_hooked_scheme + '://'):
70
            raise ValueError(base)
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
71
        # We need to trick the backing transport class about the scheme used
2822.1.4 by Vincent Ladeuil
Review feedback.
72
        # We'll do the reverse when we need to talk to the backing server
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
73
        fake_base = _change_scheme_in(base, _hooked_scheme, _backing_scheme)
74
        super(InstrumentedTransport, self).__init__(
75
            fake_base, _from_transport=_from_transport)
76
        # The following is needed to minimize the effects of our trick above
77
        # while retaining the best compatibility.
78
        self._scheme = _hooked_scheme
79
        base = self._unsplit_url(self._scheme,
80
                                 self._user, self._password,
81
                                 self._host, self._port,
82
                                 self._path)
83
        super(ConnectedTransport, self).__init__(base)
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
84
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
85
86
class ConnectionHookedTransport(InstrumentedTransport):
87
    """Transport instrumented to inspect connections"""
88
2485.8.34 by Vincent Ladeuil
Refactor mutiple connections detection and fix false positives. Only
89
    def _set_connection(self, connection, credentials):
90
        """Called when a new connection is created """
91
        super(ConnectionHookedTransport, self)._set_connection(connection,
92
                                                               credentials)
93
        for hook in self.hooks['_set_connection']:
94
            hook(self, connection, credentials)
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
95
96
2822.1.1 by v.ladeuil+lp at free
Fix #59150 (again) by handling paramiko availability for transport_util.py.
97
class TestCaseWithConnectionHookedTransport(_backing_test_class):
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
98
99
    def setUp(self):
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
100
        register_urlparse_netloc_protocol(_hooked_scheme)
101
        register_transport(_hooked_scheme, ConnectionHookedTransport)
102
103
        def unregister():
104
            unregister_transport(_hooked_scheme, ConnectionHookedTransport)
105
            _unregister_urlparse_netloc_protocol(_hooked_scheme)
106
107
        self.addCleanup(unregister)
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
108
        super(TestCaseWithConnectionHookedTransport, self).setUp()
2485.8.59 by Vincent Ladeuil
Update from review comments.
109
        self.reset_connections()
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
110
        # Add the 'hooked' url to the permitted url list.
111
        # XXX: See TestCase.start_server. This whole module shouldn't need to
112
        # exist - a bug has been filed on that. once its cleanedup/removed, the
113
        # standard test support code will work and permit the server url
114
        # correctly.
115
        url = self.get_url()
116
        t = get_transport(url)
117
        if t.base.endswith('work/'):
118
            t = t.clone('../..')
119
        self.permit_url(t.base)
2485.8.36 by Vincent Ladeuil
Fix test suite to provide a better debugging experience.
120
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
121
    def get_url(self, relpath=None):
122
        super_self = super(TestCaseWithConnectionHookedTransport, self)
123
        url = super_self.get_url(relpath)
2822.1.3 by v.ladeuil+lp at free
Fix backing transport and server usage for ftp support.
124
        # Replace the backing scheme by our own (see
125
        # InstrumentedTransport.__init__)
126
        url = _change_scheme_in(url, _backing_scheme, _hooked_scheme)
2485.8.61 by Vincent Ladeuil
From review comments, use a private scheme for testing.
127
        return url
128
2814.11.1 by Vincent Ladeuil
Renamed install_hooks to start_logging_connections (as per Martin suggestion).
129
    def start_logging_connections(self):
3256.2.13 by Daniel Watkins
Updated uses of Hooks.install_hook to Hooks.install_named_hook in tests.transport_util.
130
        ConnectionHookedTransport.hooks.install_named_hook(
131
            '_set_connection', self._collect_connection, None)
2485.8.59 by Vincent Ladeuil
Update from review comments.
132
        # uninstall our hooks when we are finished
133
        self.addCleanup(self.reset_hooks)
2485.8.36 by Vincent Ladeuil
Fix test suite to provide a better debugging experience.
134
135
    def reset_hooks(self):
136
        InstrumentedTransport.hooks = TransportHooks()
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
137
2485.8.34 by Vincent Ladeuil
Refactor mutiple connections detection and fix false positives. Only
138
    def reset_connections(self):
139
        self.connections = []
140
2814.11.1 by Vincent Ladeuil
Renamed install_hooks to start_logging_connections (as per Martin suggestion).
141
    def _collect_connection(self, transport, connection, credentials):
2485.8.56 by Vincent Ladeuil
Fix bug #112173 and bzr branch multiple connections.
142
        # Note: uncomment the following line and use 'bt' under pdb, that will
143
        # identify all the connections made including the extraneous ones.
2485.8.37 by Vincent Ladeuil
Fix merge multiple connections. Test suite *not* passing (sftp
144
        # import pdb; pdb.set_trace()
2485.8.34 by Vincent Ladeuil
Refactor mutiple connections detection and fix false positives. Only
145
        self.connections.append(connection)
2485.8.5 by Vincent Ladeuil
Factor out InstrumentedTransport.
146