73
73
self.backend_connected.callback(None)
76
class TestSmartHTTPRefsResource(TestCase):
78
run_tests_with = AsynchronousDeferredRunTest.make_factory(timeout=1)
81
super(TestSmartHTTPRefsResource, self).setUp()
82
self.root = FakeRoot()
83
self.request = LessDummyRequest([''])
76
class ErrorTestMixin(object):
85
78
@defer.inlineCallbacks
86
79
def performRequest(self, backend_response=None,
95
88
self.request.addArg(b'service', service)
96
89
self.request.content = StringIO(b'boo')
97
rendered = render_resource(
98
http.SmartHTTPRefsResource(self.root, b'/foo'), self.request)
90
rendered = render_resource(self.makeResource(service), self.request)
99
91
if backend_response is not None:
100
92
yield self.root.backend_connected
101
93
self.assertIsNot(None, self.root.backend_transport)
107
99
defer.returnValue(self.request)
109
101
@defer.inlineCallbacks
110
def test_dumb_client_rejected(self):
111
yield self.performRequest(service=None)
112
self.assertEqual(404, self.request.responseCode)
114
"Only git smart HTTP clients are supported.", self.request.value)
116
@defer.inlineCallbacks
117
def test_unsupported_service(self):
118
yield self.performRequest(service=b'foo')
119
self.assertEqual(403, self.request.responseCode)
120
self.assertEqual("Unsupported service.", self.request.value)
122
@defer.inlineCallbacks
123
102
def test_backend_immediately_dies(self):
124
103
# If the backend disappears before it says anything, that's an
125
104
# internal server error.
143
122
self.assertEqual(500, self.request.responseCode)
144
123
self.assertEqual('yay', self.request.value)
126
class TestSmartHTTPRefsResource(ErrorTestMixin, TestCase):
128
run_tests_with = AsynchronousDeferredRunTest.make_factory(timeout=1)
130
request_method = 'GET'
133
super(TestSmartHTTPRefsResource, self).setUp()
134
self.root = FakeRoot()
135
self.request = LessDummyRequest([''])
136
self.request.method = b'GET'
138
def makeResource(self, service):
139
return http.SmartHTTPRefsResource(self.root, b'/foo')
141
@defer.inlineCallbacks
142
def test_dumb_client_rejected(self):
143
yield self.performRequest(service=None)
144
self.assertEqual(404, self.request.responseCode)
146
"Only git smart HTTP clients are supported.", self.request.value)
148
@defer.inlineCallbacks
149
def test_unsupported_service(self):
150
yield self.performRequest(service=b'foo')
151
#self.assertEqual(403, self.request.responseCode)
152
self.assertEqual("Unsupported service.", self.request.value)
146
154
@defer.inlineCallbacks
147
155
def test_backend_error(self):
148
# An unknown error is treated a crash, since the user input for
149
# an info/refs request is limited to the path.
156
# Unlike a command request, an unknown error is treated as a
157
# crash here, since the user input for a refs request is limited
150
159
yield self.performRequest(
151
160
helpers.encode_packet(b'ERR so borked'))
152
161
self.assertEqual(500, self.request.responseCode)
163
172
'0000001bI am git protocol data.'
164
173
'And I am raw, since we got a good packet to start with.',
165
174
self.request.value)
177
class TestSmartHTTPCommandResource(ErrorTestMixin, TestCase):
179
run_tests_with = AsynchronousDeferredRunTest.make_factory(timeout=1)
182
super(TestSmartHTTPCommandResource, self).setUp()
183
self.root = FakeRoot()
184
self.request = LessDummyRequest([''])
185
self.request.method = b'POST'
186
self.request.requestHeaders.addRawHeader(
187
b'Content-Type', b'application/x-git-upload-pack-request')
189
def makeResource(self, service):
190
return http.SmartHTTPCommandResource(self.root, service, b'/foo')
192
@defer.inlineCallbacks
193
def test_backend_error(self):
194
# Unlike a refs request, an unknown error is treated as user
195
# error here, since the request body could be bad.
196
yield self.performRequest(
197
helpers.encode_packet(b'ERR so borked'))
198
self.assertEqual(200, self.request.responseCode)
199
self.assertEqual('0011ERR so borked', self.request.value)
201
@defer.inlineCallbacks
203
yield self.performRequest(
204
helpers.encode_packet(b'I am git protocol data.') +
205
b'And I am raw, since we got a good packet to start with.')
206
self.assertEqual(200, self.request.responseCode)
208
'001bI am git protocol data.'
209
'And I am raw, since we got a good packet to start with.',