~hudson-openstack/burrow/trunk

« back to all changes in this revision

Viewing changes to test/frontend/test_wsgi.py

  • Committer: Tarmac
  • Author(s): Eric Day
  • Date: 2011-08-10 07:28:01 UTC
  • mfrom: (16.3.24 backend-unittests)
  • Revision ID: tarmac-20110810072801-32ue4p8boiepxhjg
Pushed wait functionality down into backend, removed frontend tests since this is replaced with HTTP backend test now.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2011 OpenStack LLC.
2
 
#
3
 
# Licensed under the Apache License, Version 2.0 (the "License");
4
 
# you may not use this file except in compliance with the License.
5
 
# You may obtain a copy of the License at
6
 
#
7
 
#     http://www.apache.org/licenses/LICENSE-2.0
8
 
#
9
 
# Unless required by applicable law or agreed to in writing, software
10
 
# distributed under the License is distributed on an "AS IS" BASIS,
11
 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
 
# See the License for the specific language governing permissions and
13
 
# limitations under the License.
14
 
 
15
 
import ConfigParser
16
 
import json
17
 
import time
18
 
import unittest
19
 
 
20
 
import eventlet
21
 
import webob
22
 
 
23
 
import burrow.backend.memory
24
 
import burrow.backend.sqlite
25
 
import burrow.frontend.wsgi
26
 
 
27
 
 
28
 
class TestWSGIMemory(unittest.TestCase):
29
 
    '''Unittests for the WSGI frontend to SQLite backend.'''
30
 
    backend_class = burrow.backend.memory.Backend
31
 
 
32
 
    def setUp(self):
33
 
        config = (ConfigParser.ConfigParser(), 'test')
34
 
        self.backend = self.backend_class(config)
35
 
        self.frontend = burrow.frontend.wsgi.Frontend(config, self.backend)
36
 
        self.frontend.default_ttl = 0
37
 
        self._get_url('', status=404)
38
 
        self._get_url('/a', status=404)
39
 
        self._get_url('/a/q', status=404)
40
 
 
41
 
    def tearDown(self):
42
 
        self._get_url('/a/q', status=404)
43
 
        self._get_url('/a', status=404)
44
 
        self._get_url('', status=404)
45
 
 
46
 
    def test_account(self):
47
 
        self._put_url('/a/q/1')
48
 
        result = self._get_url('')
49
 
        self.assertEquals(result, ['a'])
50
 
        self._delete_url('/a')
51
 
 
52
 
    def test_queue(self):
53
 
        self._put_url('/a/q/1')
54
 
        result = self._get_url('/a')
55
 
        self.assertEquals(result, ['q'])
56
 
        self._delete_url('/a/q')
57
 
 
58
 
    def test_message(self):
59
 
        self._put_url('/a/q/1', body='b')
60
 
        result = self._get_url('/a/q')
61
 
        self.assertMessages(result, [self.message('1', body='b')])
62
 
        self._delete_url('/a/q/1')
63
 
 
64
 
    def test_message_post(self):
65
 
        self._put_url('/a/q/1', body='b')
66
 
        for x in range(0, 3):
67
 
            self._post_url('/a/q/1?ttl=%d&hide=%d' % (x, x), status=204)
68
 
            result = self._get_url('/a/q?match_hidden=true')
69
 
            message = self.message('1', x, x, body='b')
70
 
            self.assertMessages(result, [message])
71
 
        self._delete_url('/a/q/1')
72
 
 
73
 
    def test_message_put(self):
74
 
        for x in range(0, 3):
75
 
            url = '/a/q/1?ttl=%d&hide=%d' % (x, x)
76
 
            status = 201 if x == 0 else 204
77
 
            self._put_url(url, body=str(x), status=status)
78
 
            result = self._get_url('/a/q?match_hidden=true')
79
 
            message = self.message('1', x, x, body=str(x))
80
 
            self.assertMessages(result, [message])
81
 
        self._delete_url('/a/q/1')
82
 
 
83
 
    def test_message_delete_limit(self):
84
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
85
 
        result = self._delete_url('/a/q?limit=3&detail=all', status=200)
86
 
        messages = []
87
 
        messages.append(self.message('1'))
88
 
        messages.append(self.message('2'))
89
 
        messages.append(self.message('3'))
90
 
        self.assertMessages(result, messages)
91
 
        result = self._delete_url('/a/q?limit=3&detail=all', status=200)
92
 
        message = self.message('4')
93
 
        self.assertMessages(result, [message])
94
 
 
95
 
    def test_message_get_limit(self):
96
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
97
 
        for x in range(0, 4):
98
 
            result = self._get_url('/a/q?limit=3')
99
 
            messages = []
100
 
            for y in range(x, 4)[:3]:
101
 
                messages.append(self.message(str(y + 1)))
102
 
            self.assertMessages(result, messages)
103
 
            self._delete_url('/a/q/%d' % (x + 1))
104
 
 
105
 
    def test_message_post_limit(self):
106
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
107
 
        for x in range(0, 4):
108
 
            result = self._post_url('/a/q?limit=3&ttl=%d&detail=all' % x)
109
 
            messages = []
110
 
            for y in range(x, 4)[:3]:
111
 
                messages.append(self.message(str(y + 1), x))
112
 
            self.assertMessages(result, messages)
113
 
            self._delete_url('/a/q/%d' % (x + 1))
114
 
 
115
 
    def test_message_delete_marker(self):
116
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
117
 
        result = self._delete_url('/a/q?marker=2&detail=all', status=200)
118
 
        messages = []
119
 
        messages.append(self.message('3'))
120
 
        messages.append(self.message('4'))
121
 
        self.assertMessages(result, messages)
122
 
        result = self._delete_url('/a/q?marker=5&detail=all', status=200)
123
 
        messages = []
124
 
        messages.append(self.message('1'))
125
 
        messages.append(self.message('2'))
126
 
        self.assertMessages(result, messages)
127
 
 
128
 
    def test_message_get_marker(self):
129
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
130
 
        for x in range(0, 4):
131
 
            result = self._get_url('/a/q?marker=%d' % x)
132
 
            messages = []
133
 
            for y in range(x, 4):
134
 
                messages.append(self.message(str(y + 1)))
135
 
            self.assertMessages(result, messages)
136
 
            self._delete_url('/a/q/%d' % (x + 1))
137
 
 
138
 
    def test_message_post_marker(self):
139
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
140
 
        for x in range(0, 4):
141
 
            url = '/a/q?marker=%d&ttl=%d&detail=all' % (x, x)
142
 
            result = self._post_url(url)
143
 
            messages = []
144
 
            for y in range(x, 4):
145
 
                messages.append(self.message(str(y + 1), x))
146
 
            self.assertMessages(result, messages)
147
 
            self._delete_url('/a/q/%d' % (x + 1))
148
 
 
149
 
    def test_message_delete_limit_marker(self):
150
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
151
 
        url = '/a/q?limit=2&marker=1&detail=all'
152
 
        result = self._delete_url(url, status=200)
153
 
        messages = []
154
 
        messages.append(self.message('2'))
155
 
        messages.append(self.message('3'))
156
 
        self.assertMessages(result, messages)
157
 
        url = '/a/q?limit=2&marker=5&detail=all'
158
 
        result = self._delete_url(url, status=200)
159
 
        messages = []
160
 
        messages.append(self.message('1'))
161
 
        messages.append(self.message('4'))
162
 
        self.assertMessages(result, messages)
163
 
 
164
 
    def test_message_get_limit_marker(self):
165
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
166
 
        for x in range(0, 4):
167
 
            result = self._get_url('/a/q?limit=2&marker=%d' % x)
168
 
            messages = []
169
 
            for y in range(x, 4)[:2]:
170
 
                messages.append(self.message(str(y + 1)))
171
 
            self.assertMessages(result, messages)
172
 
            self._delete_url('/a/q/%d' % (x + 1))
173
 
 
174
 
    def test_message_post_limit_marker(self):
175
 
        [self._put_url('/a/q/%d' % x) for x in range(1, 5)]
176
 
        for x in range(0, 4):
177
 
            url = '/a/q?limit=2&marker=%d&ttl=%d&detail=all' % (x, x)
178
 
            result = self._post_url(url)
179
 
            messages = []
180
 
            for y in range(x, 4)[:2]:
181
 
                messages.append(self.message(str(y + 1), x))
182
 
            self.assertMessages(result, messages)
183
 
            self._delete_url('/a/q/%d' % (x + 1))
184
 
 
185
 
    def test_message_ttl(self):
186
 
        self._put_url('/a/q/1?ttl=1')
187
 
        result = self._get_url('/a/q/1')
188
 
        self.assertMessages([result], [self.message('1', 1)])
189
 
        time.sleep(1)
190
 
        self.backend.clean()
191
 
        self._get_url('/a/q/1', status=404)
192
 
        self._put_url('/a/q/1')
193
 
        result = self._get_url('/a/q/1')
194
 
        self.assertMessages([result], [self.message('1')])
195
 
        self._post_url('/a/q/1?ttl=1', status=204)
196
 
        result = self._get_url('/a/q/1')
197
 
        self.assertMessages([result], [self.message('1', 1)])
198
 
        time.sleep(1)
199
 
        self.backend.clean()
200
 
        self._get_url('/a/q/1', status=404)
201
 
 
202
 
    def test_message_hide(self):
203
 
        self._put_url('/a/q/1?hide=1')
204
 
        result = self._get_url('/a/q/1')
205
 
        self.assertMessages([result], [self.message('1', hide=1)])
206
 
        time.sleep(1)
207
 
        self.backend.clean()
208
 
        result = self._get_url('/a/q/1')
209
 
        self.assertMessages([result], [self.message('1')])
210
 
        self._post_url('/a/q/1?hide=1', status=204)
211
 
        result = self._get_url('/a/q/1')
212
 
        self.assertMessages([result], [self.message('1', hide=1)])
213
 
        time.sleep(1)
214
 
        self.backend.clean()
215
 
        result = self._get_url('/a/q/1')
216
 
        self.assertMessages([result], [self.message('1')])
217
 
        self._delete_url('/a/q/1')
218
 
 
219
 
    def _message_wait(self):
220
 
        result = self._get_url('/a/q?wait=2')
221
 
        self.assertMessages(result, [self.message('1')])
222
 
        self.success = True
223
 
 
224
 
    def test_message_put_wait(self):
225
 
        self.success = False
226
 
        thread = eventlet.spawn(self._message_wait)
227
 
        eventlet.spawn_after(0.2, self._put_url, '/a/q/1')
228
 
        thread.wait()
229
 
        self.assertTrue(self.success)
230
 
        self._delete_url('/a/q/1')
231
 
 
232
 
    def test_message_put_wait_overwrite(self):
233
 
        self.success = False
234
 
        self._put_url('/a/q/1?hide=10')
235
 
        thread = eventlet.spawn(self._message_wait)
236
 
        eventlet.spawn_after(0.2, self._put_url, '/a/q/1?hide=0', status=204)
237
 
        thread.wait()
238
 
        self.assertTrue(self.success)
239
 
        self._delete_url('/a/q/1')
240
 
 
241
 
    def test_message_put_wait_cleanup(self):
242
 
        self.success = False
243
 
        self._put_url('/a/q/1?hide=1')
244
 
        thread = eventlet.spawn(self._message_wait)
245
 
        eventlet.spawn_after(1, self.backend.clean)
246
 
        thread.wait()
247
 
        self.assertTrue(self.success)
248
 
        self._delete_url('/a/q/1')
249
 
 
250
 
    def test_message_post_wait(self):
251
 
        self.success = False
252
 
        self._put_url('/a/q/1?hide=10')
253
 
        thread = eventlet.spawn(self._message_wait)
254
 
        eventlet.spawn_after(0.2, self._post_url, '/a/q/1?hide=0', status=204)
255
 
        thread.wait()
256
 
        self.assertTrue(self.success)
257
 
        self._delete_url('/a/q/1')
258
 
 
259
 
    def test_message_post_wait_queue(self):
260
 
        self.success = False
261
 
        self._put_url('/a/q/1?hide=10')
262
 
        thread = eventlet.spawn(self._message_wait)
263
 
        url = '/a/q?hide=0&match_hidden=true'
264
 
        eventlet.spawn_after(0.2, self._post_url, url, status=204)
265
 
        thread.wait()
266
 
        self.assertTrue(self.success)
267
 
        self._delete_url('/a/q/1')
268
 
 
269
 
    def message(self, id, ttl=0, hide=0, body=''):
270
 
        return dict(id=id, ttl=ttl, hide=hide, body=body)
271
 
 
272
 
    def assertMessages(self, first, second):
273
 
        self.assertEquals(len(first), len(second))
274
 
        for x in xrange(0, len(second)):
275
 
            self.assertEquals(first[x]['id'], second[x]['id'])
276
 
            self.assertAlmostEquals(first[x]['ttl'], second[x]['ttl'])
277
 
            self.assertAlmostEquals(first[x]['hide'], second[x]['hide'])
278
 
            self.assertEquals(first[x]['body'], second[x]['body'])
279
 
 
280
 
    def _delete_url(self, url, status=204, **kwargs):
281
 
        return self._url('DELETE', url, status=status, **kwargs)
282
 
 
283
 
    def _get_url(self, url, **kwargs):
284
 
        return self._url('GET', url, **kwargs)
285
 
 
286
 
    def _post_url(self, url, **kwargs):
287
 
        return self._url('POST', url, **kwargs)
288
 
 
289
 
    def _put_url(self, url, status=201, **kwargs):
290
 
        return self._url('PUT', url, status=status, **kwargs)
291
 
 
292
 
    def _url(self, method, url, body='', status=200):
293
 
        req = webob.Request.blank('/v1.0' + url, method=method, body=body)
294
 
        res = req.get_response(self.frontend)
295
 
        self.assertEquals(res.status_int, status)
296
 
        if status == 200:
297
 
            return json.loads(res.body)
298
 
        return None
299
 
 
300
 
 
301
 
class TestWSGISQLite(TestWSGIMemory):
302
 
    '''Unittests for the WSGI frontend to SQLite backend.'''
303
 
    backend_class = burrow.backend.sqlite.Backend