~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_http.py

  • Committer: Andrew Bennetts
  • Date: 2010-01-15 03:58:20 UTC
  • mfrom: (4963 +trunk)
  • mto: (4973.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4975.
  • Revision ID: andrew.bennetts@canonical.com-20100115035820-ilb3t36swgzq6v1l
MergeĀ lp:bzr.

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,
51
52
    http_server,
52
53
    http_utils,
53
54
    )
61
62
    )
62
63
 
63
64
 
64
 
try:
 
65
if features.pycurl.available():
65
66
    from bzrlib.transport.http._pycurl import PyCurlTransport
66
 
    pycurl_present = True
67
 
except errors.DependencyNotPresent:
68
 
    pycurl_present = False
69
67
 
70
68
 
71
69
def load_tests(standard_tests, module, loader):
84
82
                        _server=http_server.HttpServer_urllib,
85
83
                        _qualified_prefix='http+urllib',)),
86
84
        ]
87
 
    if pycurl_present:
 
85
    if features.pycurl.available():
88
86
        transport_scenarios.append(
89
87
            ('pycurl', dict(_transport=PyCurlTransport,
90
88
                            _server=http_server.HttpServer_PyCurl,
156
154
        activity_scenarios.append(
157
155
            ('urllib,https', dict(_activity_server=ActivityHTTPSServer,
158
156
                                  _transport=_urllib.HttpTransport_urllib,)),)
159
 
    if pycurl_present:
 
157
    if features.pycurl.available():
160
158
        activity_scenarios.append(
161
159
            ('pycurl,http', dict(_activity_server=ActivityHTTPServer,
162
160
                                 _transport=PyCurlTransport,)),)
220
218
    def get_url(self):
221
219
        return '%s://%s:%s/' % (self.scheme, self.host, self.port)
222
220
 
223
 
    def setUp(self):
 
221
    def start_server(self):
224
222
        self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
225
223
        self._sock.bind(('127.0.0.1', 0))
226
224
        self.host, self.port = self._sock.getsockname()
249
247
            # The client may have already closed the socket.
250
248
            pass
251
249
 
252
 
    def tearDown(self):
 
250
    def stop_server(self):
253
251
        try:
254
252
            self._sock.close()
255
253
        except socket.error:
308
306
 
309
307
        server = http_server.HttpServer(BogusRequestHandler)
310
308
        try:
311
 
            self.assertRaises(httplib.UnknownProtocol, server.setUp)
 
309
            self.assertRaises(httplib.UnknownProtocol, server.start_server)
312
310
        except:
313
 
            server.tearDown()
 
311
            server.stop_server()
314
312
            self.fail('HTTP Server creation did not raise UnknownProtocol')
315
313
 
316
314
    def test_force_invalid_protocol(self):
317
315
        server = http_server.HttpServer(protocol_version='HTTP/0.1')
318
316
        try:
319
 
            self.assertRaises(httplib.UnknownProtocol, server.setUp)
 
317
            self.assertRaises(httplib.UnknownProtocol, server.start_server)
320
318
        except:
321
 
            server.tearDown()
 
319
            server.stop_server()
322
320
            self.fail('HTTP Server creation did not raise UnknownProtocol')
323
321
 
324
322
    def test_server_start_and_stop(self):
325
323
        server = http_server.HttpServer()
326
 
        server.setUp()
 
324
        server.start_server()
327
325
        try:
328
326
            self.assertTrue(server._http_running)
329
327
        finally:
330
 
            server.tearDown()
 
328
            server.stop_server()
331
329
        self.assertFalse(server._http_running)
332
330
 
333
331
    def test_create_http_server_one_zero(self):
376
374
    """Test case to inherit from if pycurl is present"""
377
375
 
378
376
    def _get_pycurl_maybe(self):
379
 
        try:
380
 
            from bzrlib.transport.http._pycurl import PyCurlTransport
381
 
            return PyCurlTransport
382
 
        except errors.DependencyNotPresent:
383
 
            raise tests.TestSkipped('pycurl not present')
 
377
        self.requireFeature(features.pycurl)
 
378
        return PyCurlTransport
384
379
 
385
380
    _transport = property(_get_pycurl_maybe)
386
381
 
433
428
    def test_http_impl_urls(self):
434
429
        """There are servers which ask for particular clients to connect"""
435
430
        server = self._server()
436
 
        server.setUp()
 
431
        server.start_server()
437
432
        try:
438
433
            url = server.get_url()
439
434
            self.assertTrue(url.startswith('%s://' % self._qualified_prefix))
440
435
        finally:
441
 
            server.tearDown()
 
436
            server.stop_server()
442
437
 
443
438
 
444
439
class TestHttps_pycurl(TestWithTransport_pycurl, tests.TestCase):
453
448
        https by supplying a fake version_info that do not
454
449
        support it.
455
450
        """
456
 
        try:
457
 
            import pycurl
458
 
        except ImportError:
459
 
            raise tests.TestSkipped('pycurl not present')
 
451
        self.requireFeature(features.pycurl)
 
452
        # Import the module locally now that we now it's available.
 
453
        pycurl = features.pycurl.module
460
454
 
461
455
        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
 
456
        def restore():
483
457
            pycurl.version_info = version_info_orig
 
458
        self.addCleanup(restore)
 
459
 
 
460
        # Fake the pycurl version_info This was taken from a windows pycurl
 
461
        # without SSL (thanks to bialix)
 
462
        pycurl.version_info = lambda : (2,
 
463
                                        '7.13.2',
 
464
                                        462082,
 
465
                                        'i386-pc-win32',
 
466
                                        2576,
 
467
                                        None,
 
468
                                        0,
 
469
                                        None,
 
470
                                        ('ftp', 'gopher', 'telnet',
 
471
                                         'dict', 'ldap', 'http', 'file'),
 
472
                                        None,
 
473
                                        0,
 
474
                                        None)
 
475
        self.assertRaises(errors.DependencyNotPresent, self._transport,
 
476
                          'https://launchpad.net')
484
477
 
485
478
 
486
479
class TestHTTPConnections(http_utils.TestCaseWithWebserver):
603
596
                                      protocol_version=self._protocol_version)
604
597
 
605
598
    def _testing_pycurl(self):
606
 
        return pycurl_present and self._transport == PyCurlTransport
 
599
        # TODO: This is duplicated for lots of the classes in this file
 
600
        return (features.pycurl.available()
 
601
                and self._transport == PyCurlTransport)
607
602
 
608
603
 
609
604
class WallRequestHandler(http_server.TestingHTTPRequestHandler):
718
713
    _req_handler_class = BadProtocolRequestHandler
719
714
 
720
715
    def setUp(self):
721
 
        if pycurl_present and self._transport == PyCurlTransport:
 
716
        if self._testing_pycurl():
722
717
            raise tests.TestNotApplicable(
723
718
                "pycurl doesn't check the protocol version")
724
719
        super(TestBadProtocolServer, self).setUp()
768
763
        self.assertEqual(None, server.host)
769
764
        self.assertEqual(None, server.port)
770
765
 
771
 
    def test_setUp_and_tearDown(self):
 
766
    def test_setUp_and_stop(self):
772
767
        server = RecordingServer(expect_body_tail=None)
773
 
        server.setUp()
 
768
        server.start_server()
774
769
        try:
775
770
            self.assertNotEqual(None, server.host)
776
771
            self.assertNotEqual(None, server.port)
777
772
        finally:
778
 
            server.tearDown()
 
773
            server.stop_server()
779
774
        self.assertEqual(None, server.host)
780
775
        self.assertEqual(None, server.port)
781
776
 
1187
1182
        self._old_env = {}
1188
1183
 
1189
1184
    def _testing_pycurl(self):
1190
 
        return pycurl_present and self._transport == PyCurlTransport
 
1185
        # TODO: This is duplicated for lots of the classes in this file
 
1186
        return (features.pycurl.available()
 
1187
                and self._transport == PyCurlTransport)
1191
1188
 
1192
1189
    def create_transport_secondary_server(self):
1193
1190
        """Creates an http server that will serve files with
1389
1386
    """
1390
1387
 
1391
1388
    def setUp(self):
1392
 
        if pycurl_present and self._transport == PyCurlTransport:
 
1389
        if (features.pycurl.available()
 
1390
            and self._transport == PyCurlTransport):
1393
1391
            raise tests.TestNotApplicable(
1394
1392
                "pycurl doesn't redirect silently annymore")
1395
1393
        super(TestHTTPSilentRedirections, self).setUp()
1507
1505
        return self._auth_server(protocol_version=self._protocol_version)
1508
1506
 
1509
1507
    def _testing_pycurl(self):
1510
 
        return pycurl_present and self._transport == PyCurlTransport
 
1508
        # TODO: This is duplicated for lots of the classes in this file
 
1509
        return (features.pycurl.available()
 
1510
                and self._transport == PyCurlTransport)
1511
1511
 
1512
1512
    def get_user_url(self, user, password):
1513
1513
        """Build an url embedding user and password"""
1964
1964
    def setUp(self):
1965
1965
        tests.TestCase.setUp(self)
1966
1966
        self.server = self._activity_server(self._protocol_version)
1967
 
        self.server.setUp()
 
1967
        self.server.start_server()
1968
1968
        self.activities = {}
1969
1969
        def report_activity(t, bytes, direction):
1970
1970
            count = self.activities.get(direction, 0)
1979
1979
 
1980
1980
    def tearDown(self):
1981
1981
        self._transport._report_activity = self.orig_report_activity
1982
 
        self.server.tearDown()
 
1982
        self.server.stop_server()
1983
1983
        tests.TestCase.tearDown(self)
1984
1984
 
1985
1985
    def get_transport(self):
2105
2105
    def setUp(self):
2106
2106
        tests.TestCase.setUp(self)
2107
2107
        self.server = self._activity_server(self._protocol_version)
2108
 
        self.server.setUp()
 
2108
        self.server.start_server()
2109
2109
        self.activities = {}
2110
2110
        def report_activity(t, bytes, direction):
2111
2111
            count = self.activities.get(direction, 0)
2120
2120
 
2121
2121
    def tearDown(self):
2122
2122
        self._transport._report_activity = self.orig_report_activity
2123
 
        self.server.tearDown()
 
2123
        self.server.stop_server()
2124
2124
        tests.TestCase.tearDown(self)
2125
2125
 
2126
2126
 
2136
2136
        self.server = ActivityHTTPServer('HTTP/1.1')
2137
2137
        self._transport=_urllib.HttpTransport_urllib
2138
2138
 
2139
 
        self.server.setUp()
 
2139
        self.server.start_server()
2140
2140
 
2141
2141
        # We override at class level because constructors may propagate the
2142
2142
        # bound method and render instance overriding ineffective (an
2146
2146
 
2147
2147
    def tearDown(self):
2148
2148
        self._transport._report_activity = self.orig_report_activity
2149
 
        self.server.tearDown()
 
2149
        self.server.stop_server()
2150
2150
        tests.TestCase.tearDown(self)
2151
2151
 
2152
2152
    def assertActivitiesMatch(self):