/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/plugins/launchpad/test_lp_directory.py

Merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
 
1
# Copyright (C) 2007, 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
"""Tests for indirect branch urls through Launchpad.net"""
 
17
"""Tests for directory lookup through Launchpad.net"""
18
18
 
19
19
import xmlrpclib
20
20
 
22
22
    errors,
23
23
    )
24
24
from bzrlib.branch import Branch
 
25
from bzrlib.directory_service import directories
25
26
from bzrlib.tests import TestCase, TestCaseWithMemoryTransport
26
27
from bzrlib.transport import get_transport
27
 
from bzrlib.plugins.launchpad.lp_indirect import (
28
 
    LaunchpadTransport)
 
28
from bzrlib.plugins.launchpad import _register_directory
 
29
from bzrlib.plugins.launchpad.lp_directory import (
 
30
    LaunchpadDirectory)
29
31
from bzrlib.plugins.launchpad.account import get_lp_login
30
32
 
31
33
 
40
42
        return self
41
43
 
42
44
    def submit(self, service):
 
45
        self._service_url = service.service_url
43
46
        return self._result
44
47
 
45
48
 
46
 
class IndirectUrlTests(TestCase):
47
 
    """Tests for indirect branch urls through Launchpad.net"""
 
49
class DirectoryUrlTests(TestCase):
 
50
    """Tests for branch urls through Launchpad.net directory"""
48
51
 
49
52
    def test_short_form(self):
50
53
        """A launchpad url should map to a http url"""
51
54
        factory = FakeResolveFactory(
52
55
            self, 'apt', dict(urls=[
53
56
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
54
 
        transport = LaunchpadTransport('lp:///')
 
57
        directory = LaunchpadDirectory()
55
58
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
56
 
                          transport._resolve('lp:apt', factory))
57
 
 
58
 
    def test_indirect_through_url(self):
 
59
                          directory._resolve('lp:apt', factory))
 
60
        # Make sure that resolve went to the production server.
 
61
        self.assertEquals('https://xmlrpc.edge.launchpad.net/bazaar/',
 
62
                          factory._service_url)
 
63
 
 
64
    def test_staging(self):
 
65
        """A launchpad url should map to a http url"""
 
66
        factory = FakeResolveFactory(
 
67
            self, 'apt', dict(urls=[
 
68
                    'http://bazaar.staging.launchpad.net/~apt/apt/devel']))
 
69
        url = 'lp://staging/apt'
 
70
        directory = LaunchpadDirectory()
 
71
        self.assertEquals('http://bazaar.staging.launchpad.net/~apt/apt/devel',
 
72
                          directory._resolve(url, factory))
 
73
        # Make sure that resolve went to the staging server.
 
74
        self.assertEquals('https://xmlrpc.staging.launchpad.net/bazaar/',
 
75
                          factory._service_url)
 
76
 
 
77
    def test_url_from_directory(self):
59
78
        """A launchpad url should map to a http url"""
60
79
        factory = FakeResolveFactory(
61
80
            self, 'apt', dict(urls=[
62
81
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
63
 
        transport = LaunchpadTransport('lp:///')
 
82
        directory = LaunchpadDirectory()
64
83
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
65
 
                          transport._resolve('lp:///apt', factory))
 
84
                          directory._resolve('lp:///apt', factory))
66
85
 
67
 
    def test_indirect_skip_bad_schemes(self):
 
86
    def test_directory_skip_bad_schemes(self):
68
87
        factory = FakeResolveFactory(
69
88
            self, 'apt', dict(urls=[
70
89
                    'bad-scheme://bazaar.launchpad.net/~apt/apt/devel',
71
90
                    'http://bazaar.launchpad.net/~apt/apt/devel',
72
91
                    'http://another/location']))
73
 
        transport = LaunchpadTransport('lp:///')
 
92
        directory = LaunchpadDirectory()
74
93
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
75
 
                          transport._resolve('lp:///apt', factory))
 
94
                          directory._resolve('lp:///apt', factory))
76
95
 
77
 
    def test_indirect_no_matching_schemes(self):
 
96
    def test_directory_no_matching_schemes(self):
78
97
        # If the XMLRPC call does not return any protocols we support,
79
98
        # invalidURL is raised.
80
99
        factory = FakeResolveFactory(
81
100
            self, 'apt', dict(urls=[
82
101
                    'bad-scheme://bazaar.launchpad.net/~apt/apt/devel']))
83
 
        transport = LaunchpadTransport('lp:///')
 
102
        directory = LaunchpadDirectory()
84
103
        self.assertRaises(errors.InvalidURL,
85
 
                          transport._resolve, 'lp:///apt', factory)
 
104
                          directory._resolve, 'lp:///apt', factory)
86
105
 
87
 
    def test_indirect_fault(self):
 
106
    def test_directory_fault(self):
88
107
        # Test that XMLRPC faults get converted to InvalidURL errors.
89
108
        factory = FakeResolveFactory(self, 'apt', None)
90
109
        def submit(service):
91
110
            raise xmlrpclib.Fault(42, 'something went wrong')
92
111
        factory.submit = submit
93
 
        transport = LaunchpadTransport('lp:///')
 
112
        directory = LaunchpadDirectory()
94
113
        self.assertRaises(errors.InvalidURL,
95
 
                          transport._resolve, 'lp:///apt', factory)
 
114
                          directory._resolve, 'lp:///apt', factory)
96
115
 
97
116
    def test_skip_bzr_ssh_launchpad_net_when_anonymous(self):
98
117
        # Test that bzr+ssh://bazaar.launchpad.net gets skipped if
102
121
            self, 'apt', dict(urls=[
103
122
                    'bzr+ssh://bazaar.launchpad.net/~apt/apt/devel',
104
123
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
105
 
        transport = LaunchpadTransport('lp:///')
 
124
        directory = LaunchpadDirectory()
106
125
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
107
 
                          transport._resolve('lp:///apt', factory))
 
126
                          directory._resolve('lp:///apt', factory))
108
127
 
109
128
    def test_skip_sftp_launchpad_net_when_anonymous(self):
110
129
        # Test that sftp://bazaar.launchpad.net gets skipped if
114
133
            self, 'apt', dict(urls=[
115
134
                    'sftp://bazaar.launchpad.net/~apt/apt/devel',
116
135
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
117
 
        transport = LaunchpadTransport('lp:///')
 
136
        directory = LaunchpadDirectory()
118
137
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
119
 
                          transport._resolve('lp:///apt', factory))
 
138
                          directory._resolve('lp:///apt', factory))
120
139
 
121
140
    def test_rewrite_bzr_ssh_launchpad_net(self):
122
141
        # Test that bzr+ssh URLs get rewritten to include the user's
125
144
            self, 'apt', dict(urls=[
126
145
                    'bzr+ssh://bazaar.launchpad.net/~apt/apt/devel',
127
146
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
128
 
        transport = LaunchpadTransport('lp:///')
 
147
        directory = LaunchpadDirectory()
129
148
        self.assertEquals(
130
149
            'bzr+ssh://username@bazaar.launchpad.net/~apt/apt/devel',
131
 
            transport._resolve('lp:///apt', factory, _lp_login='username'))
 
150
            directory._resolve('lp:///apt', factory, _lp_login='username'))
132
151
 
133
152
    def test_no_rewrite_of_other_bzr_ssh(self):
134
153
        # Test that we don't rewrite bzr+ssh URLs for other 
137
156
            self, 'apt', dict(urls=[
138
157
                    'bzr+ssh://example.com/~apt/apt/devel',
139
158
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
140
 
        transport = LaunchpadTransport('lp:///')
 
159
        directory = LaunchpadDirectory()
141
160
        self.assertEquals('bzr+ssh://example.com/~apt/apt/devel',
142
 
                          transport._resolve('lp:///apt', factory))
 
161
                          directory._resolve('lp:///apt', factory))
143
162
 
144
163
    # TODO: check we get an error if the url is unreasonable
145
 
    def test_error_for_bad_indirection(self):
 
164
    def test_error_for_bad_url(self):
 
165
        directory = LaunchpadDirectory()
146
166
        self.assertRaises(errors.InvalidURL,
147
 
            LaunchpadTransport, 'lp://ratotehunoahu')
148
 
 
149
 
    def catch_redirect(self, methodname, *args):
150
 
        transport = LaunchpadTransport('lp:///apt')
151
 
        def _resolve(abspath):
152
 
            self.assertEqual('lp:///apt', abspath)
153
 
            return 'http://example.com/~apt/apt/devel'
154
 
        transport._resolve = _resolve
155
 
        try:
156
 
            getattr(transport, methodname)(*args)
157
 
        except errors.RedirectRequested, exc:
158
 
            return exc
159
 
        else:
160
 
            raise self.failException('RedirectRequested not raised')
161
 
 
162
 
    def test_redirect_on_get(self):
163
 
        exc = self.catch_redirect('get', '.bzr/branch-format')
164
 
        self.assertEqual('lp:///apt/.bzr/branch-format', exc.source)
165
 
        self.assertEqual(
166
 
            'http://example.com/~apt/apt/devel/.bzr/branch-format', exc.target)
167
 
 
168
 
    def test_redirect_on_mkdir(self):
169
 
        exc = self.catch_redirect('mkdir', '.')
170
 
        self.assertEqual('lp:///apt', exc.source)
171
 
        self.assertEqual(
172
 
            'http://example.com/~apt/apt/devel', exc.target)
173
 
 
174
 
 
175
 
class IndirectOpenBranchTests(TestCaseWithMemoryTransport):
176
 
 
177
 
    def test_indirect_open_branch(self):
 
167
            directory._resolve, 'lp://ratotehunoahu')
 
168
 
 
169
 
 
170
class DirectoryOpenBranchTests(TestCaseWithMemoryTransport):
 
171
 
 
172
    def test_directory_open_branch(self):
178
173
        # Test that opening an lp: branch redirects to the real location.
179
174
        target_branch = self.make_branch('target')
 
175
        class FooService(object):
 
176
            """A directory service that maps the name to a FILE url"""
 
177
 
 
178
            def look_up(self, name, url):
 
179
                if 'lp:///apt' == url:
 
180
                    return target_branch.base.rstrip('/')
 
181
                return '!unexpected look_up value!'
 
182
 
 
183
        directories.remove('lp:')
 
184
        directories.register('lp:', FooService, 'Map lp URLs to local urls')
 
185
        self.addCleanup(_register_directory)
 
186
        self.addCleanup(lambda: directories.remove('lp:'))
180
187
        transport = get_transport('lp:///apt')
181
 
        def _resolve(abspath):
182
 
            self.assertEqual('lp:///apt', abspath)
183
 
            return target_branch.base.rstrip('/')
184
 
        transport._resolve = _resolve
185
188
        branch = Branch.open_from_transport(transport)
186
189
        self.assertEqual(target_branch.base, branch.base)