~cjwatson/turnip/default-branch

« back to all changes in this revision

Viewing changes to turnip/pack/tests/test_http.py

  • Committer: William Grant
  • Date: 2015-04-10 09:43:39 UTC
  • Revision ID: william.grant@canonical.com-20150410094339-app3nxp9nddxq8sl
Test the HTTP command resource too.

Show diffs side-by-side

added added

removed removed

Lines of Context:
73
73
        self.backend_connected.callback(None)
74
74
 
75
75
 
76
 
class TestSmartHTTPRefsResource(TestCase):
77
 
 
78
 
    run_tests_with = AsynchronousDeferredRunTest.make_factory(timeout=1)
79
 
 
80
 
    def setUp(self):
81
 
        super(TestSmartHTTPRefsResource, self).setUp()
82
 
        self.root = FakeRoot()
83
 
        self.request = LessDummyRequest([''])
 
76
class ErrorTestMixin(object):
84
77
 
85
78
    @defer.inlineCallbacks
86
79
    def performRequest(self, backend_response=None,
94
87
        if service:
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)
108
100
 
109
101
    @defer.inlineCallbacks
110
 
    def test_dumb_client_rejected(self):
111
 
        yield self.performRequest(service=None)
112
 
        self.assertEqual(404, self.request.responseCode)
113
 
        self.assertEqual(
114
 
            "Only git smart HTTP clients are supported.", self.request.value)
115
 
 
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)
121
 
 
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)
145
124
 
 
125
 
 
126
class TestSmartHTTPRefsResource(ErrorTestMixin, TestCase):
 
127
 
 
128
    run_tests_with = AsynchronousDeferredRunTest.make_factory(timeout=1)
 
129
 
 
130
    request_method = 'GET'
 
131
 
 
132
    def setUp(self):
 
133
        super(TestSmartHTTPRefsResource, self).setUp()
 
134
        self.root = FakeRoot()
 
135
        self.request = LessDummyRequest([''])
 
136
        self.request.method = b'GET'
 
137
 
 
138
    def makeResource(self, service):
 
139
        return http.SmartHTTPRefsResource(self.root, b'/foo')
 
140
 
 
141
    @defer.inlineCallbacks
 
142
    def test_dumb_client_rejected(self):
 
143
        yield self.performRequest(service=None)
 
144
        self.assertEqual(404, self.request.responseCode)
 
145
        self.assertEqual(
 
146
            "Only git smart HTTP clients are supported.", self.request.value)
 
147
 
 
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)
 
153
 
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
 
158
        # to the path.
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)
 
175
 
 
176
 
 
177
class TestSmartHTTPCommandResource(ErrorTestMixin, TestCase):
 
178
 
 
179
    run_tests_with = AsynchronousDeferredRunTest.make_factory(timeout=1)
 
180
 
 
181
    def setUp(self):
 
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')
 
188
 
 
189
    def makeResource(self, service):
 
190
        return http.SmartHTTPCommandResource(self.root, service, b'/foo')
 
191
 
 
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)
 
200
 
 
201
    @defer.inlineCallbacks
 
202
    def test_good(self):
 
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)
 
207
        self.assertEqual(
 
208
            '001bI am git protocol data.'
 
209
            'And I am raw, since we got a good packet to start with.',
 
210
            self.request.value)