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

Proposed by Eric Day
Status: Merged
Approved by: Eric Day
Approved revision: 38
Merged at revision: 31
Proposed branch: lp:~eday/burrow/backend-unittests
Merge into: lp:burrow
Diff against target: 1257 lines (+468/-299)
8 files modified
burrow/backend/__init__.py (+30/-3)
burrow/backend/memory.py (+26/-68)
burrow/backend/sqlite.py (+123/-178)
burrow/frontend/wsgi.py (+15/-29)
etc/burrowd.conf (+4/-0)
test/backend/test_memory.py (+236/-13)
test/backend/test_sqlite.py (+30/-2)
test/frontend/test_wsgi.py (+4/-6)
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+70968@code.launchpad.net

Description of the change

Backend unittest and cleanup party!

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-08-04 06:57:15 +0000
3+++ burrow/backend/__init__.py 2011-08-09 23:35:51 +0000
4@@ -14,6 +14,8 @@
5
6 '''Backends for burrow.'''
7
8+import time
9+
10 import eventlet
11
12 import burrow.common
13@@ -49,7 +51,7 @@
14 def get_messages(self, account, queue, filters={}):
15 return []
16
17- def update_messages(self, account, queue, attributes={}, filters={}):
18+ def update_messages(self, account, queue, attributes, filters={}):
19 return []
20
21 def create_message(self, account, queue, message, body, attributes={}):
22@@ -61,8 +63,7 @@
23 def get_message(self, account, queue, message, filters={}):
24 return None
25
26- def update_message(self, account, queue, message, attributes={},
27- filters={}):
28+ def update_message(self, account, queue, message, attributes, filters={}):
29 return None
30
31 def notify(self, account, queue):
32@@ -97,6 +98,32 @@
33 self.clean()
34 eventlet.sleep(1)
35
36+ def _get_attributes(self, attributes, ttl=None, hide=None):
37+ ttl = attributes.get('ttl', ttl)
38+ if ttl is not None and ttl > 0:
39+ ttl += int(time.time())
40+ hide = attributes.get('hide', hide)
41+ if hide is not None and hide > 0:
42+ hide += int(time.time())
43+ return ttl, hide
44+
45+ def _get_detail(self, filters, default=None):
46+ detail = filters.get('detail', default)
47+ if detail == 'none':
48+ detail = None
49+ elif detail is not None and detail not in ['id', 'all']:
50+ raise burrow.backend.BadDetail(detail)
51+ return detail
52+
53+ def _get_message_detail(self, filters, default=None):
54+ detail = filters.get('detail', default)
55+ options = ['id', 'attributes', 'body', 'all']
56+ if detail == 'none':
57+ detail = None
58+ elif detail is not None and detail not in options:
59+ raise burrow.backend.BadDetail(detail)
60+ return detail
61+
62
63 class NotFound(Exception):
64 pass
65
66=== modified file 'burrow/backend/memory.py'
67--- burrow/backend/memory.py 2011-08-09 08:05:39 +0000
68+++ burrow/backend/memory.py 2011-08-09 23:35:51 +0000
69@@ -22,8 +22,8 @@
70 class Backend(burrow.backend.Backend):
71 '''This backend stores all data using native Python data
72 structures. It uses a linked list of objects to store data
73- (accounts, queues, and messages) with a dict as a secondary index
74- into this list. This is required so we can have O(1) appends,
75+ (accounts, queues, and messages) with a dictionary as a secondary
76+ index into this list. This is required so we can have O(1) appends,
77 deletes, and lookups by id, along with easy traversal starting
78 anywhere in the list.'''
79
80@@ -49,8 +49,6 @@
81
82 def delete_queues(self, account, filters={}):
83 account = self.accounts.get(account)
84- if account is None:
85- raise burrow.backend.NotFound()
86 if len(filters) == 0:
87 account.queues.reset()
88 else:
89@@ -64,8 +62,6 @@
90
91 def get_queues(self, account, filters={}):
92 account = self.accounts.get(account)
93- if account is None:
94- raise burrow.backend.NotFound()
95 detail = self._get_detail(filters, 'id')
96 for queue in account.queues.iter(filters):
97 if detail is not None:
98@@ -73,8 +69,6 @@
99
100 def delete_messages(self, account, queue, filters={}):
101 account, queue = self.accounts.get_queue(account, queue)
102- if queue is None:
103- raise burrow.backend.NotFound()
104 detail = self._get_message_detail(filters)
105 for message in queue.messages.iter(filters):
106 queue.messages.delete(message.id)
107@@ -85,17 +79,13 @@
108
109 def get_messages(self, account, queue, filters={}):
110 account, queue = self.accounts.get_queue(account, queue)
111- if queue is None:
112- raise burrow.backend.NotFound()
113 detail = self._get_message_detail(filters, 'all')
114 for message in queue.messages.iter(filters):
115 if detail is not None:
116 yield message.detail(detail)
117
118- def update_messages(self, account, queue, attributes={}, filters={}):
119+ def update_messages(self, account, queue, attributes, filters={}):
120 account, queue = self.accounts.get_queue(account, queue)
121- if queue is None:
122- raise burrow.backend.NotFound()
123 notify = False
124 ttl, hide = self._get_attributes(attributes)
125 detail = self._get_message_detail(filters)
126@@ -113,13 +103,13 @@
127
128 def create_message(self, account, queue, message, body, attributes={}):
129 account, queue = self.accounts.get_queue(account, queue, True)
130- ttl, hide = self._get_attributes(attributes, default_ttl=0,
131- default_hide=0)
132- if queue.messages.get(message) is None:
133+ ttl, hide = self._get_attributes(attributes, ttl=0, hide=0)
134+ try:
135+ message = queue.messages.get(message)
136+ created = False
137+ except burrow.backend.NotFound:
138+ message = queue.messages.get(message, True)
139 created = True
140- else:
141- created = False
142- message = queue.messages.get(message, True)
143 message.ttl = ttl
144 message.hide = hide
145 message.body = body
146@@ -129,41 +119,31 @@
147
148 def delete_message(self, account, queue, message, filters={}):
149 account, queue = self.accounts.get_queue(account, queue)
150- if queue is None:
151- raise burrow.backend.NotFound()
152 message = queue.messages.get(message)
153- if message is None:
154- raise burrow.backend.NotFound()
155+ detail = self._get_message_detail(filters)
156 queue.messages.delete(message.id)
157 if queue.messages.count() == 0:
158 self.accounts.delete_queue(account.id, queue.id)
159- return message.detail()
160+ return message.detail(detail)
161
162 def get_message(self, account, queue, message, filters={}):
163 account, queue = self.accounts.get_queue(account, queue)
164- if queue is None:
165- raise burrow.backend.NotFound()
166 message = queue.messages.get(message)
167- if message is None:
168- raise burrow.backend.NotFound()
169- return message.detail()
170+ detail = self._get_message_detail(filters, 'all')
171+ return message.detail(detail)
172
173- def update_message(self, account, queue, message, attributes={},
174- filters={}):
175+ def update_message(self, account, queue, message, attributes, filters={}):
176 account, queue = self.accounts.get_queue(account, queue)
177- if queue is None:
178- raise burrow.backend.NotFound()
179+ message = queue.messages.get(message)
180 ttl, hide = self._get_attributes(attributes)
181- message = queue.messages.get(message)
182- if message is None:
183- raise burrow.backend.NotFound()
184+ detail = self._get_message_detail(filters)
185 if ttl is not None:
186 message.ttl = ttl
187 if hide is not None:
188 message.hide = hide
189 if hide == 0:
190 self.notify(account.id, queue.id)
191- return message.detail()
192+ return message.detail(detail)
193
194 def clean(self):
195 now = int(time.time())
196@@ -181,32 +161,6 @@
197 if queue.messages.count() == 0:
198 self.accounts.delete_queue(account.id, queue.id)
199
200- def _get_attributes(self, attributes, default_ttl=None, default_hide=None):
201- ttl = attributes.get('ttl', default_ttl)
202- if ttl is not None and ttl > 0:
203- ttl += int(time.time())
204- hide = attributes.get('hide', default_hide)
205- if hide is not None and hide > 0:
206- hide += int(time.time())
207- return ttl, hide
208-
209- def _get_detail(self, filters, default=None):
210- detail = filters.get('detail', default)
211- if detail == 'none':
212- detail = None
213- elif detail is not None and detail not in ['id', 'all']:
214- raise burrow.backend.BadDetail(detail)
215- return detail
216-
217- def _get_message_detail(self, filters, default=None):
218- detail = filters.get('detail', default)
219- options = ['id', 'attributes', 'body', 'all']
220- if detail == 'none':
221- detail = None
222- elif detail is not None and detail not in options:
223- raise burrow.backend.BadDetail(detail)
224- return detail
225-
226
227 class Item(object):
228 '''Object to represent elements in a indexed linked list.'''
229@@ -217,9 +171,11 @@
230 self.prev = None
231
232 def detail(self, detail):
233- if detail == 'all':
234+ if detail == 'id':
235+ return self.id
236+ elif detail == 'all':
237 return dict(id=self.id)
238- return self.id
239+ return None
240
241
242 class IndexedList(object):
243@@ -259,7 +215,7 @@
244 return self.index[id]
245 elif create:
246 return self.add(self.item_class(id))
247- return None
248+ raise burrow.backend.NotFound()
249
250 def iter(self, filters={}):
251 marker = filters.get('marker', None)
252@@ -310,7 +266,7 @@
253 elif create:
254 account = self.add(Account(account))
255 else:
256- return None, None
257+ raise burrow.backend.NotFound()
258 return account, account.queues.get(queue, create)
259
260
261@@ -347,7 +303,9 @@
262 hide -= int(time.time())
263 if detail == 'attributes':
264 return dict(id=self.id, ttl=ttl, hide=hide)
265- return dict(id=self.id, ttl=ttl, hide=hide, body=self.body)
266+ elif detail == 'all':
267+ return dict(id=self.id, ttl=ttl, hide=hide, body=self.body)
268+ return None
269
270
271 class Messages(IndexedList):
272
273=== modified file 'burrow/backend/sqlite.py'
274--- burrow/backend/sqlite.py 2011-08-09 08:05:39 +0000
275+++ burrow/backend/sqlite.py 2011-08-09 23:35:51 +0000
276@@ -22,6 +22,7 @@
277
278 # Default configuration values for this module.
279 DEFAULT_DATABASE = ':memory:'
280+DEFAULT_SYNCHRONOUS = 'FULL'
281
282 # Maximum number of parameters to pass to execute. Testing shows a max of
283 # 999, so leave a few extra for parameters not added by a list of IDs.
284@@ -38,6 +39,8 @@
285 self.config.set('database', url.netloc)
286 database = self.config.get('database', DEFAULT_DATABASE)
287 self.db = sqlite3.connect(database)
288+ synchronous = self.config.get('synchronous', DEFAULT_SYNCHRONOUS)
289+ self.db.execute('PRAGMA synchronous=' + synchronous)
290 self.db.isolation_level = None
291 queries = [
292 'CREATE TABLE IF NOT EXISTS accounts ('
293@@ -66,20 +69,16 @@
294 self.db.execute('DELETE FROM queues')
295 self.db.execute('DELETE FROM messages')
296 return
297- count = 0
298 detail = self._get_detail(filters)
299 ids = []
300 query = 'SELECT rowid,account FROM accounts'
301 for row in self._get_accounts(query, filters):
302- count += 1
303 if detail is not None:
304 yield self._detail(row[1:], detail)
305 ids.append(row[0])
306 if len(ids) == MAXIMUM_PARAMETERS:
307 self._delete_accounts(ids)
308 ids = []
309- if count == 0:
310- raise burrow.backend.NotFound()
311 if len(ids) > 0:
312 self._delete_accounts(ids)
313
314@@ -103,29 +102,19 @@
315 query = 'DELETE FROM accounts WHERE rowid IN '
316 self.db.execute(query + query_values, ids)
317
318- def _get_detail(self, filters, default=None):
319- detail = filters.get('detail', default)
320- if detail == 'none':
321- detail = None
322- elif detail is not None and detail not in ['id', 'all']:
323- raise burrow.backend.BadDetail(detail)
324- return detail
325-
326 def _detail(self, row, detail):
327 if detail == 'id':
328 return row[0]
329- return dict(id=row[0])
330+ elif detail == 'all':
331+ return dict(id=row[0])
332+ return None
333
334 def get_accounts(self, filters={}):
335- count = 0
336 detail = self._get_detail(filters, 'id')
337 query = 'SELECT account FROM accounts'
338 for row in self._get_accounts(query, filters):
339- count += 1
340 if detail is not None:
341 yield self._detail(row, detail)
342- if count == 0:
343- raise burrow.backend.NotFound()
344
345 def _get_accounts(self, query, filters):
346 values = tuple()
347@@ -141,31 +130,32 @@
348 if limit is not None:
349 query += ' LIMIT ?'
350 values += (limit,)
351- return self.db.execute(query, values)
352+ count = 0
353+ for row in self.db.execute(query, values):
354+ count += 1
355+ yield row
356+ if count == 0:
357+ raise burrow.backend.NotFound()
358
359 def _get_account(self, account):
360 query = 'SELECT rowid FROM accounts WHERE account=?'
361- account_rowid = self.db.execute(query, (account,)).fetchall()
362- if len(account_rowid) == 0:
363+ rows = self.db.execute(query, (account,)).fetchall()
364+ if len(rows) == 0:
365 raise burrow.backend.NotFound()
366- return account_rowid[0][0]
367+ return rows[0][0]
368
369 def delete_queues(self, account, filters={}):
370 account_rowid = self._get_account(account)
371- count = 0
372 detail = self._get_detail(filters)
373 ids = []
374 query = 'SELECT rowid,queue FROM queues'
375 for row in self._get_queues(query, account_rowid, filters):
376- count += 1
377 if detail is not None:
378 yield self._detail(row[1:], detail)
379 ids.append(row[0])
380 if len(ids) == MAXIMUM_PARAMETERS:
381 self._delete_queues(ids)
382 ids = []
383- if count == 0:
384- raise burrow.backend.NotFound()
385 if len(ids) > 0:
386 self._delete_queues(ids)
387 self._check_empty_account(account_rowid)
388@@ -186,15 +176,11 @@
389
390 def get_queues(self, account, filters={}):
391 account_rowid = self._get_account(account)
392- count = 0
393 detail = self._get_detail(filters, 'id')
394 query = 'SELECT queue FROM queues'
395 for row in self._get_queues(query, account_rowid, filters):
396- count += 1
397 if detail is not None:
398 yield self._detail(row, detail)
399- if count == 0:
400- raise burrow.backend.NotFound()
401
402 def _get_queues(self, query, account_rowid, filters):
403 query += ' WHERE account=?'
404@@ -211,32 +197,33 @@
405 if limit is not None:
406 query += ' LIMIT ?'
407 values += (limit,)
408- return self.db.execute(query, values)
409+ count = 0
410+ for row in self.db.execute(query, values):
411+ count += 1
412+ yield row
413+ if count == 0:
414+ raise burrow.backend.NotFound()
415
416 def _get_queue(self, account_rowid, queue):
417 query = 'SELECT rowid FROM queues WHERE account=? AND queue=?'
418- queue_rowid = self.db.execute(query, (account_rowid, queue)).fetchall()
419- if len(queue_rowid) == 0:
420+ rows = self.db.execute(query, (account_rowid, queue)).fetchall()
421+ if len(rows) == 0:
422 raise burrow.backend.NotFound()
423- return queue_rowid[0][0]
424+ return rows[0][0]
425
426 def delete_messages(self, account, queue, filters={}):
427 account_rowid = self._get_account(account)
428 queue_rowid = self._get_queue(account_rowid, queue)
429- count = 0
430 detail = self._get_message_detail(filters)
431 ids = []
432 query = 'SELECT rowid,message,ttl,hide,body FROM messages'
433 for row in self._get_messages(query, queue_rowid, filters):
434- count += 1
435 if detail is not None:
436 yield self._message_detail(row[1:], detail)
437 ids.append(row[0])
438 if len(ids) == MAXIMUM_PARAMETERS:
439 self._delete_messages(ids)
440 ids = []
441- if count == 0:
442- raise burrow.backend.NotFound()
443 if len(ids) > 0:
444 self._delete_messages(ids)
445 self._check_empty_queue(account_rowid, queue_rowid)
446@@ -253,15 +240,6 @@
447 self.db.execute('DELETE FROM queues WHERE rowid=?', (queue_rowid,))
448 self._check_empty_account(account_rowid)
449
450- def _get_message_detail(self, filters, default=None):
451- detail = filters.get('detail', default)
452- options = ['id', 'attributes', 'body', 'all']
453- if detail == 'none':
454- detail = None
455- elif detail is not None and detail not in options:
456- raise burrow.backend.BadDetail(detail)
457- return detail
458-
459 def _message_detail(self, row, detail):
460 if detail == 'id':
461 return row[0]
462@@ -275,20 +253,18 @@
463 hide -= int(time.time())
464 if detail == 'attributes':
465 return dict(id=row[0], ttl=ttl, hide=hide)
466- return dict(id=row[0], ttl=ttl, hide=hide, body=str(row[3]))
467+ elif detail == 'all':
468+ return dict(id=row[0], ttl=ttl, hide=hide, body=str(row[3]))
469+ return None
470
471 def get_messages(self, account, queue, filters={}):
472 account_rowid = self._get_account(account)
473 queue_rowid = self._get_queue(account_rowid, queue)
474- count = 0
475 detail = self._get_message_detail(filters, 'all')
476 query = 'SELECT message,ttl,hide,body FROM messages'
477 for row in self._get_messages(query, queue_rowid, filters):
478- count += 1
479 if detail is not None:
480 yield self._message_detail(row, detail)
481- if count == 0:
482- raise burrow.backend.NotFound()
483
484 def _get_messages(self, query, queue_rowid, filters):
485 query += ' WHERE queue=?'
486@@ -308,32 +284,35 @@
487 if limit is not None:
488 query += ' LIMIT ?'
489 values += (limit,)
490- return self.db.execute(query, values)
491-
492- def _get_message(self, queue_rowid, message):
493- query = 'SELECT rowid FROM messages WHERE queue=? AND message=?'
494- values = (queue_rowid, message)
495- message_rowid = self.db.execute(query, values).fetchall()
496- if len(message_rowid) == 0:
497- raise burrow.backend.NotFound()
498- return message_rowid[0][0]
499-
500- def update_messages(self, account, queue, attributes={}, filters={}):
501+ count = 0
502+ for row in self.db.execute(query, values):
503+ count += 1
504+ yield row
505+ if count == 0:
506+ raise burrow.backend.NotFound()
507+
508+ def _get_message(self, queue_rowid, message, full=False):
509+ if full:
510+ query = 'SELECT rowid,message,ttl,hide,body'
511+ else:
512+ query = 'SELECT rowid'
513+ query += ' FROM messages WHERE queue=? AND message=?'
514+ rows = self.db.execute(query, (queue_rowid, message)).fetchall()
515+ if len(rows) == 0:
516+ raise burrow.backend.NotFound()
517+ if full:
518+ return rows[0]
519+ return rows[0][0]
520+
521+ def update_messages(self, account, queue, attributes, filters={}):
522 account_rowid = self._get_account(account)
523 queue_rowid = self._get_queue(account_rowid, queue)
524- count = 0
525 detail = self._get_message_detail(filters)
526 ids = []
527 notify = False
528- ttl = attributes.get('ttl', None)
529- if ttl is not None and ttl > 0:
530- ttl += int(time.time())
531- hide = attributes.get('hide', None)
532- if hide is not None and hide > 0:
533- hide += int(time.time())
534+ ttl, hide = self._get_attributes(attributes)
535 query = 'SELECT rowid,message,ttl,hide,body FROM messages'
536 for row in self._get_messages(query, queue_rowid, filters):
537- count += 1
538 if detail is not None:
539 row = list(row)
540 if ttl is not None:
541@@ -346,8 +325,6 @@
542 if self._update_messages(ttl, hide, ids):
543 notify = True
544 ids = []
545- if count == 0:
546- raise burrow.backend.NotFound()
547 if len(ids) > 0:
548 if self._update_messages(ttl, hide, ids):
549 notify = True
550@@ -373,6 +350,7 @@
551 return True
552
553 def create_message(self, account, queue, message, body, attributes={}):
554+ ttl, hide = self._get_attributes(attributes, ttl=0, hide=0)
555 try:
556 account_rowid = self._get_account(account)
557 except burrow.backend.NotFound:
558@@ -381,122 +359,89 @@
559 try:
560 queue_rowid = self._get_queue(account_rowid, queue)
561 except burrow.backend.NotFound:
562- query = 'INSERT INTO queues VALUES (?, ?)'
563+ query = 'INSERT INTO queues VALUES (?,?)'
564 values = (account_rowid, queue)
565 queue_rowid = self.db.execute(query, values).lastrowid
566- ttl = attributes.get('ttl', 0)
567- if ttl > 0:
568- ttl += int(time.time())
569- hide = attributes.get('hide', 0)
570- if hide > 0:
571- hide += int(time.time())
572- query = 'SELECT rowid FROM messages WHERE queue=? AND message=?'
573- values = (queue_rowid, message)
574- message_rowid = self.db.execute(query, values).fetchall()
575- if len(message_rowid) == 0:
576+ try:
577+ message_rowid = self._get_message(queue_rowid, message)
578+ query = 'UPDATE messages SET ttl=?,hide=?,body=? WHERE rowid=?'
579+ self.db.execute(query, (ttl, hide, body, message_rowid))
580+ created = False
581+ except burrow.backend.NotFound:
582 query = 'INSERT INTO messages VALUES (?,?,?,?,?)'
583 self.db.execute(query, (queue_rowid, message, ttl, hide, body))
584- self.notify(account, queue)
585- return True
586- query = 'UPDATE messages SET ttl=?,hide=?,body=? WHERE rowid=?'
587- self.db.execute(query, (ttl, hide, body, message_rowid[0][0]))
588- if hide == 0:
589- self.notify(account, queue)
590- return False
591+ created = True
592+ if created or hide == 0:
593+ self.notify(account, queue)
594+ return created
595
596- def delete_message(self, account, queue, message):
597+ def delete_message(self, account, queue, message, filters={}):
598 account_rowid = self._get_account(account)
599 queue_rowid = self._get_queue(account_rowid, queue)
600- message_rowid = self._get_message(queue_rowid, message)
601- message = self.get_message(account, queue, message)
602- self.db.execute('DELETE FROM messages WHERE rowid=?', (message_rowid,))
603+ row = self._get_message(queue_rowid, message, True)
604+ detail = self._get_message_detail(filters)
605+ self.db.execute('DELETE FROM messages WHERE rowid=?', (row[0],))
606 self._check_empty_queue(account_rowid, queue_rowid)
607- return message
608-
609- def get_message(self, account, queue, message):
610- queue_rowid = self._get_queue(self._get_account(account), queue)
611- query = 'SELECT message,ttl,hide,body FROM messages ' \
612- 'WHERE queue=? AND message=?'
613- result = self.db.execute(query, (queue_rowid, message)).fetchall()
614- if len(result) == 0:
615- raise burrow.backend.NotFound()
616- row = result[0]
617- ttl = row[1]
618- if ttl > 0:
619- ttl -= int(time.time())
620- hide = row[2]
621- if hide > 0:
622- hide -= int(time.time())
623- return dict(id=row[0], ttl=ttl, hide=hide, body=str(row[3]))
624-
625- def update_message(self, account, queue, message, attributes):
626- queue_rowid = self._get_queue(self._get_account(account), queue)
627- message = self.get_message(account, queue, message)
628- if message is None:
629- raise burrow.backend.NotFound()
630- query = 'UPDATE messages SET'
631- values = tuple()
632- comma = ''
633- ttl = attributes.get('ttl', None)
634+ return self._message_detail(row[1:], detail)
635+
636+ def get_message(self, account, queue, message, filters={}):
637+ queue_rowid = self._get_queue(self._get_account(account), queue)
638+ row = self._get_message(queue_rowid, message, True)
639+ detail = self._get_message_detail(filters, 'all')
640+ return self._message_detail(row[1:], detail)
641+
642+ def update_message(self, account, queue, message, attributes, filters={}):
643+ queue_rowid = self._get_queue(self._get_account(account), queue)
644+ row = self._get_message(queue_rowid, message, True)
645+ detail = self._get_message_detail(filters)
646+ ttl, hide = self._get_attributes(attributes)
647+ if self._update_messages(ttl, hide, [row[0]]):
648+ self.notify(account, queue)
649+ row = list(row)
650 if ttl is not None:
651- message['ttl'] = ttl
652- if ttl > 0:
653- ttl += int(time.time())
654- query += comma + ' ttl=?'
655- values += (ttl,)
656- comma = ','
657- hide = attributes.get('hide', None)
658+ row[2] = ttl
659 if hide is not None:
660- message['hide'] = hide
661- if hide > 0:
662- hide += int(time.time())
663- query += comma + ' hide=?'
664- values += (hide,)
665- comma = ','
666- if comma == '':
667- return message
668- query += ' WHERE queue=? AND message=?'
669- values += (queue_rowid, message['id'])
670- self.db.execute(query, values)
671- if hide == 0:
672- self.notify(account, queue)
673- return message
674+ row[3] = hide
675+ return self._message_detail(row[1:], detail)
676
677 def clean(self):
678 now = int(time.time())
679- query = 'SELECT rowid,queue FROM messages ' \
680- 'WHERE ttl > 0 AND ttl <= ?'
681- result = self.db.execute(query, (now,)).fetchall()
682- if len(result) > 0:
683- messages = []
684- queues = []
685- for row in result:
686- messages.append(str(row[0]))
687- queues.append(row[1])
688- query = 'DELETE FROM messages WHERE rowid in (%s)' % \
689- ','.join(messages)
690- self.db.execute(query)
691- for queue_rowid in queues:
692- query = 'SELECT account FROM queues WHERE rowid=?'
693- account_rowid = self.db.execute(query, (queue_rowid,))
694- account_rowid = account_rowid.fetchall()[0][0]
695- self._check_empty_queue(account_rowid, queue_rowid)
696- query = "SELECT rowid,queue FROM messages WHERE " \
697- "hide > 0 AND hide <= %d" % now
698- result = self.db.execute(query).fetchall()
699- if len(result) > 0:
700- messages = []
701- queues = []
702- for row in result:
703- messages.append(str(row[0]))
704- queues.append(row[1])
705- query = 'UPDATE messages SET hide=0 WHERE rowid in (%s)' % \
706- ','.join(messages)
707- self.db.execute(query)
708- for queue in queues:
709- query = 'SELECT accounts.account,queues.queue ' \
710- 'FROM queues JOIN accounts ' \
711- 'ON queues.account=accounts.rowid ' \
712- 'WHERE queues.rowid=?'
713- result = self.db.execute(query, (queue,)).fetchall()[0]
714- self.notify(result[0], result[1])
715+ query = 'SELECT rowid,queue FROM messages WHERE ttl > 0 AND ttl <= ?'
716+ messages = []
717+ queues = set()
718+ message_query = 'DELETE FROM messages WHERE rowid IN '
719+ message_query_values = '(?' + (',?' * (MAXIMUM_PARAMETERS - 1)) + ')'
720+ for row in self.db.execute(query, (now,)):
721+ messages.append(row[0])
722+ if len(messages) == MAXIMUM_PARAMETERS:
723+ self.db.execute(message_query + message_query_values, messages)
724+ messages = []
725+ queues.add(row[1])
726+ if len(messages) > 0:
727+ message_query_values = '(?' + (',?' * (len(messages) - 1)) + ')'
728+ self.db.execute(message_query + message_query_values, messages)
729+ for queue in queues:
730+ query = 'SELECT account FROM queues WHERE rowid=?'
731+ account = self.db.execute(query, (queue,)).fetchall()[0][0]
732+ self._check_empty_queue(account, queue)
733+ query = 'SELECT rowid,queue FROM messages WHERE hide > 0 AND hide <= ?'
734+ messages = []
735+ queues = set()
736+ message_query = 'UPDATE messages SET hide=0 WHERE rowid IN '
737+ message_query_values = '(?' + (',?' * (MAXIMUM_PARAMETERS - 1)) + ')'
738+ for row in self.db.execute(query, (now,)):
739+ messages.append(row[0])
740+ if len(messages) == MAXIMUM_PARAMETERS:
741+ self.db.execute(message_query + message_query_values, messages)
742+ messages = []
743+ queues.add(row[1])
744+ if len(messages) > 0:
745+ message_query_values = '(?' + (',?' * (len(messages) - 1)) + ')'
746+ self.db.execute(message_query + message_query_values, messages)
747+ for queue in queues:
748+ query = 'SELECT accounts.account,queues.queue ' \
749+ 'FROM queues JOIN accounts ' \
750+ 'ON queues.account=accounts.rowid ' \
751+ 'WHERE queues.rowid=?'
752+ result = self.db.execute(query, (queue,)).fetchall()[0]
753+ self.notify(result[0], result[1])
754
755=== modified file 'burrow/frontend/wsgi.py'
756--- burrow/frontend/wsgi.py 2011-08-09 08:05:39 +0000
757+++ burrow/frontend/wsgi.py 2011-08-09 23:35:51 +0000
758@@ -172,29 +172,34 @@
759
760 @webob.dec.wsgify
761 def _delete_message(self, req, account, queue, message):
762+ filters = self._parse_filters(req)
763 try:
764- message = self.backend.delete_message(account, queue, message)
765+ message = self.backend.delete_message(account, queue, message,
766+ filters)
767 except burrow.backend.NotFound:
768 return self._response(status=404)
769- return self._return_message(req, account, queue, message, 'none')
770+ return self._response(body=message)
771
772 @webob.dec.wsgify
773 def _get_message(self, req, account, queue, message):
774+ filters = self._parse_filters(req)
775 try:
776- message = self.backend.get_message(account, queue, message)
777+ message = self.backend.get_message(account, queue, message,
778+ filters)
779 except burrow.backend.NotFound:
780 return self._response(status=404)
781- return self._return_message(req, account, queue, message, 'all')
782+ return self._response(body=message)
783
784 @webob.dec.wsgify
785 def _post_message(self, req, account, queue, message):
786 attributes = self._parse_attributes(req)
787+ filters = self._parse_filters(req)
788 try:
789 message = self.backend.update_message(account, queue, message,
790- attributes)
791+ attributes, filters)
792 except burrow.backend.NotFound:
793 return self._response(status=404)
794- return self._return_message(req, account, queue, message, 'id')
795+ return self._response(body=message)
796
797 @webob.dec.wsgify
798 def _put_message(self, req, account, queue, message):
799@@ -208,28 +213,6 @@
800 return self._response(status=201)
801 return self._response()
802
803- def _filter_message(self, detail, message):
804- if detail == 'id':
805- return dict(id=message['id'])
806- elif detail == 'attributes':
807- message = message.copy()
808- del message['body']
809- return message
810- elif detail == 'all':
811- return message
812- return None
813-
814- def _return_message(self, req, account, queue, message, detail):
815- if 'detail' in req.params:
816- detail = req.params['detail']
817- if detail == 'body':
818- return self._response(body=message['body'],
819- content_type="application/octet-stream")
820- message = self._filter_message(detail, message)
821- if message is not None:
822- return self._response(body=message)
823- return self._response()
824-
825 def _parse_filters(self, req):
826 filters = {}
827 if 'limit' in req.params:
828@@ -272,7 +255,10 @@
829 status = 204
830 else:
831 if content_type is None:
832- content_type = 'application/json'
833+ if isinstance(body, list) or isinstance(body, dict):
834+ content_type = 'application/json'
835+ else:
836+ content_type = "application/octet-stream"
837 if content_type == 'application/json':
838 body = json.dumps(body, indent=2)
839 return webob.Response(status=status, body=body,
840
841=== modified file 'etc/burrowd.conf'
842--- etc/burrowd.conf 2011-04-22 02:18:26 +0000
843+++ etc/burrowd.conf 2011-08-09 23:35:51 +0000
844@@ -29,6 +29,10 @@
845 # Database file to use, passed to sqlite3.connect.
846 database = :memory:
847
848+# Synchronous mode to set for SQLite. Current options are: 'OFF', 'ON', 'FULL'
849+# See the SQLite PRAGMA documentation for more information on this setting.
850+synchronous = FULL
851+
852
853 [burrow.backend.http]
854
855
856=== modified file 'test/backend/test_memory.py'
857--- test/backend/test_memory.py 2011-08-08 20:04:40 +0000
858+++ test/backend/test_memory.py 2011-08-09 23:35:51 +0000
859@@ -13,6 +13,7 @@
860 # limitations under the License.
861
862 import ConfigParser
863+import time
864 import unittest
865
866 import burrow.backend
867@@ -21,27 +22,23 @@
868
869 class TestMemory(unittest.TestCase):
870 '''Unittests for the memory backend.'''
871- backend_class = burrow.backend.memory.Backend
872
873 def setUp(self):
874 config = (ConfigParser.ConfigParser(), 'test')
875- self.backend = self.backend_class(config)
876- accounts = self.backend.get_accounts()
877- self.assertRaises(burrow.backend.NotFound, list, accounts)
878- queues = self.backend.get_queues('a')
879- self.assertRaises(burrow.backend.NotFound, list, queues)
880- filters = dict(match_hidden=True)
881- messages = self.backend.get_messages('a', 'q', filters)
882- self.assertRaises(burrow.backend.NotFound, list, messages)
883+ self.backend = burrow.backend.memory.Backend(config)
884+ self.check_empty()
885
886 def tearDown(self):
887+ self.check_empty()
888+
889+ def check_empty(self):
890+ accounts = self.backend.get_accounts()
891+ self.assertRaises(burrow.backend.NotFound, list, accounts)
892+ queues = self.backend.get_queues('a')
893+ self.assertRaises(burrow.backend.NotFound, list, queues)
894 filters = dict(match_hidden=True)
895 messages = self.backend.get_messages('a', 'q', filters)
896 self.assertRaises(burrow.backend.NotFound, list, messages)
897- queues = self.backend.get_queues('a')
898- self.assertRaises(burrow.backend.NotFound, list, queues)
899- accounts = self.backend.get_accounts()
900- self.assertRaises(burrow.backend.NotFound, list, accounts)
901
902 def test_accounts(self):
903 self.backend.create_message('a', 'q', 'm', 'test')
904@@ -50,6 +47,12 @@
905 accounts = self.backend.delete_accounts()
906 self.assertRaises(burrow.backend.NotFound, list, accounts)
907
908+ def test_accounts_large(self):
909+ for x in xrange(0, 1000):
910+ self.backend.create_message(str(x), str(x), str(x), str(x))
911+ filters = dict(marker='unknown')
912+ self.assertEquals([], list(self.backend.delete_accounts(filters)))
913+
914 def test_accounts_delete_detail_all(self):
915 self.backend.create_message('a', 'q', 'm', 'test')
916 filters = dict(detail='all')
917@@ -206,6 +209,12 @@
918 queues = self.backend.delete_queues('a')
919 self.assertRaises(burrow.backend.NotFound, list, queues)
920
921+ def test_queues_large(self):
922+ for x in xrange(0, 1000):
923+ self.backend.create_message('a', str(x), str(x), str(x))
924+ filters = dict(marker='unknown')
925+ self.assertEquals([], list(self.backend.delete_queues('a', filters)))
926+
927 def test_queues_delete_detail_all(self):
928 self.backend.create_message('a', 'q', 'm', 'test')
929 filters = dict(detail='all')
930@@ -363,12 +372,26 @@
931 attributes = dict(ttl=100, hide=200)
932 messages = list(self.backend.update_messages('a', 'q', attributes))
933 self.assertEquals([], messages)
934+ attributes = dict(ttl=0, hide=0)
935+ filters = dict(match_hidden=True)
936+ messages = self.backend.update_messages('a', 'q', attributes, filters)
937+ self.assertEquals([], list(messages))
938+ messages = self.backend.update_messages('a', 'q', dict(), filters)
939+ self.assertEquals([], list(messages))
940 self.delete_messages()
941 messages = self.backend.delete_messages('a', 'q')
942 self.assertRaises(burrow.backend.NotFound, list, messages)
943 messages = self.backend.update_messages('a', 'q', attributes)
944 self.assertRaises(burrow.backend.NotFound, list, messages)
945
946+ def test_messages_large(self):
947+ for x in xrange(0, 1000):
948+ self.backend.create_message('a', 'q', str(x), str(x))
949+ attributes = dict(ttl=100, hide=200)
950+ messages = self.backend.update_messages('a', 'q', attributes)
951+ self.assertEquals([], list(messages))
952+ self.delete_messages()
953+
954 def test_messages_delete_detail_all(self):
955 self.backend.create_message('a', 'q', 'm', 'test')
956 message = dict(id='m', ttl=0, hide=0, body='test')
957@@ -661,6 +684,206 @@
958 self.assertEquals(messages[1:3], list(messages2))
959 self.delete_messages()
960
961+ def test_message(self):
962+ self.backend.create_message('a', 'q', 'm', 'test')
963+ message = self.backend.get_message('a', 'q', 'm')
964+ self.assertEquals(dict(id='m', ttl=0, hide=0, body='test'), message)
965+ attributes = dict(ttl=100, hide=200)
966+ message = self.backend.update_message('a', 'q', 'm', attributes)
967+ attributes = dict(ttl=0, hide=0)
968+ message = self.backend.update_message('a', 'q', 'm', attributes)
969+ self.assertEquals(None, message)
970+ message = self.backend.update_message('a', 'q', 'm', dict())
971+ self.assertEquals(None, message)
972+ message = self.backend.delete_message('a', 'q', 'm')
973+ self.assertEquals(None, message)
974+
975+ def test_message_create(self):
976+ created = self.backend.create_message('a', 'q', 'm', 'test1')
977+ self.assertEquals(created, True)
978+ message = self.backend.get_message('a', 'q', 'm')
979+ self.assertEquals(dict(id='m', ttl=0, hide=0, body='test1'), message)
980+ attributes = dict(ttl=100, hide=200)
981+ created = self.backend.create_message('a', 'q', 'm', 'test2',
982+ attributes)
983+ self.assertEquals(created, False)
984+ message = self.backend.get_message('a', 'q', 'm')
985+ self.assertEquals(dict(id='m', ttl=100, hide=200, body='test2'),
986+ message)
987+ attributes = dict(ttl=0, hide=0)
988+ created = self.backend.create_message('a', 'q', 'm', 'test3',
989+ attributes)
990+ self.assertEquals(created, False)
991+ message = self.backend.get_message('a', 'q', 'm')
992+ self.assertEquals(dict(id='m', ttl=0, hide=0, body='test3'), message)
993+
994+ self.delete_messages()
995+
996+ def test_message_delete_detail_all(self):
997+ self.backend.create_message('a', 'q', 'm', 'test')
998+ filters = dict(detail='all')
999+ message = self.backend.delete_message('a', 'q', 'm', filters)
1000+ self.assertEquals(dict(id='m', ttl=0, hide=0, body='test'), message)
1001+
1002+ def test_message_delete_detail_attributes(self):
1003+ self.backend.create_message('a', 'q', 'm', 'test')
1004+ filters = dict(detail='attributes')
1005+ message = self.backend.delete_message('a', 'q', 'm', filters)
1006+ self.assertEquals(dict(id='m', ttl=0, hide=0), message)
1007+
1008+ def test_message_delete_detail_body(self):
1009+ self.backend.create_message('a', 'q', 'm', 'test')
1010+ filters = dict(detail='body')
1011+ message = self.backend.delete_message('a', 'q', 'm', filters)
1012+ self.assertEquals('test', message)
1013+
1014+ def test_message_delete_detail_id(self):
1015+ self.backend.create_message('a', 'q', 'm', 'test')
1016+ filters = dict(detail='id')
1017+ message = self.backend.delete_message('a', 'q', 'm', filters)
1018+ self.assertEquals('m', message)
1019+
1020+ def test_message_delete_detail_none(self):
1021+ self.backend.create_message('a', 'q', 'm', 'test')
1022+ filters = dict(detail='none')
1023+ message = self.backend.delete_message('a', 'q', 'm', filters)
1024+ self.assertEquals(None, message)
1025+
1026+ def test_message_delete_detail_bad(self):
1027+ self.backend.create_message('a', 'q', 'm', 'test')
1028+ filters = dict(detail='bad')
1029+ self.assertRaises(burrow.backend.BadDetail,
1030+ self.backend.delete_message, 'a', 'q', 'm', filters)
1031+ self.delete_messages()
1032+
1033+ def test_message_get_detail_all(self):
1034+ self.backend.create_message('a', 'q', 'm', 'test')
1035+ filters = dict(detail='all')
1036+ message = self.backend.get_message('a', 'q', 'm', filters)
1037+ self.assertEquals(dict(id='m', ttl=0, hide=0, body='test'), message)
1038+ self.delete_messages()
1039+
1040+ def test_message_get_detail_attributes(self):
1041+ self.backend.create_message('a', 'q', 'm', 'test')
1042+ filters = dict(detail='attributes')
1043+ message = self.backend.get_message('a', 'q', 'm', filters)
1044+ self.assertEquals(dict(id='m', ttl=0, hide=0), message)
1045+ self.delete_messages()
1046+
1047+ def test_message_get_detail_body(self):
1048+ self.backend.create_message('a', 'q', 'm', 'test')
1049+ filters = dict(detail='body')
1050+ message = self.backend.get_message('a', 'q', 'm', filters)
1051+ self.assertEquals('test', message)
1052+ self.delete_messages()
1053+
1054+ def test_message_get_detail_id(self):
1055+ self.backend.create_message('a', 'q', 'm', 'test')
1056+ filters = dict(detail='id')
1057+ message = self.backend.get_message('a', 'q', 'm', filters)
1058+ self.assertEquals('m', message)
1059+ self.delete_messages()
1060+
1061+ def test_message_get_detail_none(self):
1062+ self.backend.create_message('a', 'q', 'm', 'test')
1063+ filters = dict(detail='none')
1064+ message = self.backend.get_message('a', 'q', 'm', filters)
1065+ self.assertEquals(None, message)
1066+ self.delete_messages()
1067+
1068+ def test_message_get_detail_bad(self):
1069+ self.backend.create_message('a', 'q', 'm', 'test')
1070+ filters = dict(detail='bad')
1071+ self.assertRaises(burrow.backend.BadDetail,
1072+ self.backend.get_message, 'a', 'q', 'm', filters)
1073+ self.delete_messages()
1074+
1075+ def test_message_update_detail_all(self):
1076+ self.backend.create_message('a', 'q', 'm', 'test')
1077+ attributes = dict(ttl=100, hide=200)
1078+ filters = dict(detail='all')
1079+ message = self.backend.update_message('a', 'q', 'm', attributes,
1080+ filters)
1081+ self.assertEquals(dict(id='m', ttl=100, hide=200, body='test'),
1082+ message)
1083+ self.delete_messages()
1084+
1085+ def test_message_update_detail_attributes(self):
1086+ self.backend.create_message('a', 'q', 'm', 'test')
1087+ attributes = dict(ttl=100, hide=200)
1088+ filters = dict(detail='attributes')
1089+ message = self.backend.update_message('a', 'q', 'm', attributes,
1090+ filters)
1091+ self.assertEquals(dict(id='m', ttl=100, hide=200), message)
1092+ self.delete_messages()
1093+
1094+ def test_message_update_detail_body(self):
1095+ self.backend.create_message('a', 'q', 'm', 'test')
1096+ attributes = dict(ttl=100, hide=200)
1097+ filters = dict(detail='body')
1098+ message = self.backend.update_message('a', 'q', 'm', attributes,
1099+ filters)
1100+ self.assertEquals('test', message)
1101+ self.delete_messages()
1102+
1103+ def test_message_update_detail_id(self):
1104+ self.backend.create_message('a', 'q', 'm', 'test')
1105+ attributes = dict(ttl=100, hide=200)
1106+ filters = dict(detail='id')
1107+ message = self.backend.update_message('a', 'q', 'm', attributes,
1108+ filters)
1109+ self.assertEquals('m', message)
1110+ self.delete_messages()
1111+
1112+ def test_message_update_detail_none(self):
1113+ self.backend.create_message('a', 'q', 'm', 'test')
1114+ attributes = dict(ttl=100, hide=200)
1115+ filters = dict(detail='none')
1116+ message = self.backend.update_message('a', 'q', 'm', attributes,
1117+ filters)
1118+ self.assertEquals(None, message)
1119+ self.delete_messages()
1120+
1121+ def test_message_update_detail_bad(self):
1122+ self.backend.create_message('a', 'q', 'm', 'test')
1123+ attributes = dict(ttl=100, hide=200)
1124+ filters = dict(detail='bad')
1125+ self.assertRaises(burrow.backend.BadDetail,
1126+ self.backend.update_message, 'a', 'q', 'm', attributes, filters)
1127+ self.delete_messages()
1128+
1129+ def test_message_ttl(self):
1130+ attributes = dict(ttl=1)
1131+ self.backend.create_message('a', 'q', 'm', 'test', attributes)
1132+ time.sleep(1)
1133+ self.backend.clean()
1134+
1135+ def test_message_ttl_large(self):
1136+ attributes = dict(ttl=1)
1137+ for x in xrange(0, 1000):
1138+ self.backend.create_message('a', 'q', str(x), str(x), attributes)
1139+ time.sleep(1)
1140+ self.backend.clean()
1141+
1142+ def test_message_hide(self):
1143+ attributes = dict(hide=1)
1144+ self.backend.create_message('a', 'q', 'm', 'test', attributes)
1145+ time.sleep(1)
1146+ self.backend.clean()
1147+ message = self.backend.get_message('a', 'q', 'm')
1148+ self.assertEquals(dict(id='m', ttl=0, hide=0, body='test'), message)
1149+ self.delete_messages()
1150+
1151+ def test_message_hide_large(self):
1152+ attributes = dict(hide=1)
1153+ for x in xrange(0, 1000):
1154+ self.backend.create_message('a', 'q', str(x), str(x), attributes)
1155+ time.sleep(1)
1156+ self.backend.clean()
1157+ message = self.backend.get_message('a', 'q', '0')
1158+ self.assertEquals(dict(id='0', ttl=0, hide=0, body='0'), message)
1159+ self.delete_messages()
1160+
1161 def delete_messages(self):
1162 filters = dict(match_hidden=True)
1163 messages = list(self.backend.delete_messages('a', 'q', filters))
1164
1165=== modified file 'test/backend/test_sqlite.py'
1166--- test/backend/test_sqlite.py 2011-07-22 18:24:23 +0000
1167+++ test/backend/test_sqlite.py 2011-08-09 23:35:51 +0000
1168@@ -12,10 +12,38 @@
1169 # See the License for the specific language governing permissions and
1170 # limitations under the License.
1171
1172+import ConfigParser
1173+import os
1174+
1175 import burrow.backend.sqlite
1176 import test.backend.test_memory
1177
1178
1179 class TestSQLite(test.backend.test_memory.TestMemory):
1180- '''Unittests for the SQLite backend.'''
1181- backend_class = burrow.backend.sqlite.Backend
1182+ '''Unittests for the memory-based SQLite backend.'''
1183+
1184+ def setUp(self):
1185+ config = (ConfigParser.ConfigParser(), 'test')
1186+ self.backend = burrow.backend.sqlite.Backend(config)
1187+ self.check_empty()
1188+
1189+
1190+class TestSQLiteFile(test.backend.test_memory.TestMemory):
1191+ '''Unittests for the file-based SQLite backend.'''
1192+
1193+ def setUp(self):
1194+ try:
1195+ os.unlink('TestSQLiteFile.db')
1196+ except OSError:
1197+ pass
1198+ config = ConfigParser.ConfigParser()
1199+ config.add_section('test')
1200+ config.set('test', 'url', 'sqlite://TestSQLiteFile.db')
1201+ config.set('test', 'synchronous', 'OFF')
1202+ config = (config, 'test')
1203+ self.backend = burrow.backend.sqlite.Backend(config)
1204+ self.check_empty()
1205+
1206+ def tearDown(self):
1207+ self.check_empty()
1208+ os.unlink('TestSQLiteFile.db')
1209
1210=== modified file 'test/frontend/test_wsgi.py'
1211--- test/frontend/test_wsgi.py 2011-08-04 23:43:09 +0000
1212+++ test/frontend/test_wsgi.py 2011-08-09 23:35:51 +0000
1213@@ -64,8 +64,7 @@
1214 def test_message_post(self):
1215 self._put_url('/a/q/1', body='b')
1216 for x in range(0, 3):
1217- result = self._post_url('/a/q/1?ttl=%d&hide=%d' % (x, x))
1218- self.assertEquals(result, {'id': '1'})
1219+ self._post_url('/a/q/1?ttl=%d&hide=%d' % (x, x), status=204)
1220 result = self._get_url('/a/q?match_hidden=true')
1221 message = self.message('1', x, x, body='b')
1222 self.assertMessages(result, [message])
1223@@ -186,7 +185,6 @@
1224 def test_message_ttl(self):
1225 self._put_url('/a/q/1?ttl=1')
1226 result = self._get_url('/a/q/1')
1227- message = self.message('1', 1)
1228 self.assertMessages([result], [self.message('1', 1)])
1229 time.sleep(1)
1230 self.backend.clean()
1231@@ -194,7 +192,7 @@
1232 self._put_url('/a/q/1')
1233 result = self._get_url('/a/q/1')
1234 self.assertMessages([result], [self.message('1')])
1235- self._post_url('/a/q/1?ttl=1')
1236+ self._post_url('/a/q/1?ttl=1', status=204)
1237 result = self._get_url('/a/q/1')
1238 self.assertMessages([result], [self.message('1', 1)])
1239 time.sleep(1)
1240@@ -209,7 +207,7 @@
1241 self.backend.clean()
1242 result = self._get_url('/a/q/1')
1243 self.assertMessages([result], [self.message('1')])
1244- self._post_url('/a/q/1?hide=1')
1245+ self._post_url('/a/q/1?hide=1', status=204)
1246 result = self._get_url('/a/q/1')
1247 self.assertMessages([result], [self.message('1', hide=1)])
1248 time.sleep(1)
1249@@ -253,7 +251,7 @@
1250 self.success = False
1251 self._put_url('/a/q/1?hide=10')
1252 thread = eventlet.spawn(self._message_wait)
1253- eventlet.spawn_after(0.2, self._post_url, '/a/q/1?hide=0')
1254+ eventlet.spawn_after(0.2, self._post_url, '/a/q/1?hide=0', status=204)
1255 thread.wait()
1256 self.assertTrue(self.success)
1257 self._delete_url('/a/q/1')

Subscribers

People subscribed via source and target branches