~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_http.py

  • Committer: Robert Collins
  • Date: 2006-09-15 02:03:15 UTC
  • mto: (2017.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 2018.
  • Revision ID: robertc@robertcollins.net-20060915020315-9a4b022a6db42940
Update to bzr.dev, which involves adding lock_tree_write to MutableTree and MemoryTree.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006 Canonical
 
2
#
 
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.
 
7
#
 
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.
 
12
#
 
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
 
16
 
 
17
# FIXME: This test should be repeated for each available http client
 
18
# implementation; at the moment we have urllib and pycurl.
 
19
 
 
20
# TODO: Should be renamed to bzrlib.transport.http.tests?
 
21
 
 
22
import socket
 
23
 
 
24
import bzrlib
 
25
from bzrlib.errors import DependencyNotPresent
 
26
from bzrlib.tests import TestCase, TestSkipped
 
27
from bzrlib.transport import Transport
 
28
from bzrlib.transport.http import extract_auth, HttpTransportBase
 
29
from bzrlib.transport.http._urllib import HttpTransport_urllib
 
30
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
 
31
 
 
32
 
 
33
class FakeManager (object):
 
34
 
 
35
    def __init__(self):
 
36
        self.credentials = []
 
37
        
 
38
    def add_password(self, realm, host, username, password):
 
39
        self.credentials.append([realm, host, username, password])
 
40
 
 
41
 
 
42
class TestHttpUrls(TestCase):
 
43
 
 
44
    def test_url_parsing(self):
 
45
        f = FakeManager()
 
46
        url = extract_auth('http://example.com', f)
 
47
        self.assertEquals('http://example.com', url)
 
48
        self.assertEquals(0, len(f.credentials))
 
49
        url = extract_auth('http://user:pass@www.bazaar-vcs.org/bzr/bzr.dev', f)
 
50
        self.assertEquals('http://www.bazaar-vcs.org/bzr/bzr.dev', url)
 
51
        self.assertEquals(1, len(f.credentials))
 
52
        self.assertEquals([None, 'www.bazaar-vcs.org', 'user', 'pass'], f.credentials[0])
 
53
        
 
54
    def test_abs_url(self):
 
55
        """Construction of absolute http URLs"""
 
56
        t = HttpTransport_urllib('http://bazaar-vcs.org/bzr/bzr.dev/')
 
57
        eq = self.assertEqualDiff
 
58
        eq(t.abspath('.'),
 
59
           'http://bazaar-vcs.org/bzr/bzr.dev')
 
60
        eq(t.abspath('foo/bar'), 
 
61
           'http://bazaar-vcs.org/bzr/bzr.dev/foo/bar')
 
62
        eq(t.abspath('.bzr'),
 
63
           'http://bazaar-vcs.org/bzr/bzr.dev/.bzr')
 
64
        eq(t.abspath('.bzr/1//2/./3'),
 
65
           'http://bazaar-vcs.org/bzr/bzr.dev/.bzr/1/2/3')
 
66
 
 
67
    def test_invalid_http_urls(self):
 
68
        """Trap invalid construction of urls"""
 
69
        t = HttpTransport_urllib('http://bazaar-vcs.org/bzr/bzr.dev/')
 
70
        self.assertRaises(ValueError,
 
71
            t.abspath,
 
72
            '.bzr/')
 
73
        self.assertRaises(ValueError,
 
74
            t.abspath,
 
75
            '/.bzr')
 
76
 
 
77
    def test_http_root_urls(self):
 
78
        """Construction of URLs from server root"""
 
79
        t = HttpTransport_urllib('http://bzr.ozlabs.org/')
 
80
        eq = self.assertEqualDiff
 
81
        eq(t.abspath('.bzr/tree-version'),
 
82
           'http://bzr.ozlabs.org/.bzr/tree-version')
 
83
 
 
84
    def test_http_impl_urls(self):
 
85
        """There are servers which ask for particular clients to connect"""
 
86
        try:
 
87
            from bzrlib.transport.http._pycurl import HttpServer_PyCurl
 
88
            server = HttpServer_PyCurl()
 
89
            try:
 
90
                server.setUp()
 
91
                url = server.get_url()
 
92
                self.assertTrue(url.startswith('http+pycurl://'))
 
93
            finally:
 
94
                server.tearDown()
 
95
        except DependencyNotPresent:
 
96
            raise TestSkipped('pycurl not present')
 
97
 
 
98
 
 
99
class TestHttpMixins(object):
 
100
 
 
101
    def _prep_tree(self):
 
102
        self.build_tree(['xxx', 'foo/', 'foo/bar'], line_endings='binary',
 
103
                        transport=self.get_transport())
 
104
 
 
105
    def test_http_has(self):
 
106
        server = self.get_readonly_server()
 
107
        t = self._transport(server.get_url())
 
108
        self.assertEqual(t.has('foo/bar'), True)
 
109
        self.assertEqual(len(server.logs), 1)
 
110
        self.assertContainsRe(server.logs[0], 
 
111
            r'"HEAD /foo/bar HTTP/1.." (200|302) - "-" "bzr/')
 
112
 
 
113
    def test_http_has_not_found(self):
 
114
        server = self.get_readonly_server()
 
115
        t = self._transport(server.get_url())
 
116
        self.assertEqual(t.has('not-found'), False)
 
117
        self.assertContainsRe(server.logs[1], 
 
118
            r'"HEAD /not-found HTTP/1.." 404 - "-" "bzr/')
 
119
 
 
120
    def test_http_get(self):
 
121
        server = self.get_readonly_server()
 
122
        t = self._transport(server.get_url())
 
123
        fp = t.get('foo/bar')
 
124
        self.assertEqualDiff(
 
125
            fp.read(),
 
126
            'contents of foo/bar\n')
 
127
        self.assertEqual(len(server.logs), 1)
 
128
        self.assertTrue(server.logs[0].find(
 
129
            '"GET /foo/bar HTTP/1.1" 200 - "-" "bzr/%s' % bzrlib.__version__) > -1)
 
130
 
 
131
 
 
132
class TestHttpConnections_urllib(TestCaseWithWebserver, TestHttpMixins):
 
133
 
 
134
    _transport = HttpTransport_urllib
 
135
 
 
136
    def setUp(self):
 
137
        TestCaseWithWebserver.setUp(self)
 
138
        self._prep_tree()
 
139
 
 
140
    def test_has_on_bogus_host(self):
 
141
        import urllib2
 
142
        # Get a random address, so that we can be sure there is no
 
143
        # http handler there.
 
144
        s = socket.socket()
 
145
        s.bind(('localhost', 0))
 
146
        t = self._transport('http://%s:%s/' % s.getsockname())
 
147
        self.assertRaises(urllib2.URLError, t.has, 'foo/bar')
 
148
 
 
149
 
 
150
class TestHttpConnections_pycurl(TestCaseWithWebserver, TestHttpMixins):
 
151
 
 
152
    def _get_pycurl_maybe(self):
 
153
        try:
 
154
            from bzrlib.transport.http._pycurl import PyCurlTransport
 
155
            return PyCurlTransport
 
156
        except DependencyNotPresent:
 
157
            raise TestSkipped('pycurl not present')
 
158
 
 
159
    _transport = property(_get_pycurl_maybe)
 
160
 
 
161
    def setUp(self):
 
162
        TestCaseWithWebserver.setUp(self)
 
163
        self._prep_tree()
 
164
 
 
165
 
 
166
 
 
167
class TestHttpTransportRegistration(TestCase):
 
168
    """Test registrations of various http implementations"""
 
169
 
 
170
    def test_http_registered(self):
 
171
        import bzrlib.transport.http._urllib
 
172
        from bzrlib.transport import get_transport
 
173
        # urlllib should always be present
 
174
        t = get_transport('http+urllib://bzr.google.com/')
 
175
        self.assertIsInstance(t, Transport)
 
176
        self.assertIsInstance(t, bzrlib.transport.http._urllib.HttpTransport_urllib)
 
177
 
 
178
 
 
179
class TestOffsets(TestCase):
 
180
    """Test offsets_to_ranges method"""
 
181
 
 
182
    def test_offsets_to_ranges_simple(self):
 
183
        to_range = HttpTransportBase.offsets_to_ranges
 
184
        ranges = to_range([(10, 1)])
 
185
        self.assertEqual([[10, 10]], ranges)
 
186
 
 
187
        ranges = to_range([(0, 1), (1, 1)])
 
188
        self.assertEqual([[0, 1]], ranges)
 
189
 
 
190
        ranges = to_range([(1, 1), (0, 1)])
 
191
        self.assertEqual([[0, 1]], ranges)
 
192
 
 
193
    def test_offset_to_ranges_overlapped(self):
 
194
        to_range = HttpTransportBase.offsets_to_ranges
 
195
 
 
196
        ranges = to_range([(10, 1), (20, 2), (22, 5)])
 
197
        self.assertEqual([[10, 10], [20, 26]], ranges)
 
198
 
 
199
        ranges = to_range([(10, 1), (11, 2), (22, 5)])
 
200
        self.assertEqual([[10, 12], [22, 26]], ranges)
 
201
 
 
202
 
 
203
class TestRangeHeader(TestCase):
 
204
    """Test range_header method"""
 
205
 
 
206
    def check_header(self, value, ranges=[], tail=0):
 
207
        range_header = HttpTransportBase.range_header
 
208
        self.assertEqual(value, range_header(ranges, tail))
 
209
 
 
210
    def test_range_header_single(self):
 
211
        self.check_header('0-9', ranges=[[0,9]])
 
212
        self.check_header('100-109', ranges=[[100,109]])
 
213
 
 
214
    def test_range_header_tail(self):
 
215
        self.check_header('-10', tail=10)
 
216
        self.check_header('-50', tail=50)
 
217
 
 
218
    def test_range_header_multi(self):
 
219
        self.check_header('0-9,100-200,300-5000',
 
220
                          ranges=[(0,9), (100, 200), (300,5000)])
 
221
 
 
222
    def test_range_header_mixed(self):
 
223
        self.check_header('0-9,300-5000,-50',
 
224
                          ranges=[(0,9), (300,5000)],
 
225
                          tail=50)