Merge lp:~eday/burrow/backend-unittests into lp:burrow
- backend-unittests
- Merge into trunk
Proposed by
Eric Day
Status: | Merged |
---|---|
Approved by: | Eric Day |
Approved revision: | 29 |
Merged at revision: | 28 |
Proposed branch: | lp:~eday/burrow/backend-unittests |
Merge into: | lp:burrow |
Diff against target: |
1521 lines (+571/-372) 6 files modified
burrow/backend/__init__.py (+4/-0) burrow/backend/memory.py (+221/-205) burrow/backend/sqlite.py (+71/-22) burrow/frontend/wsgi.py (+29/-48) test/backend/test_memory.py (+245/-96) test/frontend/test_wsgi.py (+1/-1) |
To merge this branch: | bzr merge lp:~eday/burrow/backend-unittests |
Related bugs: | |
Related blueprints: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Burrow Core Team | Pending | ||
Review via email: mp+70505@code.launchpad.net |
Commit message
Description of the change
Added backend message tests, pushed message detail processing down to backend, added NotFound exception to backend to differentiate from empty lists, and cleaned up message storage in memory backend.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'burrow/backend/__init__.py' |
2 | --- burrow/backend/__init__.py 2011-07-15 00:15:56 +0000 |
3 | +++ burrow/backend/__init__.py 2011-08-04 23:47:24 +0000 |
4 | @@ -98,5 +98,9 @@ |
5 | eventlet.sleep(1) |
6 | |
7 | |
8 | +class NotFound(Exception): |
9 | + pass |
10 | + |
11 | + |
12 | class BadDetail(Exception): |
13 | pass |
14 | |
15 | === modified file 'burrow/backend/memory.py' |
16 | --- burrow/backend/memory.py 2011-07-22 19:05:31 +0000 |
17 | +++ burrow/backend/memory.py 2011-08-04 23:47:24 +0000 |
18 | @@ -24,7 +24,7 @@ |
19 | structures. It uses a linked list of objects to store data |
20 | (accounts, queues, and messages) with a dict as a secondary index |
21 | into this list. This is required so we can have O(1) appends, |
22 | - deletes, and lookups by name, along with easy traversal starting |
23 | + deletes, and lookups by id, along with easy traversal starting |
24 | anywhere in the list.''' |
25 | |
26 | def __init__(self, config): |
27 | @@ -32,195 +32,198 @@ |
28 | self.accounts = Accounts() |
29 | |
30 | def delete_accounts(self, filters={}): |
31 | - return self.accounts.delete(filters) |
32 | + if len(filters) == 0: |
33 | + self.accounts.reset() |
34 | + return |
35 | + detail = self._get_detail(filters) |
36 | + for account in self.accounts.iter(filters): |
37 | + self.accounts.delete(account.id) |
38 | + if detail is not None: |
39 | + yield account.detail(detail) |
40 | |
41 | def get_accounts(self, filters={}): |
42 | - return self.accounts.iter_detail(filters) |
43 | + detail = self._get_detail(filters, 'id') |
44 | + for account in self.accounts.iter(filters): |
45 | + if detail is not None: |
46 | + yield account.detail(detail) |
47 | |
48 | def delete_queues(self, account, filters={}): |
49 | - return self.accounts.delete_queues(account, filters) |
50 | + account = self.accounts.get(account) |
51 | + if account is None: |
52 | + raise burrow.backend.NotFound() |
53 | + if len(filters) == 0: |
54 | + account.queues.reset() |
55 | + else: |
56 | + detail = self._get_detail(filters) |
57 | + for queue in account.queues.iter(filters): |
58 | + account.queues.delete(queue.id) |
59 | + if detail is not None: |
60 | + yield queue.detail(detail) |
61 | + if account.queues.count() == 0: |
62 | + self.accounts.delete(account.id) |
63 | |
64 | def get_queues(self, account, filters={}): |
65 | - return self.accounts.get_queues(account, filters) |
66 | + account = self.accounts.get(account) |
67 | + if account is None: |
68 | + raise burrow.backend.NotFound() |
69 | + detail = self._get_detail(filters, 'id') |
70 | + for queue in account.queues.iter(filters): |
71 | + if detail is not None: |
72 | + yield queue.detail(detail) |
73 | |
74 | def delete_messages(self, account, queue, filters={}): |
75 | - return self._scan_queue(account, queue, filters, delete=True) |
76 | + account, queue = self.accounts.get_queue(account, queue) |
77 | + if queue is None: |
78 | + raise burrow.backend.NotFound() |
79 | + if len(filters) == 0: |
80 | + queue.messages.reset() |
81 | + else: |
82 | + detail = self._get_message_detail(filters) |
83 | + for message in queue.messages.iter(filters): |
84 | + queue.messages.delete(message.id) |
85 | + if detail is not None: |
86 | + yield message.detail(detail) |
87 | + if queue.messages.count() == 0: |
88 | + self.accounts.delete_queue(account.id, queue.id) |
89 | |
90 | def get_messages(self, account, queue, filters={}): |
91 | - return self._scan_queue(account, queue, filters) |
92 | + account, queue = self.accounts.get_queue(account, queue) |
93 | + if queue is None: |
94 | + raise burrow.backend.NotFound() |
95 | + detail = self._get_message_detail(filters, 'all') |
96 | + for message in queue.messages.iter(filters): |
97 | + if detail is not None: |
98 | + yield message.detail(detail) |
99 | |
100 | def update_messages(self, account, queue, attributes={}, filters={}): |
101 | - return self._scan_queue(account, queue, filters, attributes) |
102 | + account, queue = self.accounts.get_queue(account, queue) |
103 | + if queue is None: |
104 | + raise burrow.backend.NotFound() |
105 | + notify = False |
106 | + ttl, hide = self._get_attributes(attributes) |
107 | + detail = self._get_message_detail(filters) |
108 | + for message in queue.messages.iter(filters): |
109 | + if ttl is not None: |
110 | + message.ttl = ttl |
111 | + if hide is not None: |
112 | + message.hide = hide |
113 | + if hide == 0: |
114 | + notify = True |
115 | + if detail is not None: |
116 | + yield message.detail(detail) |
117 | + if notify: |
118 | + self.notify(account.id, queue.id) |
119 | |
120 | def create_message(self, account, queue, message, body, attributes={}): |
121 | account, queue = self.accounts.get_queue(account, queue, True) |
122 | - ttl = attributes.get('ttl', 0) |
123 | - if ttl > 0: |
124 | - ttl += int(time.time()) |
125 | - hide = attributes.get('hide', 0) |
126 | - if hide > 0: |
127 | - hide += int(time.time()) |
128 | - for index in xrange(0, len(queue.messages)): |
129 | - if queue.messages[index]['id'] == message: |
130 | - message = queue.messages[index] |
131 | - message['ttl'] = ttl |
132 | - message['hide'] = hide |
133 | - message['body'] = body |
134 | - if hide == 0: |
135 | - self.notify(account.name, queue.name) |
136 | - return False |
137 | - message = dict(id=message, ttl=ttl, hide=hide, body=body) |
138 | - queue.messages.append(message) |
139 | - self.notify(account.name, queue.name) |
140 | - return True |
141 | + ttl, hide = self._get_attributes(attributes, default_ttl=0, |
142 | + default_hide=0) |
143 | + if queue.messages.get(message) is None: |
144 | + created = True |
145 | + else: |
146 | + created = False |
147 | + message = queue.messages.get(message, True) |
148 | + message.ttl = ttl |
149 | + message.hide = hide |
150 | + message.body = body |
151 | + if created or hide == 0: |
152 | + self.notify(account.id, queue.id) |
153 | + return created |
154 | |
155 | def delete_message(self, account, queue, message, filters={}): |
156 | account, queue = self.accounts.get_queue(account, queue) |
157 | if queue is None: |
158 | return None |
159 | - for index in xrange(0, len(queue.messages)): |
160 | - if queue.messages[index]['id'] == message: |
161 | - message = queue.messages[index] |
162 | - del queue.messages[index] |
163 | - if len(queue.messages) == 0: |
164 | - self.accounts.delete_queue(account.name, queue.name) |
165 | - if message['ttl'] > 0: |
166 | - message['ttl'] -= int(time.time()) |
167 | - if message['hide'] > 0: |
168 | - message['hide'] -= int(time.time()) |
169 | - return message |
170 | - return None |
171 | + message = queue.messages.get(message) |
172 | + if message is None: |
173 | + return None |
174 | + queue.messages.delete(message.id) |
175 | + if queue.messages.count() == 0: |
176 | + self.accounts.delete_queue(account.id, queue.id) |
177 | + return message.detail() |
178 | |
179 | def get_message(self, account, queue, message, filters={}): |
180 | account, queue = self.accounts.get_queue(account, queue) |
181 | if queue is None: |
182 | return None |
183 | - for index in xrange(0, len(queue.messages)): |
184 | - if queue.messages[index]['id'] == message: |
185 | - ttl = queue.messages[index]['ttl'] |
186 | - if ttl > 0: |
187 | - ttl -= int(time.time()) |
188 | - hide = queue.messages[index]['hide'] |
189 | - if hide > 0: |
190 | - hide -= int(time.time()) |
191 | - return dict(id=message, ttl=ttl, hide=hide, |
192 | - body=queue.messages[index]['body']) |
193 | - return None |
194 | + message = queue.messages.get(message) |
195 | + if message is None: |
196 | + return None |
197 | + return message.detail() |
198 | |
199 | def update_message(self, account, queue, message, attributes={}, |
200 | filters={}): |
201 | account, queue = self.accounts.get_queue(account, queue) |
202 | if queue is None: |
203 | return None |
204 | - ttl = attributes.get('ttl', None) |
205 | - if ttl is not None and ttl > 0: |
206 | - ttl += int(time.time()) |
207 | - hide = attributes.get('hide', None) |
208 | - if hide is not None and hide > 0: |
209 | - hide += int(time.time()) |
210 | - for index in xrange(0, len(queue.messages)): |
211 | - if queue.messages[index]['id'] == message: |
212 | - message = queue.messages[index] |
213 | - if ttl is not None: |
214 | - message['ttl'] = ttl |
215 | - if hide is not None: |
216 | - message['hide'] = hide |
217 | - if hide == 0: |
218 | - self.notify(account.name, queue.name) |
219 | - return message |
220 | - return None |
221 | + ttl, hide = self._get_attributes(attributes) |
222 | + message = queue.messages.get(message) |
223 | + if message is None: |
224 | + return None |
225 | + if ttl is not None: |
226 | + message.ttl = ttl |
227 | + if hide is not None: |
228 | + message.hide = hide |
229 | + if hide == 0: |
230 | + self.notify(account.id, queue.id) |
231 | + return message.detail() |
232 | |
233 | def clean(self): |
234 | now = int(time.time()) |
235 | for account in self.accounts.iter(): |
236 | for queue in account.queues.iter(): |
237 | - index = 0 |
238 | notify = False |
239 | - total = len(queue.messages) |
240 | - while index < total: |
241 | - message = queue.messages[index] |
242 | - if 0 < message['ttl'] <= now: |
243 | - del queue.messages[index] |
244 | - total -= 1 |
245 | - else: |
246 | - if 0 < message['hide'] <= now: |
247 | - message['hide'] = 0 |
248 | - notify = True |
249 | - index += 1 |
250 | + for message in queue.messages.iter(dict(match_hidden=True)): |
251 | + if 0 < message.ttl <= now: |
252 | + queue.messages.delete(message.id) |
253 | + elif 0 < message.hide <= now: |
254 | + message.hide = 0 |
255 | + notify = True |
256 | if notify: |
257 | - self.notify(account.name, queue.name) |
258 | - if len(queue.messages) == 0: |
259 | - self.accounts.delete_queue(account.name, queue.name) |
260 | + self.notify(account.id, queue.id) |
261 | + if queue.messages.count() == 0: |
262 | + self.accounts.delete_queue(account.id, queue.id) |
263 | |
264 | - def _scan_queue(self, account, queue, filters, attributes={}, |
265 | - delete=False): |
266 | - account, queue = self.accounts.get_queue(account, queue) |
267 | - if queue is None: |
268 | - return |
269 | - index = 0 |
270 | - notify = False |
271 | - if 'marker' in filters and filters['marker'] is not None: |
272 | - found = False |
273 | - for index in xrange(0, len(queue.messages)): |
274 | - message = queue.messages[index] |
275 | - if message['id'] == filters['marker']: |
276 | - index += 1 |
277 | - found = True |
278 | - break |
279 | - if not found: |
280 | - index = 0 |
281 | - messages = [] |
282 | - total = len(queue.messages) |
283 | - limit = filters.get('limit', None) |
284 | - match_hidden = filters.get('match_hidden', False) |
285 | - ttl = attributes.get('ttl', None) |
286 | + def _get_attributes(self, attributes, default_ttl=None, default_hide=None): |
287 | + ttl = attributes.get('ttl', default_ttl) |
288 | if ttl is not None and ttl > 0: |
289 | ttl += int(time.time()) |
290 | - hide = attributes.get('hide', None) |
291 | + hide = attributes.get('hide', default_hide) |
292 | if hide is not None and hide > 0: |
293 | hide += int(time.time()) |
294 | - while index < total: |
295 | - message = queue.messages[index] |
296 | - if not match_hidden and message['hide'] != 0: |
297 | - index += 1 |
298 | - continue |
299 | - if ttl is not None: |
300 | - message['ttl'] = ttl |
301 | - if hide is not None: |
302 | - message['hide'] = hide |
303 | - if hide == 0: |
304 | - notify = True |
305 | - if delete: |
306 | - del queue.messages[index] |
307 | - total -= 1 |
308 | - else: |
309 | - index += 1 |
310 | - relative_ttl = message['ttl'] |
311 | - if relative_ttl > 0: |
312 | - relative_ttl -= int(time.time()) |
313 | - relative_hide = message['hide'] |
314 | - if relative_hide > 0: |
315 | - relative_hide -= int(time.time()) |
316 | - yield dict(id=message['id'], ttl=relative_ttl, hide=relative_hide, |
317 | - body=message['body']) |
318 | - if limit: |
319 | - limit -= 1 |
320 | - if limit == 0: |
321 | - break |
322 | - if notify: |
323 | - self.notify(account.name, queue.name) |
324 | - if len(queue.messages) == 0: |
325 | - self.accounts.delete_queue(account.name, queue.name) |
326 | + return ttl, hide |
327 | + |
328 | + def _get_detail(self, filters, default=None): |
329 | + detail = filters.get('detail', default) |
330 | + if detail == 'none': |
331 | + detail = None |
332 | + elif detail is not None and detail not in ['id', 'all']: |
333 | + raise burrow.backend.BadDetail(detail) |
334 | + return detail |
335 | + |
336 | + def _get_message_detail(self, filters, default=None): |
337 | + detail = filters.get('detail', default) |
338 | + options = ['id', 'attributes', 'body', 'all'] |
339 | + if detail == 'none': |
340 | + detail = None |
341 | + elif detail is not None and detail not in options: |
342 | + raise burrow.backend.BadDetail(detail) |
343 | + return detail |
344 | |
345 | |
346 | class Item(object): |
347 | '''Object to represent elements in a indexed linked list.''' |
348 | |
349 | - def __init__(self, name=None): |
350 | - self.name = name |
351 | + def __init__(self, id=None): |
352 | + self.id = id |
353 | self.next = None |
354 | self.prev = None |
355 | |
356 | + def detail(self, detail): |
357 | + if detail == 'all': |
358 | + return dict(id=self.id) |
359 | + return self.id |
360 | + |
361 | |
362 | class IndexedList(object): |
363 | '''Class for managing an indexed linked list.''' |
364 | @@ -237,30 +240,16 @@ |
365 | item.prev = self.last |
366 | self.last.next = item |
367 | self.last = item |
368 | - self.index[item.name] = item |
369 | + self.index[item.id] = item |
370 | return item |
371 | |
372 | def count(self): |
373 | return len(self.index) |
374 | |
375 | - def delete(self, filters): |
376 | - if len(filters) == 0: |
377 | - self.first = None |
378 | - self.last = None |
379 | - self.index.clear() |
380 | - return |
381 | - detail = self._get_detail(filters) |
382 | - for item in self.iter(filters): |
383 | - self.delete_item(item.name) |
384 | - if detail == 'id': |
385 | - yield item.name |
386 | - elif detail == 'all': |
387 | - yield dict(id=item.name) |
388 | - |
389 | - def delete_item(self, name): |
390 | - if name not in self.index: |
391 | - return |
392 | - item = self.index.pop(name) |
393 | + def delete(self, id): |
394 | + if id not in self.index: |
395 | + return |
396 | + item = self.index.pop(id) |
397 | if item.next is not None: |
398 | item.next.prev = item.prev |
399 | if item.prev is not None: |
400 | @@ -270,9 +259,11 @@ |
401 | if self.last == item: |
402 | self.last = item.prev |
403 | |
404 | - def get(self, name): |
405 | - if name in self.index: |
406 | - return self.index[name] |
407 | + def get(self, id, create=False): |
408 | + if id in self.index: |
409 | + return self.index[id] |
410 | + elif create: |
411 | + return self.add(self.item_class(id)) |
412 | return None |
413 | |
414 | def iter(self, filters={}): |
415 | @@ -281,6 +272,8 @@ |
416 | item = self.index[marker].next |
417 | else: |
418 | item = self.first |
419 | + if item is None: |
420 | + raise burrow.backend.NotFound() |
421 | limit = filters.get('limit', None) |
422 | while item is not None: |
423 | yield item |
424 | @@ -290,46 +283,31 @@ |
425 | break |
426 | item = item.next |
427 | |
428 | - def iter_detail(self, filters={}): |
429 | - detail = self._get_detail(filters, 'id') |
430 | - for item in self.iter(filters): |
431 | - if detail == 'id': |
432 | - yield item.name |
433 | - elif detail == 'all': |
434 | - yield dict(id=item.name) |
435 | - |
436 | - def _get_detail(self, filters, default=None): |
437 | - detail = filters.get('detail', default) |
438 | - if detail == 'none': |
439 | - detail = None |
440 | - elif detail is not None and detail not in ['id', 'all']: |
441 | - raise burrow.backend.BadDetail(detail) |
442 | - return detail |
443 | + def reset(self): |
444 | + if self.count() == 0: |
445 | + raise burrow.backend.NotFound() |
446 | + self.first = None |
447 | + self.last = None |
448 | + self.index.clear() |
449 | |
450 | |
451 | class Account(Item): |
452 | |
453 | - def __init__(self, name=None): |
454 | - super(Account, self).__init__(name) |
455 | + def __init__(self, id=None): |
456 | + super(Account, self).__init__(id) |
457 | self.queues = Queues() |
458 | |
459 | |
460 | class Accounts(IndexedList): |
461 | |
462 | + item_class = Account |
463 | + |
464 | def delete_queue(self, account, queue): |
465 | account = self.get(account) |
466 | if account is not None: |
467 | - account.queues.delete_item(queue) |
468 | - if account.queues.count() == 0: |
469 | - self.delete_item(account.name) |
470 | - |
471 | - def delete_queues(self, account, filters): |
472 | - account = self.get(account) |
473 | - if account is not None: |
474 | - for queue in account.queues.delete(filters): |
475 | - yield queue |
476 | - if account.queues.count() == 0: |
477 | - self.delete_item(account.name) |
478 | + account.queues.delete(queue) |
479 | + if account.queues.count() == 0: |
480 | + self.delete(account.id) |
481 | |
482 | def get_queue(self, account, queue, create=False): |
483 | if account in self.index: |
484 | @@ -340,26 +318,64 @@ |
485 | return None, None |
486 | return account, account.queues.get(queue, create) |
487 | |
488 | - def get_queues(self, account, filters={}): |
489 | - account = self.get(account) |
490 | - if account is None: |
491 | - return [] |
492 | - else: |
493 | - return account.queues.iter_detail(filters) |
494 | - |
495 | |
496 | class Queue(Item): |
497 | |
498 | - def __init__(self, name=None): |
499 | - super(Queue, self).__init__(name) |
500 | - self.messages = [] |
501 | + def __init__(self, id=None): |
502 | + super(Queue, self).__init__(id) |
503 | + self.messages = Messages() |
504 | |
505 | |
506 | class Queues(IndexedList): |
507 | |
508 | - def get(self, queue, create=False): |
509 | - if queue in self.index: |
510 | - return self.index[queue] |
511 | - elif create: |
512 | - return self.add(Queue(queue)) |
513 | - return None |
514 | + item_class = Queue |
515 | + |
516 | + |
517 | +class Message(Item): |
518 | + |
519 | + def __init__(self, id=None): |
520 | + super(Message, self).__init__(id) |
521 | + self.ttl = 0 |
522 | + self.hide = 0 |
523 | + self.body = None |
524 | + |
525 | + def detail(self, detail=None): |
526 | + if detail == 'id': |
527 | + return self.id |
528 | + elif detail == 'body': |
529 | + return self.body |
530 | + ttl = self.ttl |
531 | + if ttl > 0: |
532 | + ttl -= int(time.time()) |
533 | + hide = self.hide |
534 | + if hide > 0: |
535 | + hide -= int(time.time()) |
536 | + if detail == 'attributes': |
537 | + return dict(id=self.id, ttl=ttl, hide=hide) |
538 | + return dict(id=self.id, ttl=ttl, hide=hide, body=self.body) |
539 | + |
540 | + |
541 | +class Messages(IndexedList): |
542 | + |
543 | + item_class = Message |
544 | + |
545 | + def iter(self, filters={}): |
546 | + marker = filters.get('marker', None) |
547 | + if marker is not None and marker in self.index: |
548 | + item = self.index[marker].next |
549 | + else: |
550 | + item = self.first |
551 | + limit = filters.get('limit', None) |
552 | + match_hidden = filters.get('match_hidden', False) |
553 | + count = 0 |
554 | + while item is not None: |
555 | + if match_hidden or item.hide == 0: |
556 | + count += 1 |
557 | + yield item |
558 | + if limit: |
559 | + limit -= 1 |
560 | + if limit == 0: |
561 | + break |
562 | + item = item.next |
563 | + if count == 0: |
564 | + raise burrow.backend.NotFound() |
565 | |
566 | === modified file 'burrow/backend/sqlite.py' |
567 | --- burrow/backend/sqlite.py 2011-07-22 19:40:38 +0000 |
568 | +++ burrow/backend/sqlite.py 2011-08-04 23:47:24 +0000 |
569 | @@ -66,6 +66,7 @@ |
570 | current_account = None |
571 | ids = [] |
572 | marker_found = False |
573 | + count = 0 |
574 | for row in self.db.execute(query, values): |
575 | if marker == row[1]: |
576 | marker_found = True |
577 | @@ -78,6 +79,7 @@ |
578 | break |
579 | limit -= 1 |
580 | current_account = row[1] |
581 | + count += 1 |
582 | if detail == 'id': |
583 | yield row[1] |
584 | elif detail == 'all': |
585 | @@ -90,7 +92,10 @@ |
586 | filters = dict(filters) |
587 | filters.pop('marker') |
588 | for account in self.delete_accounts(filters): |
589 | + count += 1 |
590 | yield account |
591 | + if count == 0: |
592 | + raise burrow.backend.NotFound() |
593 | if len(ids) > 0: |
594 | self._delete_queues(ids) |
595 | |
596 | @@ -109,12 +114,14 @@ |
597 | values += (limit,) |
598 | detail = self._get_detail(filters, 'id') |
599 | marker_found = False |
600 | + count = 0 |
601 | for row in self.db.execute(query, values): |
602 | if marker == row[0]: |
603 | marker_found = True |
604 | continue |
605 | elif marker is not None and not marker_found: |
606 | break |
607 | + count += 1 |
608 | if detail == 'id': |
609 | yield row[0] |
610 | elif detail == 'all': |
611 | @@ -123,7 +130,10 @@ |
612 | filters = dict(filters) |
613 | filters.pop('marker') |
614 | for account in self.get_accounts(filters): |
615 | + count += 1 |
616 | yield account |
617 | + if count == 0: |
618 | + raise burrow.backend.NotFound() |
619 | |
620 | def delete_queues(self, account, filters={}): |
621 | query = 'SELECT rowid,queue FROM queues WHERE account=?' |
622 | @@ -132,12 +142,14 @@ |
623 | detail = self._get_detail(filters, None) |
624 | ids = [] |
625 | marker_found = False |
626 | + count = 0 |
627 | for row in self.db.execute(query, values): |
628 | if marker == row[1]: |
629 | marker_found = True |
630 | continue |
631 | elif marker is not None and not marker_found: |
632 | break |
633 | + count += 1 |
634 | if detail == 'id': |
635 | yield row[1] |
636 | elif detail == 'all': |
637 | @@ -150,7 +162,10 @@ |
638 | filters = dict(filters) |
639 | filters.pop('marker') |
640 | for queue in self.delete_queues(account, filters): |
641 | + count += 1 |
642 | yield queue |
643 | + if count == 0: |
644 | + raise burrow.backend.NotFound() |
645 | if len(ids) > 0: |
646 | self._delete_queues(ids) |
647 | |
648 | @@ -160,12 +175,14 @@ |
649 | query, values, marker = self._add_queue_filters(query, values, filters) |
650 | detail = self._get_detail(filters, 'id') |
651 | marker_found = False |
652 | + count = 0 |
653 | for row in self.db.execute(query, values): |
654 | if marker == row[0]: |
655 | marker_found = True |
656 | continue |
657 | elif marker is not None and not marker_found: |
658 | break |
659 | + count += 1 |
660 | if detail == 'id': |
661 | yield row[0] |
662 | elif detail == 'all': |
663 | @@ -174,7 +191,10 @@ |
664 | filters = dict(filters) |
665 | filters.pop('marker') |
666 | for queue in self.get_queues(account, filters): |
667 | + count += 1 |
668 | yield queue |
669 | + if count == 0: |
670 | + raise burrow.backend.NotFound() |
671 | |
672 | def _add_queue_filters(self, query, values, filters): |
673 | limit = filters.get('limit', None) |
674 | @@ -209,9 +229,11 @@ |
675 | result = self._get_messages(account, queue, filters) |
676 | rowid = result.next() |
677 | ids = [] |
678 | + detail = self._get_message_detail(filters) |
679 | for message in result: |
680 | - ids.append(message['id']) |
681 | - yield message |
682 | + ids.append(message[0]) |
683 | + if detail is not None: |
684 | + yield self._message_detail(message, detail) |
685 | if len(ids) == 0: |
686 | return |
687 | values = (rowid,) + tuple(ids) |
688 | @@ -224,36 +246,42 @@ |
689 | |
690 | def get_messages(self, account, queue, filters={}): |
691 | result = self._get_messages(account, queue, filters) |
692 | - rowid = result.next() |
693 | - return result |
694 | + result.next() |
695 | + detail = self._get_message_detail(filters, 'all') |
696 | + for message in result: |
697 | + if detail is not None: |
698 | + yield self._message_detail(message, detail) |
699 | |
700 | def update_messages(self, account, queue, attributes={}, filters={}): |
701 | result = self._get_messages(account, queue, filters) |
702 | rowid = result.next() |
703 | ids = [] |
704 | ttl = attributes.get('ttl', None) |
705 | + if ttl is not None and ttl > 0: |
706 | + ttl += int(time.time()) |
707 | hide = attributes.get('hide', None) |
708 | + if hide is not None and hide > 0: |
709 | + hide += int(time.time()) |
710 | + detail = self._get_message_detail(filters) |
711 | for message in result: |
712 | - ids.append(message['id']) |
713 | + message = list(message) |
714 | + ids.append(message[0]) |
715 | if ttl is not None: |
716 | - message['ttl'] = ttl |
717 | + message[1] = ttl |
718 | if hide is not None: |
719 | - message['hide'] = hide |
720 | - yield message |
721 | + message[2] = hide |
722 | + if detail is not None: |
723 | + yield self._message_detail(message, detail) |
724 | if len(ids) == 0: |
725 | return |
726 | query = 'UPDATE messages SET' |
727 | comma = '' |
728 | values = tuple() |
729 | if ttl is not None: |
730 | - if ttl > 0: |
731 | - ttl += int(time.time()) |
732 | query += '%s ttl=?' % comma |
733 | values += (ttl,) |
734 | comma = ',' |
735 | if hide is not None: |
736 | - if hide > 0: |
737 | - hide += int(time.time()) |
738 | query += '%s hide=?' % comma |
739 | values += (hide,) |
740 | comma = ',' |
741 | @@ -410,7 +438,7 @@ |
742 | rowid = self._get_queue(account, queue) |
743 | yield rowid |
744 | if rowid is None: |
745 | - return |
746 | + raise burrow.backend.NotFound() |
747 | marker = None |
748 | if 'marker' in filters and filters['marker'] is not None: |
749 | query = "SELECT rowid FROM messages " \ |
750 | @@ -426,12 +454,33 @@ |
751 | query += " AND hide == 0" |
752 | if 'limit' in filters and filters['limit'] is not None: |
753 | query += " LIMIT %d" % filters['limit'] |
754 | - result = self.db.execute(query).fetchall() |
755 | - for row in result: |
756 | - ttl = row[1] |
757 | - if ttl > 0: |
758 | - ttl -= int(time.time()) |
759 | - hide = row[2] |
760 | - if hide > 0: |
761 | - hide -= int(time.time()) |
762 | - yield dict(id=row[0], ttl=ttl, hide=hide, body=str(row[3])) |
763 | + count = 0 |
764 | + for row in self.db.execute(query): |
765 | + yield row |
766 | + count += 1 |
767 | + if count == 0: |
768 | + raise burrow.backend.NotFound() |
769 | + |
770 | + def _get_message_detail(self, filters, default=None): |
771 | + detail = filters.get('detail', default) |
772 | + options = ['id', 'attributes', 'body', 'all'] |
773 | + if detail == 'none': |
774 | + detail = None |
775 | + elif detail is not None and detail not in options: |
776 | + raise burrow.backend.BadDetail(detail) |
777 | + return detail |
778 | + |
779 | + def _message_detail(self, row, detail): |
780 | + if detail == 'id': |
781 | + return row[0] |
782 | + elif detail == 'body': |
783 | + return str(row[3]) |
784 | + ttl = row[1] |
785 | + if ttl > 0: |
786 | + ttl -= int(time.time()) |
787 | + hide = row[2] |
788 | + if hide > 0: |
789 | + hide -= int(time.time()) |
790 | + if detail == 'attributes': |
791 | + return dict(id=self.id, ttl=ttl, hide=hide) |
792 | + return dict(id=row[0], ttl=ttl, hide=hide, body=str(row[3])) |
793 | |
794 | === modified file 'burrow/frontend/wsgi.py' |
795 | --- burrow/frontend/wsgi.py 2011-07-22 19:10:39 +0000 |
796 | +++ burrow/frontend/wsgi.py 2011-08-04 23:47:24 +0000 |
797 | @@ -16,6 +16,7 @@ |
798 | |
799 | import json |
800 | import time |
801 | +import types |
802 | |
803 | import eventlet |
804 | import eventlet.wsgi |
805 | @@ -23,6 +24,7 @@ |
806 | import routes.middleware |
807 | import webob.dec |
808 | |
809 | +import burrow.backend |
810 | import burrow.frontend |
811 | |
812 | # Default configuration values for this module. |
813 | @@ -127,61 +129,46 @@ |
814 | @webob.dec.wsgify |
815 | def _delete_accounts(self, req): |
816 | filters = self._parse_filters(req) |
817 | - accounts = [account for account in |
818 | - self.backend.delete_accounts(filters)] |
819 | - if len(accounts) == 0: |
820 | - return self._response() |
821 | - return self._response(body=accounts) |
822 | + return self._response(body=self.backend.delete_accounts(filters)) |
823 | |
824 | @webob.dec.wsgify |
825 | def _get_accounts(self, req): |
826 | filters = self._parse_filters(req) |
827 | - accounts = [account for account in self.backend.get_accounts(filters)] |
828 | - if len(accounts) == 0: |
829 | - return self._response(status=404) |
830 | - return self._response(body=accounts) |
831 | + return self._response(body=self.backend.get_accounts(filters)) |
832 | |
833 | @webob.dec.wsgify |
834 | def _delete_queues(self, req, account): |
835 | filters = self._parse_filters(req) |
836 | - queues = [queue for queue in |
837 | - self.backend.delete_queues(account, filters)] |
838 | - if len(queues) == 0: |
839 | - return self._response() |
840 | + queues = self.backend.delete_queues(account, filters) |
841 | return self._response(body=queues) |
842 | |
843 | @webob.dec.wsgify |
844 | def _get_queues(self, req, account): |
845 | filters = self._parse_filters(req) |
846 | - queues = [queue for queue in self.backend.get_queues(account, filters)] |
847 | - if len(queues) == 0: |
848 | - return self._response(status=404) |
849 | - return self._response(body=queues) |
850 | + return self._response(body=self.backend.get_queues(account, filters)) |
851 | |
852 | @webob.dec.wsgify |
853 | @wait_on_queue |
854 | def _delete_messages(self, req, account, queue): |
855 | filters = self._parse_filters(req) |
856 | - messages = [message for message in |
857 | - self.backend.delete_messages(account, queue, filters)] |
858 | - return self._return_messages(req, account, queue, messages, 'none') |
859 | + messages = self.backend.delete_messages(account, queue, filters) |
860 | + return self._response(body=messages) |
861 | |
862 | @webob.dec.wsgify |
863 | @wait_on_queue |
864 | def _get_messages(self, req, account, queue): |
865 | filters = self._parse_filters(req) |
866 | - messages = [message for message in |
867 | - self.backend.get_messages(account, queue, filters)] |
868 | - return self._return_messages(req, account, queue, messages, 'all') |
869 | + messages = self.backend.get_messages(account, queue, filters) |
870 | + return self._response(body=messages) |
871 | |
872 | @webob.dec.wsgify |
873 | @wait_on_queue |
874 | def _post_messages(self, req, account, queue): |
875 | attributes = self._parse_attributes(req) |
876 | filters = self._parse_filters(req) |
877 | - messages = [message for message in |
878 | - self.backend.update_messages(account, queue, attributes, filters)] |
879 | - return self._return_messages(req, account, queue, messages, 'all') |
880 | + messages = self.backend.update_messages(account, queue, attributes, |
881 | + filters) |
882 | + return self._response(body=messages) |
883 | |
884 | @webob.dec.wsgify |
885 | def _delete_message(self, req, account, queue, message): |
886 | @@ -240,20 +227,6 @@ |
887 | return self._response(body=message) |
888 | return self._response() |
889 | |
890 | - def _return_messages(self, req, account, queue, messages, detail): |
891 | - if len(messages) == 0: |
892 | - return self._response(status=404) |
893 | - if 'detail' in req.params: |
894 | - detail = req.params['detail'] |
895 | - filtered_messages = [] |
896 | - for message in messages: |
897 | - message = self._filter_message(detail, message) |
898 | - if message is not None: |
899 | - filtered_messages.append(message) |
900 | - if len(filtered_messages) == 0: |
901 | - return self._response() |
902 | - return self._response(body=filtered_messages) |
903 | - |
904 | def _parse_filters(self, req): |
905 | filters = {} |
906 | if 'limit' in req.params: |
907 | @@ -282,15 +255,23 @@ |
908 | return attributes |
909 | |
910 | def _response(self, status=200, body=None, content_type=None): |
911 | - if content_type is None: |
912 | - if body is None: |
913 | - content_type = '' |
914 | - else: |
915 | + if isinstance(body, types.GeneratorType): |
916 | + try: |
917 | + body = list(body) |
918 | + except burrow.backend.NotFound: |
919 | + body = None |
920 | + status = 404 |
921 | + if body == []: |
922 | + body = None |
923 | + if body is None: |
924 | + content_type = '' |
925 | + if status == 200: |
926 | + status = 204 |
927 | + else: |
928 | + if content_type is None: |
929 | content_type = 'application/json' |
930 | - if content_type == 'application/json': |
931 | - body = json.dumps(body, indent=2) |
932 | - if body is None and status == 200: |
933 | - status = 204 |
934 | + if content_type == 'application/json': |
935 | + body = json.dumps(body, indent=2) |
936 | return webob.Response(status=status, body=body, |
937 | content_type=content_type) |
938 | |
939 | |
940 | === modified file 'test/backend/test_memory.py' |
941 | --- test/backend/test_memory.py 2011-07-22 18:24:23 +0000 |
942 | +++ test/backend/test_memory.py 2011-08-04 23:47:24 +0000 |
943 | @@ -15,6 +15,7 @@ |
944 | import ConfigParser |
945 | import unittest |
946 | |
947 | +import burrow.backend |
948 | import burrow.backend.memory |
949 | |
950 | |
951 | @@ -25,50 +26,52 @@ |
952 | def setUp(self): |
953 | config = (ConfigParser.ConfigParser(), 'test') |
954 | self.backend = self.backend_class(config) |
955 | - self.assertEquals([], list(self.backend.get_accounts())) |
956 | - self.assertEquals([], list(self.backend.get_queues('a'))) |
957 | - self.assertEquals([], list(self.backend.get_messages('a', 'q'))) |
958 | + accounts = self.backend.get_accounts() |
959 | + self.assertRaises(burrow.backend.NotFound, list, accounts) |
960 | + queues = self.backend.get_queues('a') |
961 | + self.assertRaises(burrow.backend.NotFound, list, queues) |
962 | + messages = self.backend.get_messages('a', 'q') |
963 | + self.assertRaises(burrow.backend.NotFound, list, messages) |
964 | |
965 | def tearDown(self): |
966 | - self.assertEquals([], list(self.backend.get_messages('a', 'q'))) |
967 | - self.assertEquals([], list(self.backend.get_queues('a'))) |
968 | - self.assertEquals([], list(self.backend.get_accounts())) |
969 | + messages = self.backend.get_messages('a', 'q') |
970 | + self.assertRaises(burrow.backend.NotFound, list, messages) |
971 | + queues = self.backend.get_queues('a') |
972 | + self.assertRaises(burrow.backend.NotFound, list, queues) |
973 | + accounts = self.backend.get_accounts() |
974 | + self.assertRaises(burrow.backend.NotFound, list, accounts) |
975 | |
976 | - def test_account(self): |
977 | + def test_accounts(self): |
978 | self.backend.create_message('a', 'q', 'm', 'test') |
979 | self.assertEquals(['a'], list(self.backend.get_accounts())) |
980 | self.assertEquals([], list(self.backend.delete_accounts())) |
981 | |
982 | - def test_account_delete_detail_all(self): |
983 | + def test_accounts_delete_detail_all(self): |
984 | self.backend.create_message('a', 'q', 'm', 'test') |
985 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
986 | filters = dict(detail='all') |
987 | accounts = list(self.backend.delete_accounts(filters)) |
988 | self.assertEquals([dict(id='a')], accounts) |
989 | |
990 | - def test_account_delete_detail_id(self): |
991 | + def test_accounts_delete_detail_id(self): |
992 | self.backend.create_message('a', 'q', 'm', 'test') |
993 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
994 | filters = dict(detail='id') |
995 | accounts = list(self.backend.delete_accounts(filters)) |
996 | self.assertEquals(['a'], accounts) |
997 | |
998 | - def test_account_delete_detail_none(self): |
999 | + def test_accounts_delete_detail_none(self): |
1000 | self.backend.create_message('a', 'q', 'm', 'test') |
1001 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
1002 | filters = dict(detail='none') |
1003 | accounts = list(self.backend.delete_accounts(filters)) |
1004 | self.assertEquals([], accounts) |
1005 | |
1006 | - def test_account_delete_detail_bad(self): |
1007 | + def test_accounts_delete_detail_bad(self): |
1008 | self.backend.create_message('a', 'q', 'm', 'test') |
1009 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
1010 | filters = dict(detail='bad') |
1011 | accounts = self.backend.delete_accounts(filters) |
1012 | self.assertRaises(burrow.backend.BadDetail, list, accounts) |
1013 | self.assertEquals([], list(self.backend.delete_accounts())) |
1014 | |
1015 | - def test_account_delete_marker(self): |
1016 | + def test_accounts_delete_marker(self): |
1017 | self.backend.create_message('a1', 'q', 'm', 'test') |
1018 | self.backend.create_message('a2', 'q', 'm', 'test') |
1019 | self.backend.create_message('a3', 'q', 'm', 'test') |
1020 | @@ -77,13 +80,13 @@ |
1021 | filters = dict(detail='id', marker=accounts[0]) |
1022 | accounts2 = list(self.backend.delete_accounts(filters)) |
1023 | self.assertEquals(accounts[1:], accounts2) |
1024 | - accounts3 = list(self.backend.get_accounts()) |
1025 | - self.assertEquals(accounts[:1], accounts3) |
1026 | + accounts2 = list(self.backend.get_accounts()) |
1027 | + self.assertEquals(accounts[:1], accounts2) |
1028 | filters = dict(detail='id', marker='unknown') |
1029 | - accounts4 = list(self.backend.delete_accounts(filters)) |
1030 | - self.assertEquals(accounts[:1], accounts4) |
1031 | + accounts2 = list(self.backend.delete_accounts(filters)) |
1032 | + self.assertEquals(accounts[:1], accounts2) |
1033 | |
1034 | - def test_account_delete_limit(self): |
1035 | + def test_accounts_delete_limit(self): |
1036 | self.backend.create_message('a1', 'q', 'm', 'test') |
1037 | self.backend.create_message('a2', 'q', 'm', 'test') |
1038 | self.backend.create_message('a3', 'q', 'm', 'test') |
1039 | @@ -93,10 +96,10 @@ |
1040 | accounts2 = list(self.backend.delete_accounts(filters)) |
1041 | self.assertEquals(accounts[:1], accounts2) |
1042 | filters = dict(detail='id', limit=2) |
1043 | - accounts3 = list(self.backend.delete_accounts(filters)) |
1044 | - self.assertEquals(accounts[1:3], accounts3) |
1045 | + accounts2 = list(self.backend.delete_accounts(filters)) |
1046 | + self.assertEquals(accounts[1:3], accounts2) |
1047 | |
1048 | - def test_account_delete_marker_limit(self): |
1049 | + def test_accounts_delete_marker_limit(self): |
1050 | self.backend.create_message('a1', 'q', 'm', 'test') |
1051 | self.backend.create_message('a2', 'q', 'm', 'test') |
1052 | self.backend.create_message('a3', 'q', 'm', 'test') |
1053 | @@ -106,43 +109,39 @@ |
1054 | accounts2 = list(self.backend.delete_accounts(filters)) |
1055 | self.assertEquals(accounts[2:3], accounts2) |
1056 | filters = dict(detail='id', marker=accounts[0], limit=2) |
1057 | - accounts3 = list(self.backend.delete_accounts(filters)) |
1058 | - self.assertEquals(accounts[1:2], accounts3) |
1059 | + accounts2 = list(self.backend.delete_accounts(filters)) |
1060 | + self.assertEquals(accounts[1:2], accounts2) |
1061 | self.assertEquals([], list(self.backend.delete_accounts())) |
1062 | |
1063 | - def test_account_get_detail_all(self): |
1064 | + def test_accounts_get_detail_all(self): |
1065 | self.backend.create_message('a', 'q', 'm', 'test') |
1066 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
1067 | filters = dict(detail='all') |
1068 | accounts = list(self.backend.get_accounts(filters)) |
1069 | self.assertEquals([dict(id='a')], accounts) |
1070 | self.assertEquals([], list(self.backend.delete_accounts())) |
1071 | |
1072 | - def test_account_get_detail_id(self): |
1073 | + def test_accounts_get_detail_id(self): |
1074 | self.backend.create_message('a', 'q', 'm', 'test') |
1075 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
1076 | filters = dict(detail='id') |
1077 | accounts = list(self.backend.get_accounts(filters)) |
1078 | self.assertEquals(['a'], accounts) |
1079 | self.assertEquals([], list(self.backend.delete_accounts())) |
1080 | |
1081 | - def test_account_get_detail_none(self): |
1082 | + def test_accounts_get_detail_none(self): |
1083 | self.backend.create_message('a', 'q', 'm', 'test') |
1084 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
1085 | filters = dict(detail='none') |
1086 | accounts = list(self.backend.get_accounts(filters)) |
1087 | self.assertEquals([], accounts) |
1088 | self.assertEquals([], list(self.backend.delete_accounts())) |
1089 | |
1090 | - def test_account_get_detail_bad(self): |
1091 | + def test_accounts_get_detail_bad(self): |
1092 | self.backend.create_message('a', 'q', 'm', 'test') |
1093 | - self.assertEquals(['a'], list(self.backend.get_accounts())) |
1094 | filters = dict(detail='bad') |
1095 | accounts = self.backend.get_accounts(filters) |
1096 | self.assertRaises(burrow.backend.BadDetail, list, accounts) |
1097 | self.assertEquals([], list(self.backend.delete_accounts())) |
1098 | |
1099 | - def test_account_get_marker(self): |
1100 | + def test_accounts_get_marker(self): |
1101 | self.backend.create_message('a1', 'q', 'm', 'test') |
1102 | self.backend.create_message('a2', 'q', 'm', 'test') |
1103 | self.backend.create_message('a3', 'q', 'm', 'test') |
1104 | @@ -152,17 +151,17 @@ |
1105 | accounts2 = list(self.backend.get_accounts(filters)) |
1106 | self.assertEquals(accounts[1:], accounts2) |
1107 | filters = dict(marker=accounts[1]) |
1108 | - accounts3 = list(self.backend.get_accounts(filters)) |
1109 | - self.assertEquals(accounts[2:], accounts3) |
1110 | + accounts2 = list(self.backend.get_accounts(filters)) |
1111 | + self.assertEquals(accounts[2:], accounts2) |
1112 | filters = dict(marker=accounts[2]) |
1113 | - accounts4 = list(self.backend.get_accounts(filters)) |
1114 | - self.assertEquals([], accounts4) |
1115 | + accounts2 = self.backend.get_accounts(filters) |
1116 | + self.assertRaises(burrow.backend.NotFound, list, accounts2) |
1117 | filters = dict(marker='unknown') |
1118 | - accounts5 = list(self.backend.get_accounts(filters)) |
1119 | - self.assertEquals(accounts, accounts5) |
1120 | + accounts2 = list(self.backend.get_accounts(filters)) |
1121 | + self.assertEquals(accounts, accounts2) |
1122 | self.assertEquals([], list(self.backend.delete_accounts())) |
1123 | |
1124 | - def test_account_get_limit(self): |
1125 | + def test_accounts_get_limit(self): |
1126 | self.backend.create_message('a1', 'q', 'm', 'test') |
1127 | self.backend.create_message('a2', 'q', 'm', 'test') |
1128 | self.backend.create_message('a3', 'q', 'm', 'test') |
1129 | @@ -172,17 +171,17 @@ |
1130 | accounts2 = list(self.backend.get_accounts(filters)) |
1131 | self.assertEquals(accounts[:1], accounts2) |
1132 | filters = dict(limit=2) |
1133 | - accounts3 = list(self.backend.get_accounts(filters)) |
1134 | - self.assertEquals(accounts[:2], accounts3) |
1135 | + accounts2 = list(self.backend.get_accounts(filters)) |
1136 | + self.assertEquals(accounts[:2], accounts2) |
1137 | filters = dict(limit=3) |
1138 | - accounts4 = list(self.backend.get_accounts(filters)) |
1139 | - self.assertEquals(accounts, accounts4) |
1140 | + accounts2 = list(self.backend.get_accounts(filters)) |
1141 | + self.assertEquals(accounts, accounts2) |
1142 | filters = dict(limit=100) |
1143 | - accounts5 = list(self.backend.get_accounts(filters)) |
1144 | - self.assertEquals(accounts, accounts5) |
1145 | + accounts2 = list(self.backend.get_accounts(filters)) |
1146 | + self.assertEquals(accounts, accounts2) |
1147 | self.assertEquals([], list(self.backend.delete_accounts())) |
1148 | |
1149 | - def test_account_get_marker_limit(self): |
1150 | + def test_accounts_get_marker_limit(self): |
1151 | self.backend.create_message('a1', 'q', 'm', 'test') |
1152 | self.backend.create_message('a2', 'q', 'm', 'test') |
1153 | self.backend.create_message('a3', 'q', 'm', 'test') |
1154 | @@ -192,45 +191,41 @@ |
1155 | accounts2 = list(self.backend.get_accounts(filters)) |
1156 | self.assertEquals(accounts[2:3], accounts2) |
1157 | filters = dict(marker=accounts[0], limit=2) |
1158 | - accounts3 = list(self.backend.get_accounts(filters)) |
1159 | - self.assertEquals(accounts[1:3], accounts3) |
1160 | + accounts2 = list(self.backend.get_accounts(filters)) |
1161 | + self.assertEquals(accounts[1:3], accounts2) |
1162 | self.assertEquals([], list(self.backend.delete_accounts())) |
1163 | |
1164 | - def test_queue(self): |
1165 | + def test_queues(self): |
1166 | self.backend.create_message('a', 'q', 'm', 'test') |
1167 | self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1168 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1169 | |
1170 | - def test_queue_delete_detail_all(self): |
1171 | + def test_queues_delete_detail_all(self): |
1172 | self.backend.create_message('a', 'q', 'm', 'test') |
1173 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1174 | filters = dict(detail='all') |
1175 | queues = list(self.backend.delete_queues('a', filters)) |
1176 | self.assertEquals([dict(id='q')], queues) |
1177 | |
1178 | - def test_queue_delete_detail_id(self): |
1179 | + def test_queues_delete_detail_id(self): |
1180 | self.backend.create_message('a', 'q', 'm', 'test') |
1181 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1182 | filters = dict(detail='id') |
1183 | queues = list(self.backend.delete_queues('a', filters)) |
1184 | self.assertEquals(['q'], queues) |
1185 | |
1186 | - def test_queue_delete_detail_none(self): |
1187 | + def test_queues_delete_detail_none(self): |
1188 | self.backend.create_message('a', 'q', 'm', 'test') |
1189 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1190 | filters = dict(detail='none') |
1191 | queues = list(self.backend.delete_queues('a', filters)) |
1192 | self.assertEquals([], queues) |
1193 | |
1194 | - def test_queue_delete_detail_bad(self): |
1195 | + def test_queues_delete_detail_bad(self): |
1196 | self.backend.create_message('a', 'q', 'm', 'test') |
1197 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1198 | filters = dict(detail='bad') |
1199 | queues = self.backend.delete_queues('a', filters) |
1200 | self.assertRaises(burrow.backend.BadDetail, list, queues) |
1201 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1202 | |
1203 | - def test_queue_delete_marker(self): |
1204 | + def test_queues_delete_marker(self): |
1205 | self.backend.create_message('a', 'q1', 'm', 'test') |
1206 | self.backend.create_message('a', 'q2', 'm', 'test') |
1207 | self.backend.create_message('a', 'q3', 'm', 'test') |
1208 | @@ -239,13 +234,13 @@ |
1209 | filters = dict(detail='id', marker=queues[0]) |
1210 | queues2 = list(self.backend.delete_queues('a', filters)) |
1211 | self.assertEquals(queues[1:], queues2) |
1212 | - queues3 = list(self.backend.get_queues('a')) |
1213 | - self.assertEquals(queues[:1], queues3) |
1214 | + queues2 = list(self.backend.get_queues('a')) |
1215 | + self.assertEquals(queues[:1], queues2) |
1216 | filters = dict(detail='id', marker='unknown') |
1217 | - queues4 = list(self.backend.delete_queues('a', filters)) |
1218 | - self.assertEquals(queues[:1], queues4) |
1219 | + queues2 = list(self.backend.delete_queues('a', filters)) |
1220 | + self.assertEquals(queues[:1], queues2) |
1221 | |
1222 | - def test_queue_delete_limit(self): |
1223 | + def test_queues_delete_limit(self): |
1224 | self.backend.create_message('a', 'q1', 'm', 'test') |
1225 | self.backend.create_message('a', 'q2', 'm', 'test') |
1226 | self.backend.create_message('a', 'q3', 'm', 'test') |
1227 | @@ -255,10 +250,10 @@ |
1228 | queues2 = list(self.backend.delete_queues('a', filters)) |
1229 | self.assertEquals(queues[:1], queues2) |
1230 | filters = dict(detail='id', limit=2) |
1231 | - queues3 = list(self.backend.delete_queues('a', filters)) |
1232 | - self.assertEquals(queues[1:3], queues3) |
1233 | + queues2 = list(self.backend.delete_queues('a', filters)) |
1234 | + self.assertEquals(queues[1:3], queues2) |
1235 | |
1236 | - def test_queue_delete_marker_limit(self): |
1237 | + def test_queues_delete_marker_limit(self): |
1238 | self.backend.create_message('a', 'q1', 'm', 'test') |
1239 | self.backend.create_message('a', 'q2', 'm', 'test') |
1240 | self.backend.create_message('a', 'q3', 'm', 'test') |
1241 | @@ -268,43 +263,39 @@ |
1242 | queues2 = list(self.backend.delete_queues('a', filters)) |
1243 | self.assertEquals(queues[2:3], queues2) |
1244 | filters = dict(detail='id', marker=queues[0], limit=2) |
1245 | - queues3 = list(self.backend.delete_queues('a', filters)) |
1246 | - self.assertEquals(queues[1:2], queues3) |
1247 | + queues2 = list(self.backend.delete_queues('a', filters)) |
1248 | + self.assertEquals(queues[1:2], queues2) |
1249 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1250 | |
1251 | - def test_queue_get_detail_all(self): |
1252 | + def test_queues_get_detail_all(self): |
1253 | self.backend.create_message('a', 'q', 'm', 'test') |
1254 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1255 | filters = dict(detail='all') |
1256 | queues = list(self.backend.get_queues('a', filters)) |
1257 | self.assertEquals([dict(id='q')], queues) |
1258 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1259 | |
1260 | - def test_queue_get_detail_id(self): |
1261 | + def test_queues_get_detail_id(self): |
1262 | self.backend.create_message('a', 'q', 'm', 'test') |
1263 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1264 | filters = dict(detail='id') |
1265 | queues = list(self.backend.get_queues('a', filters)) |
1266 | self.assertEquals(['q'], queues) |
1267 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1268 | |
1269 | - def test_queue_get_detail_none(self): |
1270 | + def test_queues_get_detail_none(self): |
1271 | self.backend.create_message('a', 'q', 'm', 'test') |
1272 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1273 | filters = dict(detail='none') |
1274 | queues = list(self.backend.get_queues('a', filters)) |
1275 | self.assertEquals([], queues) |
1276 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1277 | |
1278 | - def test_queue_get_detail_bad(self): |
1279 | + def test_queues_get_detail_bad(self): |
1280 | self.backend.create_message('a', 'q', 'm', 'test') |
1281 | - self.assertEquals(['q'], list(self.backend.get_queues('a'))) |
1282 | filters = dict(detail='bad') |
1283 | queues = self.backend.get_queues('a', filters) |
1284 | self.assertRaises(burrow.backend.BadDetail, list, queues) |
1285 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1286 | |
1287 | - def test_queue_get_marker(self): |
1288 | + def test_queues_get_marker(self): |
1289 | self.backend.create_message('a', 'q1', 'm', 'test') |
1290 | self.backend.create_message('a', 'q2', 'm', 'test') |
1291 | self.backend.create_message('a', 'q3', 'm', 'test') |
1292 | @@ -314,17 +305,17 @@ |
1293 | queues2 = list(self.backend.get_queues('a', filters)) |
1294 | self.assertEquals(queues[1:], queues2) |
1295 | filters = dict(marker=queues[1]) |
1296 | - queues3 = list(self.backend.get_queues('a', filters)) |
1297 | - self.assertEquals(queues[2:], queues3) |
1298 | + queues2 = list(self.backend.get_queues('a', filters)) |
1299 | + self.assertEquals(queues[2:], queues2) |
1300 | filters = dict(marker=queues[2]) |
1301 | - queues4 = list(self.backend.get_queues('a', filters)) |
1302 | - self.assertEquals([], queues4) |
1303 | + queues2 = self.backend.get_queues('a', filters) |
1304 | + self.assertRaises(burrow.backend.NotFound, list, queues2) |
1305 | filters = dict(marker='unknown') |
1306 | - queues5 = list(self.backend.get_queues('a', filters)) |
1307 | - self.assertEquals(queues, queues5) |
1308 | + queues2 = list(self.backend.get_queues('a', filters)) |
1309 | + self.assertEquals(queues, queues2) |
1310 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1311 | |
1312 | - def test_queue_get_limit(self): |
1313 | + def test_queues_get_limit(self): |
1314 | self.backend.create_message('a', 'q1', 'm', 'test') |
1315 | self.backend.create_message('a', 'q2', 'm', 'test') |
1316 | self.backend.create_message('a', 'q3', 'm', 'test') |
1317 | @@ -334,17 +325,17 @@ |
1318 | queues2 = list(self.backend.get_queues('a', filters)) |
1319 | self.assertEquals(queues[:1], queues2) |
1320 | filters = dict(limit=2) |
1321 | - queues3 = list(self.backend.get_queues('a', filters)) |
1322 | - self.assertEquals(queues[:2], queues3) |
1323 | + queues2 = list(self.backend.get_queues('a', filters)) |
1324 | + self.assertEquals(queues[:2], queues2) |
1325 | filters = dict(limit=3) |
1326 | - queues4 = list(self.backend.get_queues('a', filters)) |
1327 | - self.assertEquals(queues, queues4) |
1328 | + queues2 = list(self.backend.get_queues('a', filters)) |
1329 | + self.assertEquals(queues, queues2) |
1330 | filters = dict(limit=100) |
1331 | - queues5 = list(self.backend.get_queues('a', filters)) |
1332 | - self.assertEquals(queues, queues5) |
1333 | + queues2 = list(self.backend.get_queues('a', filters)) |
1334 | + self.assertEquals(queues, queues2) |
1335 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1336 | |
1337 | - def test_queue_get_marker_limit(self): |
1338 | + def test_queues_get_marker_limit(self): |
1339 | self.backend.create_message('a', 'q1', 'm', 'test') |
1340 | self.backend.create_message('a', 'q2', 'm', 'test') |
1341 | self.backend.create_message('a', 'q3', 'm', 'test') |
1342 | @@ -354,6 +345,164 @@ |
1343 | queues2 = list(self.backend.get_queues('a', filters)) |
1344 | self.assertEquals(queues[2:3], queues2) |
1345 | filters = dict(marker=queues[0], limit=2) |
1346 | - queues3 = list(self.backend.get_queues('a', filters)) |
1347 | - self.assertEquals(queues[1:3], queues3) |
1348 | + queues2 = list(self.backend.get_queues('a', filters)) |
1349 | + self.assertEquals(queues[1:3], queues2) |
1350 | self.assertEquals([], list(self.backend.delete_queues('a'))) |
1351 | + |
1352 | + def test_messages(self): |
1353 | + self.backend.create_message('a', 'q', 'm', 'test') |
1354 | + message = dict(id='m', ttl=0, hide=0, body='test') |
1355 | + messages = list(self.backend.get_messages('a', 'q')) |
1356 | + self.assertEquals([message], messages) |
1357 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1358 | + |
1359 | + def test_messages_delete_detail_all(self): |
1360 | + self.backend.create_message('a', 'q', 'm', 'test') |
1361 | + message = dict(id='m', ttl=0, hide=0, body='test') |
1362 | + filters = dict(detail='all') |
1363 | + messages = list(self.backend.delete_messages('a', 'q', filters)) |
1364 | + self.assertEquals([message], messages) |
1365 | + |
1366 | + def test_messages_delete_detail_id(self): |
1367 | + self.backend.create_message('a', 'q', 'm', 'test') |
1368 | + filters = dict(detail='id') |
1369 | + queues = list(self.backend.delete_messages('a', 'q', filters)) |
1370 | + self.assertEquals(['m'], queues) |
1371 | + |
1372 | + def test_messages_delete_detail_none(self): |
1373 | + self.backend.create_message('a', 'q', 'm', 'test') |
1374 | + filters = dict(detail='none') |
1375 | + messages = list(self.backend.delete_messages('a', 'q', filters)) |
1376 | + self.assertEquals([], messages) |
1377 | + |
1378 | + def test_messages_delete_detail_bad(self): |
1379 | + self.backend.create_message('a', 'q', 'm', 'test') |
1380 | + filters = dict(detail='bad') |
1381 | + messages = self.backend.delete_messages('a', 'q', filters) |
1382 | + self.assertRaises(burrow.backend.BadDetail, list, messages) |
1383 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1384 | + |
1385 | + def test_messages_delete_marker(self): |
1386 | + self.backend.create_message('a', 'q', 'm1', 'test') |
1387 | + self.backend.create_message('a', 'q', 'm2', 'test') |
1388 | + self.backend.create_message('a', 'q', 'm3', 'test') |
1389 | + messages = list(self.backend.get_messages('a', 'q')) |
1390 | + self.assertEquals(3, len(messages)) |
1391 | + filters = dict(detail='all', marker=messages[0]['id']) |
1392 | + messages2 = list(self.backend.delete_messages('a', 'q', filters)) |
1393 | + self.assertEquals(messages[1:], messages2) |
1394 | + messages2 = list(self.backend.get_messages('a', 'q')) |
1395 | + self.assertEquals(messages[:1], messages2) |
1396 | + filters = dict(detail='all', marker='unknown') |
1397 | + messages2 = list(self.backend.delete_messages('a', 'q', filters)) |
1398 | + self.assertEquals(messages[:1], messages2) |
1399 | + |
1400 | + def test_messages_delete_limit(self): |
1401 | + self.backend.create_message('a', 'q', 'm1', 'test') |
1402 | + self.backend.create_message('a', 'q', 'm2', 'test') |
1403 | + self.backend.create_message('a', 'q', 'm3', 'test') |
1404 | + messages = list(self.backend.get_messages('a', 'q')) |
1405 | + self.assertEquals(3, len(messages)) |
1406 | + filters = dict(detail='all', limit=1) |
1407 | + messages2 = list(self.backend.delete_messages('a', 'q', filters)) |
1408 | + self.assertEquals(messages[:1], messages2) |
1409 | + filters = dict(detail='all', limit=2) |
1410 | + messages2 = list(self.backend.delete_messages('a', 'q', filters)) |
1411 | + self.assertEquals(messages[1:3], messages2) |
1412 | + |
1413 | + def test_messages_delete_marker_limit(self): |
1414 | + self.backend.create_message('a', 'q', 'm1', 'test') |
1415 | + self.backend.create_message('a', 'q', 'm2', 'test') |
1416 | + self.backend.create_message('a', 'q', 'm3', 'test') |
1417 | + messages = list(self.backend.get_messages('a', 'q')) |
1418 | + self.assertEquals(3, len(messages)) |
1419 | + filters = dict(detail='all', marker=messages[1]['id'], limit=1) |
1420 | + messages2 = list(self.backend.delete_messages('a', 'q', filters)) |
1421 | + self.assertEquals(messages[2:3], messages2) |
1422 | + filters = dict(detail='all', marker=messages[0]['id'], limit=2) |
1423 | + messages2 = list(self.backend.delete_messages('a', 'q', filters)) |
1424 | + self.assertEquals(messages[1:2], messages2) |
1425 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1426 | + |
1427 | + def test_messages_get_detail_all(self): |
1428 | + self.backend.create_message('a', 'q', 'm', 'test') |
1429 | + message = dict(id='m', ttl=0, hide=0, body='test') |
1430 | + filters = dict(detail='all') |
1431 | + messages = list(self.backend.get_messages('a', 'q', filters)) |
1432 | + self.assertEquals([message], messages) |
1433 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1434 | + |
1435 | + def test_messages_get_detail_id(self): |
1436 | + self.backend.create_message('a', 'q', 'm', 'test') |
1437 | + filters = dict(detail='id') |
1438 | + messages = list(self.backend.get_messages('a', 'q', filters)) |
1439 | + self.assertEquals(['m'], messages) |
1440 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1441 | + |
1442 | + def test_messages_get_detail_none(self): |
1443 | + self.backend.create_message('a', 'q', 'm', 'test') |
1444 | + filters = dict(detail='none') |
1445 | + messages = list(self.backend.get_messages('a', 'q', filters)) |
1446 | + self.assertEquals([], messages) |
1447 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1448 | + |
1449 | + def test_messages_get_detail_bad(self): |
1450 | + self.backend.create_message('a', 'q', 'm', 'test') |
1451 | + filters = dict(detail='bad') |
1452 | + messages = self.backend.get_messages('a', 'q', filters) |
1453 | + self.assertRaises(burrow.backend.BadDetail, list, messages) |
1454 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1455 | + |
1456 | + def test_messages_get_marker(self): |
1457 | + self.backend.create_message('a', 'q', 'm1', 'test') |
1458 | + self.backend.create_message('a', 'q', 'm2', 'test') |
1459 | + self.backend.create_message('a', 'q', 'm3', 'test') |
1460 | + messages = list(self.backend.get_messages('a', 'q')) |
1461 | + self.assertEquals(3, len(messages)) |
1462 | + filters = dict(marker=messages[0]['id']) |
1463 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1464 | + self.assertEquals(messages[1:], messages2) |
1465 | + filters = dict(marker=messages[1]['id']) |
1466 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1467 | + self.assertEquals(messages[2:], messages2) |
1468 | + filters = dict(marker=messages[2]['id']) |
1469 | + messages2 = self.backend.get_messages('a', 'q', filters) |
1470 | + self.assertRaises(burrow.backend.NotFound, list, messages2) |
1471 | + filters = dict(marker='unknown') |
1472 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1473 | + self.assertEquals(messages, messages2) |
1474 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1475 | + |
1476 | + def test_messages_get_limit(self): |
1477 | + self.backend.create_message('a', 'q', 'm1', 'test') |
1478 | + self.backend.create_message('a', 'q', 'm2', 'test') |
1479 | + self.backend.create_message('a', 'q', 'm3', 'test') |
1480 | + messages = list(self.backend.get_messages('a', 'q')) |
1481 | + self.assertEquals(3, len(messages)) |
1482 | + filters = dict(limit=1) |
1483 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1484 | + self.assertEquals(messages[:1], messages2) |
1485 | + filters = dict(limit=2) |
1486 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1487 | + self.assertEquals(messages[:2], messages2) |
1488 | + filters = dict(limit=3) |
1489 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1490 | + self.assertEquals(messages, messages2) |
1491 | + filters = dict(limit=100) |
1492 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1493 | + self.assertEquals(messages, messages2) |
1494 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1495 | + |
1496 | + def test_messages_get_marker_limit(self): |
1497 | + self.backend.create_message('a', 'q', 'm1', 'test') |
1498 | + self.backend.create_message('a', 'q', 'm2', 'test') |
1499 | + self.backend.create_message('a', 'q', 'm3', 'test') |
1500 | + messages = list(self.backend.get_messages('a', 'q')) |
1501 | + self.assertEquals(3, len(messages)) |
1502 | + filters = dict(marker=messages[1]['id'], limit=1) |
1503 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1504 | + self.assertEquals(messages[2:3], messages2) |
1505 | + filters = dict(marker=messages[0]['id'], limit=2) |
1506 | + messages2 = list(self.backend.get_messages('a', 'q', filters)) |
1507 | + self.assertEquals(messages[1:3], messages2) |
1508 | + self.assertEquals([], list(self.backend.delete_messages('a', 'q'))) |
1509 | |
1510 | === modified file 'test/frontend/test_wsgi.py' |
1511 | --- test/frontend/test_wsgi.py 2011-06-15 18:27:24 +0000 |
1512 | +++ test/frontend/test_wsgi.py 2011-08-04 23:47:24 +0000 |
1513 | @@ -263,7 +263,7 @@ |
1514 | self._put_url('/a/q/1?hide=10') |
1515 | thread = eventlet.spawn(self._message_wait) |
1516 | url = '/a/q?hide=0&match_hidden=true' |
1517 | - eventlet.spawn_after(0.2, self._post_url, url) |
1518 | + eventlet.spawn_after(0.2, self._post_url, url, status=204) |
1519 | thread.wait() |
1520 | self.assertTrue(self.success) |
1521 | self._delete_url('/a/q/1') |