42
44
def submit(self, service):
45
self._service_url = service.service_url
43
46
return self._result
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"""
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))
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/',
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/',
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))
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))
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)
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)
97
116
def test_skip_bzr_ssh_launchpad_net_when_anonymous(self):
98
117
# Test that bzr+ssh://bazaar.launchpad.net gets skipped if
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))
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')
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
156
getattr(transport, methodname)(*args)
157
except errors.RedirectRequested, exc:
160
raise self.failException('RedirectRequested not raised')
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)
166
'http://example.com/~apt/apt/devel/.bzr/branch-format', exc.target)
168
def test_redirect_on_mkdir(self):
169
exc = self.catch_redirect('mkdir', '.')
170
self.assertEqual('lp:///apt', exc.source)
172
'http://example.com/~apt/apt/devel', exc.target)
175
class IndirectOpenBranchTests(TestCaseWithMemoryTransport):
177
def test_indirect_open_branch(self):
167
directory._resolve, 'lp://ratotehunoahu')
170
class DirectoryOpenBranchTests(TestCaseWithMemoryTransport):
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"""
178
def look_up(self, name, url):
179
if 'lp:///apt' == url:
180
return target_branch.base.rstrip('/')
181
return '!unexpected look_up value!'
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)