/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
1
# Copyright (C) 2005, 2006 Canonical
1540.3.24 by Martin Pool
Add new protocol 'http+pycurl' that always uses PyCurl.
2
#
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1540.3.24 by Martin Pool
Add new protocol 'http+pycurl' that always uses PyCurl.
7
#
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1540.3.24 by Martin Pool
Add new protocol 'http+pycurl' that always uses PyCurl.
12
#
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
16
1540.3.3 by Martin Pool
Review updates of pycurl transport
17
# FIXME: This test should be repeated for each available http client
18
# implementation; at the moment we have urllib and pycurl.
19
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
20
# TODO: Should be renamed to bzrlib.transport.http.tests?
21
2000.2.2 by John Arbash Meinel
Update the urllib.has test.
22
import socket
23
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
24
import bzrlib
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
25
from bzrlib.errors import (
26
    DependencyNotPresent,
27
    ConnectionError,
2004.1.16 by v.ladeuil+lp at free
Add tests against erroneous http status lines.
28
    InvalidHttpResponse,
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
29
    )
30
from bzrlib.tests import (
31
    TestCase,
32
    TestSkipped,
33
    )
34
from bzrlib.transport import (
35
    get_transport,
36
    Transport,
37
    )
2004.3.3 by vila
Better (but still incomplete) design for bogus servers.
38
from bzrlib.transport.http import (
39
    extract_auth,
2004.1.16 by v.ladeuil+lp at free
Add tests against erroneous http status lines.
40
    BadStatusRequestHandler,
2004.3.3 by vila
Better (but still incomplete) design for bogus servers.
41
    HttpTransportBase,
2004.1.16 by v.ladeuil+lp at free
Add tests against erroneous http status lines.
42
    InvalidStatusRequestHandler,
2004.3.3 by vila
Better (but still incomplete) design for bogus servers.
43
    WallRequestHandler,
44
    )
1540.3.26 by Martin Pool
[merge] bzr.dev; pycurl not updated for readv yet
45
from bzrlib.transport.http._urllib import HttpTransport_urllib
2004.3.3 by vila
Better (but still incomplete) design for bogus servers.
46
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
1185.40.20 by Robey Pointer
allow user:pass@ info in http urls to be used for auth; this should be easily expandable later to use auth config files
47
1786.1.8 by John Arbash Meinel
[merge] Johan Rydberg test updates
48
1185.40.20 by Robey Pointer
allow user:pass@ info in http urls to be used for auth; this should be easily expandable later to use auth config files
49
class FakeManager (object):
1786.1.8 by John Arbash Meinel
[merge] Johan Rydberg test updates
50
1185.40.20 by Robey Pointer
allow user:pass@ info in http urls to be used for auth; this should be easily expandable later to use auth config files
51
    def __init__(self):
52
        self.credentials = []
2004.3.1 by vila
Test ConnectionError exceptions.
53
1185.40.20 by Robey Pointer
allow user:pass@ info in http urls to be used for auth; this should be easily expandable later to use auth config files
54
    def add_password(self, realm, host, username, password):
55
        self.credentials.append([realm, host, username, password])
56
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
57
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
58
class TestHttpUrls(TestCase):
1786.1.8 by John Arbash Meinel
[merge] Johan Rydberg test updates
59
1185.40.20 by Robey Pointer
allow user:pass@ info in http urls to be used for auth; this should be easily expandable later to use auth config files
60
    def test_url_parsing(self):
61
        f = FakeManager()
62
        url = extract_auth('http://example.com', f)
63
        self.assertEquals('http://example.com', url)
64
        self.assertEquals(0, len(f.credentials))
1185.50.94 by John Arbash Meinel
Updated web page url to http://bazaar-vcs.org
65
        url = extract_auth('http://user:pass@www.bazaar-vcs.org/bzr/bzr.dev', f)
66
        self.assertEquals('http://www.bazaar-vcs.org/bzr/bzr.dev', url)
1185.40.20 by Robey Pointer
allow user:pass@ info in http urls to be used for auth; this should be easily expandable later to use auth config files
67
        self.assertEquals(1, len(f.credentials))
2004.3.1 by vila
Test ConnectionError exceptions.
68
        self.assertEquals([None, 'www.bazaar-vcs.org', 'user', 'pass'],
69
                          f.credentials[0])
70
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
71
    def test_abs_url(self):
72
        """Construction of absolute http URLs"""
1185.50.94 by John Arbash Meinel
Updated web page url to http://bazaar-vcs.org
73
        t = HttpTransport_urllib('http://bazaar-vcs.org/bzr/bzr.dev/')
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
74
        eq = self.assertEqualDiff
75
        eq(t.abspath('.'),
1185.50.94 by John Arbash Meinel
Updated web page url to http://bazaar-vcs.org
76
           'http://bazaar-vcs.org/bzr/bzr.dev')
2004.3.1 by vila
Test ConnectionError exceptions.
77
        eq(t.abspath('foo/bar'),
1185.50.94 by John Arbash Meinel
Updated web page url to http://bazaar-vcs.org
78
           'http://bazaar-vcs.org/bzr/bzr.dev/foo/bar')
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
79
        eq(t.abspath('.bzr'),
1185.50.94 by John Arbash Meinel
Updated web page url to http://bazaar-vcs.org
80
           'http://bazaar-vcs.org/bzr/bzr.dev/.bzr')
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
81
        eq(t.abspath('.bzr/1//2/./3'),
1185.50.94 by John Arbash Meinel
Updated web page url to http://bazaar-vcs.org
82
           'http://bazaar-vcs.org/bzr/bzr.dev/.bzr/1/2/3')
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
83
84
    def test_invalid_http_urls(self):
85
        """Trap invalid construction of urls"""
1185.50.94 by John Arbash Meinel
Updated web page url to http://bazaar-vcs.org
86
        t = HttpTransport_urllib('http://bazaar-vcs.org/bzr/bzr.dev/')
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
87
        self.assertRaises(ValueError,
88
            t.abspath,
89
            '.bzr/')
90
91
    def test_http_root_urls(self):
92
        """Construction of URLs from server root"""
1540.3.26 by Martin Pool
[merge] bzr.dev; pycurl not updated for readv yet
93
        t = HttpTransport_urllib('http://bzr.ozlabs.org/')
1185.16.68 by Martin Pool
- http url fixes suggested by Robey Pointer, and tests
94
        eq = self.assertEqualDiff
95
        eq(t.abspath('.bzr/tree-version'),
96
           'http://bzr.ozlabs.org/.bzr/tree-version')
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
97
1540.3.24 by Martin Pool
Add new protocol 'http+pycurl' that always uses PyCurl.
98
    def test_http_impl_urls(self):
99
        """There are servers which ask for particular clients to connect"""
100
        try:
101
            from bzrlib.transport.http._pycurl import HttpServer_PyCurl
102
            server = HttpServer_PyCurl()
103
            try:
104
                server.setUp()
105
                url = server.get_url()
106
                self.assertTrue(url.startswith('http+pycurl://'))
107
            finally:
108
                server.tearDown()
1540.3.30 by Martin Pool
Fix up bogus-url tests for broken dns servers, and error imports
109
        except DependencyNotPresent:
1540.3.24 by Martin Pool
Add new protocol 'http+pycurl' that always uses PyCurl.
110
            raise TestSkipped('pycurl not present')
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
111
1786.1.8 by John Arbash Meinel
[merge] Johan Rydberg test updates
112
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
113
class TestHttpConnections(object):
114
    """Test the http connections.
115
116
    This MUST be used by daughter classes that also inherit from
117
    TestCaseWithWebserver.
2004.1.16 by v.ladeuil+lp at free
Add tests against erroneous http status lines.
118
119
    We can't inherit directly from TestCaseWithWebserver or the
120
    test framework will try to create an instance which cannot
121
    run, its implementation being incomplete.
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
122
    """
123
124
    def setUp(self):
125
        TestCaseWithWebserver.setUp(self)
1540.3.33 by Martin Pool
Fix http tests that were failing to run tearDown when setup got a missing dependency
126
        self.build_tree(['xxx', 'foo/', 'foo/bar'], line_endings='binary',
127
                        transport=self.get_transport())
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
128
129
    def test_http_has(self):
1185.50.84 by John Arbash Meinel
[merge] bzr.dev, cleanup conflicts, fixup http tests for new TestCase layout.
130
        server = self.get_readonly_server()
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
131
        t = self._transport(server.get_url())
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
132
        self.assertEqual(t.has('foo/bar'), True)
1185.50.84 by John Arbash Meinel
[merge] bzr.dev, cleanup conflicts, fixup http tests for new TestCase layout.
133
        self.assertEqual(len(server.logs), 1)
2004.3.1 by vila
Test ConnectionError exceptions.
134
        self.assertContainsRe(server.logs[0],
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
135
            r'"HEAD /foo/bar HTTP/1.." (200|302) - "-" "bzr/')
1553.1.5 by James Henstridge
Make HTTP transport has() method do HEAD requests, and update test to
136
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
137
    def test_http_has_not_found(self):
138
        server = self.get_readonly_server()
139
        t = self._transport(server.get_url())
1553.1.5 by James Henstridge
Make HTTP transport has() method do HEAD requests, and update test to
140
        self.assertEqual(t.has('not-found'), False)
2004.3.1 by vila
Test ConnectionError exceptions.
141
        self.assertContainsRe(server.logs[1],
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
142
            r'"HEAD /not-found HTTP/1.." 404 - "-" "bzr/')
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
143
144
    def test_http_get(self):
1185.50.84 by John Arbash Meinel
[merge] bzr.dev, cleanup conflicts, fixup http tests for new TestCase layout.
145
        server = self.get_readonly_server()
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
146
        t = self._transport(server.get_url())
1553.1.2 by James Henstridge
Add a test to make sure the user-agent header is being sent correctly.
147
        fp = t.get('foo/bar')
148
        self.assertEqualDiff(
149
            fp.read(),
1553.1.3 by James Henstridge
Make bzrlib.transport.http.HttpServer output referer and user agent as in
150
            'contents of foo/bar\n')
1185.50.84 by John Arbash Meinel
[merge] bzr.dev, cleanup conflicts, fixup http tests for new TestCase layout.
151
        self.assertEqual(len(server.logs), 1)
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
152
        self.assertTrue(server.logs[0].find(
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
153
            '"GET /foo/bar HTTP/1.1" 200 - "-" "bzr/%s'
154
            % bzrlib.__version__) > -1)
1540.3.33 by Martin Pool
Fix http tests that were failing to run tearDown when setup got a missing dependency
155
2000.2.2 by John Arbash Meinel
Update the urllib.has test.
156
    def test_has_on_bogus_host(self):
2004.1.1 by vila
Connection sharing, with redirection. without authentification.
157
        # Get a free address and don't 'accept' on it, so that we
158
        # can be sure there is no http handler there, but set a
159
        # reasonable timeout to not slow down tests too much.
160
        default_timeout = socket.getdefaulttimeout()
161
        try:
162
            socket.setdefaulttimeout(2)
163
            s = socket.socket()
164
            s.bind(('localhost', 0))
165
            t = self._transport('http://%s:%s/' % s.getsockname())
166
            self.assertRaises(ConnectionError, t.has, 'foo/bar')
167
        finally:
168
            socket.setdefaulttimeout(default_timeout)
169
1540.3.33 by Martin Pool
Fix http tests that were failing to run tearDown when setup got a missing dependency
170
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
171
class TestWithTransport_pycurl(object):
172
    """Test case to inherit from if pycurl is present"""
1540.3.33 by Martin Pool
Fix http tests that were failing to run tearDown when setup got a missing dependency
173
    def _get_pycurl_maybe(self):
1540.3.29 by Martin Pool
Prevent selftest failure when pycurl is not installed
174
        try:
175
            from bzrlib.transport.http._pycurl import PyCurlTransport
1612.1.1 by Martin Pool
Raise errors correctly on pycurl connection failure
176
            return PyCurlTransport
1540.3.30 by Martin Pool
Fix up bogus-url tests for broken dns servers, and error imports
177
        except DependencyNotPresent:
1540.3.29 by Martin Pool
Prevent selftest failure when pycurl is not installed
178
            raise TestSkipped('pycurl not present')
1540.3.15 by Martin Pool
[merge] large merge to sync with bzr.dev
179
1540.3.33 by Martin Pool
Fix http tests that were failing to run tearDown when setup got a missing dependency
180
    _transport = property(_get_pycurl_maybe)
181
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
182
183
class TestHttpConnections_urllib(TestHttpConnections, TestCaseWithWebserver):
184
    """Test http connections with urllib"""
185
186
    _transport = HttpTransport_urllib
187
188
189
190
class TestHttpConnections_pycurl(TestWithTransport_pycurl,
191
                                 TestHttpConnections,
192
                                 TestCaseWithWebserver):
193
    """Test http connections with pycurl"""
1540.3.33 by Martin Pool
Fix http tests that were failing to run tearDown when setup got a missing dependency
194
195
1540.3.23 by Martin Pool
Allow urls like http+pycurl://host/ to use a particular impl
196
class TestHttpTransportRegistration(TestCase):
197
    """Test registrations of various http implementations"""
198
199
    def test_http_registered(self):
200
        # urlllib should always be present
201
        t = get_transport('http+urllib://bzr.google.com/')
202
        self.assertIsInstance(t, Transport)
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
203
        self.assertIsInstance(t, HttpTransport_urllib)
1786.1.23 by John Arbash Meinel
Move offset_to_http_ranges back onto HttpTransportBase, clarify tests.
204
205
206
class TestOffsets(TestCase):
1786.1.28 by John Arbash Meinel
Update and add tests for the HttpTransportBase.range_header
207
    """Test offsets_to_ranges method"""
1786.1.23 by John Arbash Meinel
Move offset_to_http_ranges back onto HttpTransportBase, clarify tests.
208
209
    def test_offsets_to_ranges_simple(self):
210
        to_range = HttpTransportBase.offsets_to_ranges
1786.1.39 by John Arbash Meinel
Remove the ability to read negative offsets from readv()
211
        ranges = to_range([(10, 1)])
1786.1.23 by John Arbash Meinel
Move offset_to_http_ranges back onto HttpTransportBase, clarify tests.
212
        self.assertEqual([[10, 10]], ranges)
1786.1.39 by John Arbash Meinel
Remove the ability to read negative offsets from readv()
213
214
        ranges = to_range([(0, 1), (1, 1)])
215
        self.assertEqual([[0, 1]], ranges)
216
217
        ranges = to_range([(1, 1), (0, 1)])
218
        self.assertEqual([[0, 1]], ranges)
1786.1.23 by John Arbash Meinel
Move offset_to_http_ranges back onto HttpTransportBase, clarify tests.
219
220
    def test_offset_to_ranges_overlapped(self):
221
        to_range = HttpTransportBase.offsets_to_ranges
222
1786.1.39 by John Arbash Meinel
Remove the ability to read negative offsets from readv()
223
        ranges = to_range([(10, 1), (20, 2), (22, 5)])
224
        self.assertEqual([[10, 10], [20, 26]], ranges)
225
226
        ranges = to_range([(10, 1), (11, 2), (22, 5)])
227
        self.assertEqual([[10, 12], [22, 26]], ranges)
1786.1.23 by John Arbash Meinel
Move offset_to_http_ranges back onto HttpTransportBase, clarify tests.
228
1786.1.28 by John Arbash Meinel
Update and add tests for the HttpTransportBase.range_header
229
230
class TestRangeHeader(TestCase):
231
    """Test range_header method"""
232
233
    def check_header(self, value, ranges=[], tail=0):
234
        range_header = HttpTransportBase.range_header
235
        self.assertEqual(value, range_header(ranges, tail))
236
237
    def test_range_header_single(self):
1786.1.36 by John Arbash Meinel
pycurl expects us to just set the range of bytes, not including bytes=
238
        self.check_header('0-9', ranges=[[0,9]])
239
        self.check_header('100-109', ranges=[[100,109]])
1786.1.28 by John Arbash Meinel
Update and add tests for the HttpTransportBase.range_header
240
241
    def test_range_header_tail(self):
1786.1.36 by John Arbash Meinel
pycurl expects us to just set the range of bytes, not including bytes=
242
        self.check_header('-10', tail=10)
243
        self.check_header('-50', tail=50)
1786.1.28 by John Arbash Meinel
Update and add tests for the HttpTransportBase.range_header
244
245
    def test_range_header_multi(self):
1786.1.36 by John Arbash Meinel
pycurl expects us to just set the range of bytes, not including bytes=
246
        self.check_header('0-9,100-200,300-5000',
1786.1.28 by John Arbash Meinel
Update and add tests for the HttpTransportBase.range_header
247
                          ranges=[(0,9), (100, 200), (300,5000)])
248
249
    def test_range_header_mixed(self):
1786.1.36 by John Arbash Meinel
pycurl expects us to just set the range of bytes, not including bytes=
250
        self.check_header('0-9,300-5000,-50',
1786.1.28 by John Arbash Meinel
Update and add tests for the HttpTransportBase.range_header
251
                          ranges=[(0,9), (300,5000)],
252
                          tail=50)
2004.3.1 by vila
Test ConnectionError exceptions.
253
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
254
255
class TestWallServer(object):
256
    """Tests exceptions during the connection phase"""
257
258
    def create_transport_server(self):
259
        return bzrlib.transport.http.HttpServer(WallRequestHandler)
260
261
    def test_http_has(self):
2004.3.3 by vila
Better (but still incomplete) design for bogus servers.
262
        server = self.get_server()
2004.3.1 by vila
Test ConnectionError exceptions.
263
        t = self._transport(server.get_url())
264
        self.assertRaises(ConnectionError, t.has, 'foo/bar')
2004.3.3 by vila
Better (but still incomplete) design for bogus servers.
265
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
266
    def test_http_get(self):
2004.3.3 by vila
Better (but still incomplete) design for bogus servers.
267
        server = self.get_server()
268
        t = self._transport(server.get_url())
269
        self.assertRaises(ConnectionError, t.get, 'foo/bar')
270
271
2004.1.15 by v.ladeuil+lp at free
Better design for bogus servers. Both urllib and pycurl pass tests.
272
class TestWallServer_urllib(TestWallServer, TestCaseWithWebserver):
273
    """Tests WallServer for urllib implementation"""
274
275
    _transport = HttpTransport_urllib
276
277
278
class TestWallServer_pycurl(TestWithTransport_pycurl,
279
                            TestWallServer,
280
                            TestCaseWithWebserver):
281
    """Tests WallServer for pycurl implementation"""
282
283
2004.1.16 by v.ladeuil+lp at free
Add tests against erroneous http status lines.
284
class TestBadStatusServer(object):
285
    """Tests bad status from server."""
286
287
    def create_transport_server(self):
288
        return bzrlib.transport.http.HttpServer(BadStatusRequestHandler)
289
290
    def test_http_has(self):
291
        server = self.get_server()
292
        t = self._transport(server.get_url())
293
        self.assertRaises(InvalidHttpResponse, t.has, 'foo/bar')
294
295
    def test_http_get(self):
296
        server = self.get_server()
297
        t = self._transport(server.get_url())
298
        self.assertRaises(InvalidHttpResponse, t.get, 'foo/bar')
299
300
301
class TestBadStatusServer_urllib(TestBadStatusServer, TestCaseWithWebserver):
302
    """Tests BadStatusServer for urllib implementation"""
303
304
    _transport = HttpTransport_urllib
305
306
307
class TestBadStatusServer_pycurl(TestWithTransport_pycurl,
308
                                 TestBadStatusServer,
309
                                 TestCaseWithWebserver):
310
    """Tests BadStatusServer for pycurl implementation"""
311
312
313
class TestInvalidStatusServer(TestBadStatusServer):
314
    """Tests invalid status from server.
315
316
    Both implementations raises the same error as for a bad status.
317
    """
318
319
    def create_transport_server(self):
320
        return bzrlib.transport.http.HttpServer(InvalidStatusRequestHandler)
321
322
323
class TestInvalidStatusServer_urllib(TestInvalidStatusServer,
324
                                     TestCaseWithWebserver):
325
    """Tests InvalidStatusServer for urllib implementation"""
326
327
    _transport = HttpTransport_urllib
328
329
330
class TestInvalidStatusServer_pycurl(TestWithTransport_pycurl,
331
                                     TestInvalidStatusServer,
332
                                     TestCaseWithWebserver):
333
    """Tests InvalidStatusServer for pycurl implementation"""