Merge lp:~eday/burrow/backend-unittests into lp:burrow

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
Reviewer Review Type Date Requested Status
Burrow Core Team Pending
Review via email: mp+70505@code.launchpad.net

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')

Subscribers

People subscribed via source and target branches