~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugins/launchpad/test_lp_directory.py

  • Committer: John Arbash Meinel
  • Author(s): Mark Hammond
  • Date: 2008-09-09 17:02:21 UTC
  • mto: This revision was merged to the branch mainline in revision 3697.
  • Revision ID: john@arbash-meinel.com-20080909170221-svim3jw2mrz0amp3
An updated transparent icon for bzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007-2012, 2016 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Tests for directory lookup through Launchpad.net"""
18
18
 
19
 
import os
20
19
import xmlrpclib
21
20
 
22
 
import bzrlib
23
21
from bzrlib import (
24
 
    debug,
25
22
    errors,
26
 
    tests,
27
 
    transport,
28
23
    )
29
24
from bzrlib.branch import Branch
30
25
from bzrlib.directory_service import directories
31
 
from bzrlib.tests import (
32
 
    features,
33
 
    ssl_certs,
34
 
    TestCaseInTempDir,
35
 
    TestCaseWithMemoryTransport
36
 
)
37
 
from bzrlib.plugins.launchpad import (
38
 
    _register_directory,
39
 
    lp_registration,
40
 
    )
 
26
from bzrlib.tests import TestCase, TestCaseWithMemoryTransport
 
27
from bzrlib.transport import get_transport
 
28
from bzrlib.plugins.launchpad import _register_directory
41
29
from bzrlib.plugins.launchpad.lp_directory import (
42
30
    LaunchpadDirectory)
43
 
from bzrlib.plugins.launchpad.account import get_lp_login, set_lp_login
44
 
from bzrlib.tests import http_server
45
 
 
46
 
 
47
 
def load_tests(standard_tests, module, loader):
48
 
    result = loader.suiteClass()
49
 
    t_tests, remaining_tests = tests.split_suite_by_condition(
50
 
        standard_tests, tests.condition_isinstance((
51
 
                TestXMLRPCTransport,
52
 
                )))
53
 
    transport_scenarios = [
54
 
        ('http', dict(server_class=PreCannedHTTPServer,)),
55
 
        ]
56
 
    if features.HTTPSServerFeature.available():
57
 
        transport_scenarios.append(
58
 
            ('https', dict(server_class=PreCannedHTTPSServer,)),
59
 
            )
60
 
    tests.multiply_tests(t_tests, transport_scenarios, result)
61
 
 
62
 
    # No parametrization for the remaining tests
63
 
    result.addTests(remaining_tests)
64
 
 
65
 
    return result
 
31
from bzrlib.plugins.launchpad.account import get_lp_login
66
32
 
67
33
 
68
34
class FakeResolveFactory(object):
69
 
 
70
35
    def __init__(self, test, expected_path, result):
71
36
        self._test = test
72
37
        self._expected_path = expected_path
73
38
        self._result = result
74
 
        self._submitted = False
75
39
 
76
40
    def __call__(self, path):
77
41
        self._test.assertEqual(self._expected_path, path)
79
43
 
80
44
    def submit(self, service):
81
45
        self._service_url = service.service_url
82
 
        self._submitted = True
83
46
        return self._result
84
47
 
85
48
 
86
 
class LocalDirectoryURLTests(TestCaseInTempDir):
87
 
    """Tests for branch urls that we try to pass through local resolution."""
88
 
 
89
 
    def assertResolve(self, expected, url, submitted=False):
90
 
        path = url[url.index(':')+1:].lstrip('/')
91
 
        factory = FakeResolveFactory(self, path,
92
 
                    dict(urls=['bzr+ssh://fake-resolved']))
93
 
        directory = LaunchpadDirectory()
94
 
        self.assertEqual(expected,
95
 
            directory._resolve(url, factory, _lp_login='user'))
96
 
        # We are testing local resolution, and the fallback when necessary.
97
 
        self.assertEqual(submitted, factory._submitted)
98
 
 
99
 
    def test_short_form(self):
100
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/apt',
101
 
                           'lp:apt')
102
 
 
103
 
    def test_two_part_form(self):
104
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/apt/2.2',
105
 
                           'lp:apt/2.2')
106
 
 
107
 
    def test_two_part_plus_subdir(self):
108
 
        # We allow you to pass more than just what resolves. That way you can
109
 
        # do things like "bzr log lp:apt/2.2/BUGS"
110
 
        # Though the virtual FS implementation currently aborts when given a
111
 
        # URL like this, rather than letting you recurse upwards to find the
112
 
        # real branch at lp:apt/2.2
113
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/apt/2.2/BUGS',
114
 
                           'lp:apt/2.2/BUGS')
115
 
 
116
 
    def test_user_expansion(self):
117
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/~user/apt/foo',
118
 
                           'lp:~/apt/foo')
119
 
 
120
 
    def test_ubuntu(self):
121
 
        # Confirmed against xmlrpc. If you don't have a ~user, xmlrpc doesn't
122
 
        # care that you are asking for 'ubuntu'
123
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/ubuntu',
124
 
                           'lp:ubuntu')
125
 
 
126
 
    def test_ubuntu_invalid(self):
127
 
        """Invalid ubuntu urls don't crash.
128
 
 
129
 
        :seealso: http://pad.lv/843900
130
 
        """
131
 
        # This ought to be natty-updates.
132
 
        self.assertRaises(errors.InvalidURL,
133
 
            self.assertResolve,
134
 
            '',
135
 
            'ubuntu:natty/updates/smartpm')
136
 
 
137
 
    def test_ubuntu_apt(self):
138
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/apt',
139
 
                           'lp:ubuntu/apt')
140
 
 
141
 
    def test_ubuntu_natty_apt(self):
142
 
        self.assertResolve(
143
 
            'bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/natty/apt',
144
 
            'lp:ubuntu/natty/apt')
145
 
 
146
 
    def test_ubuntu_natty_apt_filename(self):
147
 
        self.assertResolve(
148
 
            'bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/natty/apt/filename',
149
 
            'lp:ubuntu/natty/apt/filename')
150
 
 
151
 
    def test_user_two_part(self):
152
 
        # We fall back to the ResolveFactory. The real Launchpad one will raise
153
 
        # InvalidURL for this case.
154
 
        self.assertResolve('bzr+ssh://fake-resolved', 'lp:~jameinel/apt',
155
 
                           submitted=True)
156
 
 
157
 
    def test_user_three_part(self):
158
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/~jameinel/apt/foo',
159
 
                           'lp:~jameinel/apt/foo')
160
 
 
161
 
    def test_user_three_part_plus_filename(self):
162
 
        self.assertResolve(
163
 
            'bzr+ssh://bazaar.launchpad.net/~jameinel/apt/foo/fname',
164
 
            'lp:~jameinel/apt/foo/fname')
165
 
 
166
 
    def test_user_ubuntu_two_part(self):
167
 
        self.assertResolve('bzr+ssh://fake-resolved', 'lp:~jameinel/ubuntu',
168
 
                           submitted=True)
169
 
        self.assertResolve('bzr+ssh://fake-resolved', 'lp:~jameinel/debian',
170
 
                           submitted=True)
171
 
 
172
 
    def test_user_ubuntu_three_part(self):
173
 
        self.assertResolve('bzr+ssh://fake-resolved',
174
 
                           'lp:~jameinel/ubuntu/natty', submitted=True)
175
 
        self.assertResolve('bzr+ssh://fake-resolved',
176
 
                           'lp:~jameinel/debian/sid', submitted=True)
177
 
 
178
 
    def test_user_ubuntu_four_part(self):
179
 
        self.assertResolve('bzr+ssh://fake-resolved',
180
 
                           'lp:~jameinel/ubuntu/natty/project', submitted=True)
181
 
        self.assertResolve('bzr+ssh://fake-resolved',
182
 
                           'lp:~jameinel/debian/sid/project', submitted=True)
183
 
 
184
 
    def test_user_ubuntu_five_part(self):
185
 
        self.assertResolve(
186
 
            'bzr+ssh://bazaar.launchpad.net/~jameinel/ubuntu/natty/apt/branch',
187
 
            'lp:~jameinel/ubuntu/natty/apt/branch')
188
 
        self.assertResolve(
189
 
            'bzr+ssh://bazaar.launchpad.net/~jameinel/debian/sid/apt/branch',
190
 
            'lp:~jameinel/debian/sid/apt/branch')
191
 
 
192
 
    def test_user_ubuntu_five_part_plus_subdir(self):
193
 
        self.assertResolve(
194
 
            'bzr+ssh://bazaar.launchpad.net/~jameinel/ubuntu/natty/apt/branch/f',
195
 
            'lp:~jameinel/ubuntu/natty/apt/branch/f')
196
 
        self.assertResolve(
197
 
            'bzr+ssh://bazaar.launchpad.net/~jameinel/debian/sid/apt/branch/f',
198
 
            'lp:~jameinel/debian/sid/apt/branch/f')
199
 
 
200
 
    def test_handles_special_lp(self):
201
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/apt', 'lp:apt')
202
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/apt',
203
 
                           'lp:///apt')
204
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/apt',
205
 
                           'lp://production/apt')
206
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.dev/+branch/apt',
207
 
                           'lp://dev/apt')
208
 
        self.assertResolve('bzr+ssh://bazaar.staging.launchpad.net/+branch/apt',
209
 
                           'lp://staging/apt')
210
 
        self.assertResolve('bzr+ssh://bazaar.qastaging.launchpad.net/+branch/apt',
211
 
                           'lp://qastaging/apt')
212
 
        self.assertResolve('bzr+ssh://bazaar.demo.launchpad.net/+branch/apt',
213
 
                           'lp://demo/apt')
214
 
 
215
 
    def test_debug_launchpad_uses_resolver(self):
216
 
        self.assertResolve('bzr+ssh://bazaar.launchpad.net/+branch/bzr',
217
 
                           'lp:bzr', submitted=False)
218
 
        debug.debug_flags.add('launchpad')
219
 
        self.addCleanup(debug.debug_flags.discard, 'launchpad')
220
 
        self.assertResolve('bzr+ssh://fake-resolved', 'lp:bzr', submitted=True)
221
 
 
222
 
 
223
 
class DirectoryUrlTests(TestCaseInTempDir):
 
49
class DirectoryUrlTests(TestCase):
224
50
    """Tests for branch urls through Launchpad.net directory"""
225
51
 
226
52
    def test_short_form(self):
229
55
            self, 'apt', dict(urls=[
230
56
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
231
57
        directory = LaunchpadDirectory()
232
 
        self.assertEqual('http://bazaar.launchpad.net/~apt/apt/devel',
 
58
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
233
59
                          directory._resolve('lp:apt', factory))
234
60
        # Make sure that resolve went to the production server.
235
 
        self.assertEqual('https://xmlrpc.launchpad.net/bazaar/',
236
 
                          factory._service_url)
237
 
 
238
 
    def test_qastaging(self):
239
 
        """A launchpad url should map to a http url"""
240
 
        factory = FakeResolveFactory(
241
 
            self, 'apt', dict(urls=[
242
 
                    'http://bazaar.qastaging.launchpad.net/~apt/apt/devel']))
243
 
        url = 'lp://qastaging/apt'
244
 
        directory = LaunchpadDirectory()
245
 
        self.assertEqual('http://bazaar.qastaging.launchpad.net/~apt/apt/devel',
246
 
                          directory._resolve(url, factory))
247
 
        # Make sure that resolve went to the qastaging server.
248
 
        self.assertEqual('https://xmlrpc.qastaging.launchpad.net/bazaar/',
 
61
        self.assertEquals('https://xmlrpc.edge.launchpad.net/bazaar/',
249
62
                          factory._service_url)
250
63
 
251
64
    def test_staging(self):
255
68
                    'http://bazaar.staging.launchpad.net/~apt/apt/devel']))
256
69
        url = 'lp://staging/apt'
257
70
        directory = LaunchpadDirectory()
258
 
        self.assertEqual('http://bazaar.staging.launchpad.net/~apt/apt/devel',
 
71
        self.assertEquals('http://bazaar.staging.launchpad.net/~apt/apt/devel',
259
72
                          directory._resolve(url, factory))
260
73
        # Make sure that resolve went to the staging server.
261
 
        self.assertEqual('https://xmlrpc.staging.launchpad.net/bazaar/',
 
74
        self.assertEquals('https://xmlrpc.staging.launchpad.net/bazaar/',
262
75
                          factory._service_url)
263
76
 
264
77
    def test_url_from_directory(self):
267
80
            self, 'apt', dict(urls=[
268
81
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
269
82
        directory = LaunchpadDirectory()
270
 
        self.assertEqual('http://bazaar.launchpad.net/~apt/apt/devel',
 
83
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
271
84
                          directory._resolve('lp:///apt', factory))
272
85
 
273
86
    def test_directory_skip_bad_schemes(self):
277
90
                    'http://bazaar.launchpad.net/~apt/apt/devel',
278
91
                    'http://another/location']))
279
92
        directory = LaunchpadDirectory()
280
 
        self.assertEqual('http://bazaar.launchpad.net/~apt/apt/devel',
 
93
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
281
94
                          directory._resolve('lp:///apt', factory))
282
95
 
283
96
    def test_directory_no_matching_schemes(self):
309
122
                    'bzr+ssh://bazaar.launchpad.net/~apt/apt/devel',
310
123
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
311
124
        directory = LaunchpadDirectory()
312
 
        self.assertEqual('http://bazaar.launchpad.net/~apt/apt/devel',
 
125
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
313
126
                          directory._resolve('lp:///apt', factory))
314
127
 
315
128
    def test_skip_sftp_launchpad_net_when_anonymous(self):
321
134
                    'sftp://bazaar.launchpad.net/~apt/apt/devel',
322
135
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
323
136
        directory = LaunchpadDirectory()
324
 
        self.assertEqual('http://bazaar.launchpad.net/~apt/apt/devel',
 
137
        self.assertEquals('http://bazaar.launchpad.net/~apt/apt/devel',
325
138
                          directory._resolve('lp:///apt', factory))
326
139
 
327
 
    def test_with_login_avoid_resolve_factory(self):
 
140
    def test_rewrite_bzr_ssh_launchpad_net(self):
328
141
        # Test that bzr+ssh URLs get rewritten to include the user's
329
142
        # Launchpad ID (assuming we know the Launchpad ID).
330
143
        factory = FakeResolveFactory(
331
144
            self, 'apt', dict(urls=[
332
 
                    'bzr+ssh://my-super-custom/special/devel',
 
145
                    'bzr+ssh://bazaar.launchpad.net/~apt/apt/devel',
333
146
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
334
147
        directory = LaunchpadDirectory()
335
 
        self.assertEqual(
336
 
            'bzr+ssh://bazaar.launchpad.net/+branch/apt',
 
148
        self.assertEquals(
 
149
            'bzr+ssh://username@bazaar.launchpad.net/~apt/apt/devel',
337
150
            directory._resolve('lp:///apt', factory, _lp_login='username'))
338
151
 
339
152
    def test_no_rewrite_of_other_bzr_ssh(self):
340
 
        # Test that we don't rewrite bzr+ssh URLs for other
 
153
        # Test that we don't rewrite bzr+ssh URLs for other 
341
154
        self.assertEqual(None, get_lp_login())
342
155
        factory = FakeResolveFactory(
343
156
            self, 'apt', dict(urls=[
344
157
                    'bzr+ssh://example.com/~apt/apt/devel',
345
158
                    'http://bazaar.launchpad.net/~apt/apt/devel']))
346
159
        directory = LaunchpadDirectory()
347
 
        self.assertEqual('bzr+ssh://example.com/~apt/apt/devel',
 
160
        self.assertEquals('bzr+ssh://example.com/~apt/apt/devel',
348
161
                          directory._resolve('lp:///apt', factory))
349
162
 
350
163
    # TODO: check we get an error if the url is unreasonable
353
166
        self.assertRaises(errors.InvalidURL,
354
167
            directory._resolve, 'lp://ratotehunoahu')
355
168
 
356
 
    def test_resolve_tilde_to_user(self):
357
 
        factory = FakeResolveFactory(
358
 
            self, '~username/apt/test', dict(urls=[
359
 
                'bzr+ssh://bazaar.launchpad.net/~username/apt/test']))
360
 
        directory = LaunchpadDirectory()
361
 
        self.assertEqual(
362
 
            'bzr+ssh://bazaar.launchpad.net/~username/apt/test',
363
 
            directory._resolve('lp:~/apt/test', factory, _lp_login='username'))
364
 
        # Should also happen when the login is just set by config
365
 
        set_lp_login('username')
366
 
        self.assertEqual(
367
 
            'bzr+ssh://bazaar.launchpad.net/~username/apt/test',
368
 
            directory._resolve('lp:~/apt/test', factory))
369
 
 
370
 
    def test_tilde_fails_no_login(self):
371
 
        factory = FakeResolveFactory(
372
 
            self, '~username/apt/test', dict(urls=[
373
 
                    'bzr+ssh://bazaar.launchpad.net/~username/apt/test']))
374
 
        self.assertIs(None, get_lp_login())
375
 
        directory = LaunchpadDirectory()
376
 
        self.assertRaises(errors.InvalidURL,
377
 
                          directory._resolve, 'lp:~/apt/test', factory)
378
 
 
379
169
 
380
170
class DirectoryOpenBranchTests(TestCaseWithMemoryTransport):
381
171
 
391
181
                return '!unexpected look_up value!'
392
182
 
393
183
        directories.remove('lp:')
394
 
        directories.remove('ubuntu:')
395
 
        directories.remove('debianlp:')
396
184
        directories.register('lp:', FooService, 'Map lp URLs to local urls')
397
185
        self.addCleanup(_register_directory)
398
 
        self.addCleanup(directories.remove, 'lp:')
399
 
        t = transport.get_transport('lp:///apt')
400
 
        branch = Branch.open_from_transport(t)
 
186
        self.addCleanup(lambda: directories.remove('lp:'))
 
187
        transport = get_transport('lp:///apt')
 
188
        branch = Branch.open_from_transport(transport)
401
189
        self.assertEqual(target_branch.base, branch.base)
402
 
 
403
 
 
404
 
class PredefinedRequestHandler(http_server.TestingHTTPRequestHandler):
405
 
    """Request handler for a unique and pre-defined request.
406
 
 
407
 
    The only thing we care about here is that we receive a connection. But
408
 
    since we want to dialog with a real http client, we have to send it correct
409
 
    responses.
410
 
 
411
 
    We expect to receive a *single* request nothing more (and we won't even
412
 
    check what request it is), the tests will recognize us from our response.
413
 
    """
414
 
 
415
 
    def handle_one_request(self):
416
 
        tcs = self.server.test_case_server
417
 
        requestline = self.rfile.readline()
418
 
        self.MessageClass(self.rfile, 0)
419
 
        if requestline.startswith('POST'):
420
 
            # The body should be a single line (or we don't know where it ends
421
 
            # and we don't want to issue a blocking read)
422
 
            self.rfile.readline()
423
 
 
424
 
        self.wfile.write(tcs.canned_response)
425
 
 
426
 
 
427
 
class PreCannedServerMixin(object):
428
 
 
429
 
    def __init__(self):
430
 
        super(PreCannedServerMixin, self).__init__(
431
 
            request_handler=PredefinedRequestHandler)
432
 
        # Bytes read and written by the server
433
 
        self.bytes_read = 0
434
 
        self.bytes_written = 0
435
 
        self.canned_response = None
436
 
 
437
 
 
438
 
class PreCannedHTTPServer(PreCannedServerMixin, http_server.HttpServer):
439
 
    pass
440
 
 
441
 
 
442
 
if features.HTTPSServerFeature.available():
443
 
    from bzrlib.tests import https_server
444
 
    class PreCannedHTTPSServer(PreCannedServerMixin, https_server.HTTPSServer):
445
 
        pass
446
 
 
447
 
 
448
 
class TestXMLRPCTransport(tests.TestCase):
449
 
 
450
 
    # set by load_tests
451
 
    server_class = None
452
 
 
453
 
    def setUp(self):
454
 
        super(TestXMLRPCTransport, self).setUp()
455
 
        self.server = self.server_class()
456
 
        self.server.start_server()
457
 
        self.addCleanup(self.server.stop_server)
458
 
        # Ensure we don't clobber env
459
 
        self.overrideEnv('BZR_LP_XMLRPC_URL', None)
460
 
        # Ensure we use the right certificates for https.
461
 
        # FIXME: There should be a better way but the only alternative I can
462
 
        # think of involves carrying the ca_certs through the lp_registration
463
 
        # infrastructure to _urllib2_wrappers... -- vila 2012-01-20
464
 
        bzrlib.global_state.cmdline_overrides._from_cmdline(
465
 
            ['ssl.ca_certs=%s' % ssl_certs.build_path('ca.crt')])
466
 
 
467
 
    def set_canned_response(self, server, path):
468
 
        response_format = '''HTTP/1.1 200 OK\r
469
 
Date: Tue, 11 Jul 2006 04:32:56 GMT\r
470
 
Server: Apache/2.0.54 (Fedora)\r
471
 
Last-Modified: Sun, 23 Apr 2006 19:35:20 GMT\r
472
 
ETag: "56691-23-38e9ae00"\r
473
 
Accept-Ranges: bytes\r
474
 
Content-Length: %(length)d\r
475
 
Connection: close\r
476
 
Content-Type: text/plain; charset=UTF-8\r
477
 
\r
478
 
<?xml version='1.0'?>
479
 
<methodResponse>
480
 
<params>
481
 
<param>
482
 
<value><struct>
483
 
<member>
484
 
<name>urls</name>
485
 
<value><array><data>
486
 
<value><string>bzr+ssh://bazaar.launchpad.net/%(path)s</string></value>
487
 
<value><string>http://bazaar.launchpad.net/%(path)s</string></value>
488
 
</data></array></value>
489
 
</member>
490
 
</struct></value>
491
 
</param>
492
 
</params>
493
 
</methodResponse>
494
 
'''
495
 
        length = 334 + 2 * len(path)
496
 
        server.canned_response = response_format % dict(length=length,
497
 
                                                        path=path)
498
 
 
499
 
    def do_request(self, server_url):
500
 
        os.environ['BZR_LP_XMLRPC_URL'] = self.server.get_url()
501
 
        service = lp_registration.LaunchpadService()
502
 
        resolve = lp_registration.ResolveLaunchpadPathRequest('bzr')
503
 
        result = resolve.submit(service)
504
 
        return result
505
 
 
506
 
    def test_direct_request(self):
507
 
        self.set_canned_response(self.server, '~bzr-pqm/bzr/bzr.dev')
508
 
        result = self.do_request(self.server.get_url())
509
 
        urls = result.get('urls', None)
510
 
        self.assertIsNot(None, urls)
511
 
        self.assertEqual(
512
 
            ['bzr+ssh://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev',
513
 
             'http://bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev'],
514
 
            urls)
515
 
    # FIXME: we need to test with a real proxy, I can't find a way so simulate
516
 
    # CONNECT without leaving one server hanging the test :-/ Since that maybe
517
 
    # related to the leaking tests problems, I'll punt for now -- vila 20091030
518
 
 
519
 
 
520
 
class TestDebuntuExpansions(TestCaseInTempDir):
521
 
    """Test expansions for ubuntu: and debianlp: schemes."""
522
 
 
523
 
    def setUp(self):
524
 
        super(TestDebuntuExpansions, self).setUp()
525
 
        self.directory = LaunchpadDirectory()
526
 
 
527
 
    def _make_factory(self, package='foo', distro='ubuntu', series=None):
528
 
        if series is None:
529
 
            path = '%s/%s' % (distro, package)
530
 
            url_suffix = '~branch/%s/%s' % (distro, package)
531
 
        else:
532
 
            path = '%s/%s/%s' % (distro, series, package)
533
 
            url_suffix = '~branch/%s/%s/%s' % (distro, series, package)
534
 
        return FakeResolveFactory(
535
 
            self, path, dict(urls=[
536
 
                'http://bazaar.launchpad.net/' + url_suffix]))
537
 
 
538
 
    def assertURL(self, expected_url, shortcut, package='foo', distro='ubuntu',
539
 
                  series=None):
540
 
        factory = self._make_factory(package=package, distro=distro,
541
 
                                     series=series)
542
 
        self.assertEqual('http://bazaar.launchpad.net/~branch/' + expected_url,
543
 
                         self.directory._resolve(shortcut, factory))
544
 
 
545
 
    # Bogus distro.
546
 
 
547
 
    def test_bogus_distro(self):
548
 
        self.assertRaises(errors.InvalidURL,
549
 
                          self.directory._resolve, 'gentoo:foo')
550
 
 
551
 
    def test_trick_bogus_distro_u(self):
552
 
        self.assertRaises(errors.InvalidURL,
553
 
                          self.directory._resolve, 'utube:foo')
554
 
 
555
 
    def test_trick_bogus_distro_d(self):
556
 
        self.assertRaises(errors.InvalidURL,
557
 
                          self.directory._resolve, 'debuntu:foo')
558
 
 
559
 
    def test_missing_ubuntu_distroseries_without_project(self):
560
 
        # Launchpad does not hold source packages for Intrepid.  Missing or
561
 
        # bogus distroseries with no project name is treated like a project.
562
 
        self.assertURL('ubuntu/intrepid', 'ubuntu:intrepid', package='intrepid')
563
 
 
564
 
    def test_missing_ubuntu_distroseries_with_project(self):
565
 
        # Launchpad does not hold source packages for Intrepid.  Missing or
566
 
        # bogus distroseries with a project name is treated like an unknown
567
 
        # series (i.e. we keep it verbatim).
568
 
        self.assertURL('ubuntu/intrepid/foo',
569
 
                       'ubuntu:intrepid/foo', series='intrepid')
570
 
 
571
 
    def test_missing_debian_distroseries(self):
572
 
        # Launchpad does not hold source packages for unstable.  Missing or
573
 
        # bogus distroseries is treated like a project.
574
 
        self.assertURL('debian/sid',
575
 
                       'debianlp:sid', package='sid', distro='debian')
576
 
 
577
 
    # Ubuntu Default distro series.
578
 
 
579
 
    def test_ubuntu_default_distroseries_expansion(self):
580
 
        self.assertURL('ubuntu/foo', 'ubuntu:foo')
581
 
 
582
 
    def test_ubuntu_natty_distroseries_expansion(self):
583
 
        self.assertURL('ubuntu/natty/foo', 'ubuntu:natty/foo', series='natty')
584
 
 
585
 
    def test_ubuntu_n_distroseries_expansion(self):
586
 
        self.assertURL('ubuntu/natty/foo', 'ubuntu:n/foo', series='natty')
587
 
 
588
 
    def test_ubuntu_maverick_distroseries_expansion(self):
589
 
        self.assertURL('ubuntu/maverick/foo', 'ubuntu:maverick/foo',
590
 
                       series='maverick')
591
 
 
592
 
    def test_ubuntu_m_distroseries_expansion(self):
593
 
        self.assertURL('ubuntu/maverick/foo', 'ubuntu:m/foo', series='maverick')
594
 
 
595
 
    def test_ubuntu_lucid_distroseries_expansion(self):
596
 
        self.assertURL('ubuntu/lucid/foo', 'ubuntu:lucid/foo', series='lucid')
597
 
 
598
 
    def test_ubuntu_l_distroseries_expansion(self):
599
 
        self.assertURL('ubuntu/lucid/foo', 'ubuntu:l/foo', series='lucid')
600
 
 
601
 
    def test_ubuntu_karmic_distroseries_expansion(self):
602
 
        self.assertURL('ubuntu/karmic/foo', 'ubuntu:karmic/foo',
603
 
                       series='karmic')
604
 
 
605
 
    def test_ubuntu_k_distroseries_expansion(self):
606
 
        self.assertURL('ubuntu/karmic/foo', 'ubuntu:k/foo', series='karmic')
607
 
 
608
 
    def test_ubuntu_jaunty_distroseries_expansion(self):
609
 
        self.assertURL('ubuntu/jaunty/foo', 'ubuntu:jaunty/foo',
610
 
                       series='jaunty')
611
 
 
612
 
    def test_ubuntu_j_distroseries_expansion(self):
613
 
        self.assertURL('ubuntu/jaunty/foo', 'ubuntu:j/foo', series='jaunty')
614
 
 
615
 
    def test_ubuntu_hardy_distroseries_expansion(self):
616
 
        self.assertURL('ubuntu/hardy/foo', 'ubuntu:hardy/foo', series='hardy')
617
 
 
618
 
    def test_ubuntu_h_distroseries_expansion(self):
619
 
        self.assertURL('ubuntu/hardy/foo', 'ubuntu:h/foo', series='hardy')
620
 
 
621
 
    def test_ubuntu_dapper_distroseries_expansion(self):
622
 
        self.assertURL('ubuntu/dapper/foo', 'ubuntu:dapper/foo',
623
 
                       series='dapper')
624
 
 
625
 
    def test_ubuntu_d_distroseries_expansion(self):
626
 
        self.assertURL('ubuntu/dapper/foo', 'ubuntu:d/foo', series='dapper')
627
 
 
628
 
    # Debian default distro series.
629
 
 
630
 
    def test_debian_default_distroseries_expansion(self):
631
 
        self.assertURL('debian/foo', 'debianlp:foo', distro='debian')
632
 
 
633
 
    def test_debian_squeeze_distroseries_expansion(self):
634
 
        self.assertURL('debian/squeeze/foo', 'debianlp:squeeze/foo',
635
 
                       distro='debian', series='squeeze')
636
 
 
637
 
    def test_debian_lenny_distroseries_expansion(self):
638
 
        self.assertURL('debian/lenny/foo', 'debianlp:lenny/foo',
639
 
                       distro='debian', series='lenny')