Merge lp:~eday/burrow/backend-unittests into lp:burrow
- backend-unittests
- Merge into trunk
Proposed by
Eric Day
Status: | Merged |
---|---|
Approved by: | Eric Day |
Approved revision: | 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 |
Related bugs: | |
Related blueprints: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Burrow Core Team | Pending | ||
Review via email: mp+70968@code.launchpad.net |
Commit message
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') |