~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_http.py

Add a NEWS entry and prepare submission.

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
    deprecated_in,
49
49
    )
50
50
from bzrlib.tests import (
51
 
    features,
52
51
    http_server,
53
52
    http_utils,
54
53
    )
62
61
    )
63
62
 
64
63
 
65
 
if features.pycurl.available():
 
64
try:
66
65
    from bzrlib.transport.http._pycurl import PyCurlTransport
 
66
    pycurl_present = True
 
67
except errors.DependencyNotPresent:
 
68
    pycurl_present = False
67
69
 
68
70
 
69
71
def load_tests(standard_tests, module, loader):
82
84
                        _server=http_server.HttpServer_urllib,
83
85
                        _qualified_prefix='http+urllib',)),
84
86
        ]
85
 
    if features.pycurl.available():
 
87
    if pycurl_present:
86
88
        transport_scenarios.append(
87
89
            ('pycurl', dict(_transport=PyCurlTransport,
88
90
                            _server=http_server.HttpServer_PyCurl,
154
156
        activity_scenarios.append(
155
157
            ('urllib,https', dict(_activity_server=ActivityHTTPSServer,
156
158
                                  _transport=_urllib.HttpTransport_urllib,)),)
157
 
    if features.pycurl.available():
 
159
    if pycurl_present:
158
160
        activity_scenarios.append(
159
161
            ('pycurl,http', dict(_activity_server=ActivityHTTPServer,
160
162
                                 _transport=PyCurlTransport,)),)
218
220
    def get_url(self):
219
221
        return '%s://%s:%s/' % (self.scheme, self.host, self.port)
220
222
 
221
 
    def start_server(self):
 
223
    def setUp(self):
222
224
        self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
223
225
        self._sock.bind(('127.0.0.1', 0))
224
226
        self.host, self.port = self._sock.getsockname()
247
249
            # The client may have already closed the socket.
248
250
            pass
249
251
 
250
 
    def stop_server(self):
 
252
    def tearDown(self):
251
253
        try:
252
254
            self._sock.close()
253
255
        except socket.error:
306
308
 
307
309
        server = http_server.HttpServer(BogusRequestHandler)
308
310
        try:
309
 
            self.assertRaises(httplib.UnknownProtocol, server.start_server)
 
311
            self.assertRaises(httplib.UnknownProtocol, server.setUp)
310
312
        except:
311
 
            server.stop_server()
 
313
            server.tearDown()
312
314
            self.fail('HTTP Server creation did not raise UnknownProtocol')
313
315
 
314
316
    def test_force_invalid_protocol(self):
315
317
        server = http_server.HttpServer(protocol_version='HTTP/0.1')
316
318
        try:
317
 
            self.assertRaises(httplib.UnknownProtocol, server.start_server)
 
319
            self.assertRaises(httplib.UnknownProtocol, server.setUp)
318
320
        except:
319
 
            server.stop_server()
 
321
            server.tearDown()
320
322
            self.fail('HTTP Server creation did not raise UnknownProtocol')
321
323
 
322
324
    def test_server_start_and_stop(self):
323
325
        server = http_server.HttpServer()
324
 
        server.start_server()
 
326
        server.setUp()
325
327
        try:
326
328
            self.assertTrue(server._http_running)
327
329
        finally:
328
 
            server.stop_server()
 
330
            server.tearDown()
329
331
        self.assertFalse(server._http_running)
330
332
 
331
333
    def test_create_http_server_one_zero(self):
374
376
    """Test case to inherit from if pycurl is present"""
375
377
 
376
378
    def _get_pycurl_maybe(self):
377
 
        self.requireFeature(features.pycurl)
378
 
        return PyCurlTransport
 
379
        try:
 
380
            from bzrlib.transport.http._pycurl import PyCurlTransport
 
381
            return PyCurlTransport
 
382
        except errors.DependencyNotPresent:
 
383
            raise tests.TestSkipped('pycurl not present')
379
384
 
380
385
    _transport = property(_get_pycurl_maybe)
381
386
 
391
396
        self.assertEqual('http://example.com', url)
392
397
        self.assertEqual(0, len(f.credentials))
393
398
        url = http.extract_auth(
394
 
            'http://user:pass@example.com/bzr/bzr.dev', f)
395
 
        self.assertEqual('http://example.com/bzr/bzr.dev', url)
 
399
            'http://user:pass@www.bazaar-vcs.org/bzr/bzr.dev', f)
 
400
        self.assertEqual('http://www.bazaar-vcs.org/bzr/bzr.dev', url)
396
401
        self.assertEqual(1, len(f.credentials))
397
 
        self.assertEqual([None, 'example.com', 'user', 'pass'],
 
402
        self.assertEqual([None, 'www.bazaar-vcs.org', 'user', 'pass'],
398
403
                         f.credentials[0])
399
404
 
400
405
 
428
433
    def test_http_impl_urls(self):
429
434
        """There are servers which ask for particular clients to connect"""
430
435
        server = self._server()
431
 
        server.start_server()
 
436
        server.setUp()
432
437
        try:
433
438
            url = server.get_url()
434
439
            self.assertTrue(url.startswith('%s://' % self._qualified_prefix))
435
440
        finally:
436
 
            server.stop_server()
 
441
            server.tearDown()
437
442
 
438
443
 
439
444
class TestHttps_pycurl(TestWithTransport_pycurl, tests.TestCase):
448
453
        https by supplying a fake version_info that do not
449
454
        support it.
450
455
        """
451
 
        self.requireFeature(features.pycurl)
452
 
        # Import the module locally now that we now it's available.
453
 
        pycurl = features.pycurl.module
 
456
        try:
 
457
            import pycurl
 
458
        except ImportError:
 
459
            raise tests.TestSkipped('pycurl not present')
454
460
 
455
 
        self.overrideAttr(pycurl, 'version_info',
456
 
                          # Fake the pycurl version_info This was taken from
457
 
                          # a windows pycurl without SSL (thanks to bialix)
458
 
                          lambda : (2,
459
 
                                    '7.13.2',
460
 
                                    462082,
461
 
                                    'i386-pc-win32',
462
 
                                    2576,
463
 
                                    None,
464
 
                                    0,
465
 
                                    None,
466
 
                                    ('ftp', 'gopher', 'telnet',
467
 
                                     'dict', 'ldap', 'http', 'file'),
468
 
                                    None,
469
 
                                    0,
470
 
                                    None))
471
 
        self.assertRaises(errors.DependencyNotPresent, self._transport,
472
 
                          'https://launchpad.net')
 
461
        version_info_orig = pycurl.version_info
 
462
        try:
 
463
            # Now that we have pycurl imported, we can fake its version_info
 
464
            # This was taken from a windows pycurl without SSL
 
465
            # (thanks to bialix)
 
466
            pycurl.version_info = lambda : (2,
 
467
                                            '7.13.2',
 
468
                                            462082,
 
469
                                            'i386-pc-win32',
 
470
                                            2576,
 
471
                                            None,
 
472
                                            0,
 
473
                                            None,
 
474
                                            ('ftp', 'gopher', 'telnet',
 
475
                                             'dict', 'ldap', 'http', 'file'),
 
476
                                            None,
 
477
                                            0,
 
478
                                            None)
 
479
            self.assertRaises(errors.DependencyNotPresent, self._transport,
 
480
                              'https://launchpad.net')
 
481
        finally:
 
482
            # Restore the right function
 
483
            pycurl.version_info = version_info_orig
473
484
 
474
485
 
475
486
class TestHTTPConnections(http_utils.TestCaseWithWebserver):
592
603
                                      protocol_version=self._protocol_version)
593
604
 
594
605
    def _testing_pycurl(self):
595
 
        # TODO: This is duplicated for lots of the classes in this file
596
 
        return (features.pycurl.available()
597
 
                and self._transport == PyCurlTransport)
 
606
        return pycurl_present and self._transport == PyCurlTransport
598
607
 
599
608
 
600
609
class WallRequestHandler(http_server.TestingHTTPRequestHandler):
709
718
    _req_handler_class = BadProtocolRequestHandler
710
719
 
711
720
    def setUp(self):
712
 
        if self._testing_pycurl():
 
721
        if pycurl_present and self._transport == PyCurlTransport:
713
722
            raise tests.TestNotApplicable(
714
723
                "pycurl doesn't check the protocol version")
715
724
        super(TestBadProtocolServer, self).setUp()
759
768
        self.assertEqual(None, server.host)
760
769
        self.assertEqual(None, server.port)
761
770
 
762
 
    def test_setUp_and_stop(self):
 
771
    def test_setUp_and_tearDown(self):
763
772
        server = RecordingServer(expect_body_tail=None)
764
 
        server.start_server()
 
773
        server.setUp()
765
774
        try:
766
775
            self.assertNotEqual(None, server.host)
767
776
            self.assertNotEqual(None, server.port)
768
777
        finally:
769
 
            server.stop_server()
 
778
            server.tearDown()
770
779
        self.assertEqual(None, server.host)
771
780
        self.assertEqual(None, server.port)
772
781
 
1178
1187
        self._old_env = {}
1179
1188
 
1180
1189
    def _testing_pycurl(self):
1181
 
        # TODO: This is duplicated for lots of the classes in this file
1182
 
        return (features.pycurl.available()
1183
 
                and self._transport == PyCurlTransport)
 
1190
        return pycurl_present and self._transport == PyCurlTransport
1184
1191
 
1185
1192
    def create_transport_secondary_server(self):
1186
1193
        """Creates an http server that will serve files with
1360
1367
 
1361
1368
 
1362
1369
def install_redirected_request(test):
1363
 
    test.overrideAttr(_urllib2_wrappers, 'Request', RedirectedRequest)
 
1370
    test.original_class = _urllib2_wrappers.Request
 
1371
    def restore():
 
1372
        _urllib2_wrappers.Request = test.original_class
 
1373
    _urllib2_wrappers.Request = RedirectedRequest
 
1374
    test.addCleanup(restore)
1364
1375
 
1365
1376
 
1366
1377
class TestHTTPSilentRedirections(http_utils.TestCaseWithRedirectedWebserver):
1378
1389
    """
1379
1390
 
1380
1391
    def setUp(self):
1381
 
        if (features.pycurl.available()
1382
 
            and self._transport == PyCurlTransport):
 
1392
        if pycurl_present and self._transport == PyCurlTransport:
1383
1393
            raise tests.TestNotApplicable(
1384
1394
                "pycurl doesn't redirect silently annymore")
1385
1395
        super(TestHTTPSilentRedirections, self).setUp()
1497
1507
        return self._auth_server(protocol_version=self._protocol_version)
1498
1508
 
1499
1509
    def _testing_pycurl(self):
1500
 
        # TODO: This is duplicated for lots of the classes in this file
1501
 
        return (features.pycurl.available()
1502
 
                and self._transport == PyCurlTransport)
 
1510
        return pycurl_present and self._transport == PyCurlTransport
1503
1511
 
1504
1512
    def get_user_url(self, user, password):
1505
1513
        """Build an url embedding user and password"""
1956
1964
    def setUp(self):
1957
1965
        tests.TestCase.setUp(self)
1958
1966
        self.server = self._activity_server(self._protocol_version)
1959
 
        self.server.start_server()
 
1967
        self.server.setUp()
1960
1968
        self.activities = {}
1961
1969
        def report_activity(t, bytes, direction):
1962
1970
            count = self.activities.get(direction, 0)
1971
1979
 
1972
1980
    def tearDown(self):
1973
1981
        self._transport._report_activity = self.orig_report_activity
1974
 
        self.server.stop_server()
 
1982
        self.server.tearDown()
1975
1983
        tests.TestCase.tearDown(self)
1976
1984
 
1977
1985
    def get_transport(self):
2097
2105
    def setUp(self):
2098
2106
        tests.TestCase.setUp(self)
2099
2107
        self.server = self._activity_server(self._protocol_version)
2100
 
        self.server.start_server()
 
2108
        self.server.setUp()
2101
2109
        self.activities = {}
2102
2110
        def report_activity(t, bytes, direction):
2103
2111
            count = self.activities.get(direction, 0)
2112
2120
 
2113
2121
    def tearDown(self):
2114
2122
        self._transport._report_activity = self.orig_report_activity
2115
 
        self.server.stop_server()
 
2123
        self.server.tearDown()
2116
2124
        tests.TestCase.tearDown(self)
2117
2125
 
2118
2126
 
2128
2136
        self.server = ActivityHTTPServer('HTTP/1.1')
2129
2137
        self._transport=_urllib.HttpTransport_urllib
2130
2138
 
2131
 
        self.server.start_server()
 
2139
        self.server.setUp()
2132
2140
 
2133
2141
        # We override at class level because constructors may propagate the
2134
2142
        # bound method and render instance overriding ineffective (an
2138
2146
 
2139
2147
    def tearDown(self):
2140
2148
        self._transport._report_activity = self.orig_report_activity
2141
 
        self.server.stop_server()
 
2149
        self.server.tearDown()
2142
2150
        tests.TestCase.tearDown(self)
2143
2151
 
2144
2152
    def assertActivitiesMatch(self):