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: | 18 |
Merged at revision: | 19 |
Proposed branch: | lp:~eday/burrow/backend-unittests |
Merge into: | lp:burrow |
Diff against target: |
602 lines (+257/-96) 5 files modified
burrow/backend/__init__.py (+13/-9) burrow/backend/memory.py (+117/-83) burrow/backend/sqlite.py (+4/-2) burrow/frontend/wsgi.py (+2/-2) test/backend/test_memory.py (+121/-0) |
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+64260@code.launchpad.net |
Commit message
Description of the change
Added more backend unit tests, reworked memory backend to use mutable objects instead of tuples, added account filter options.
To post a comment you must log in.
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : | # |
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-04-22 02:18:26 +0000 |
3 | +++ burrow/backend/__init__.py 2011-06-13 16:44:08 +0000 |
4 | @@ -32,13 +32,13 @@ |
5 | thread_pool.spawn_n(self._clean) |
6 | |
7 | def delete_accounts(self, filters={}): |
8 | - pass |
9 | + return [] |
10 | |
11 | def get_accounts(self, filters={}): |
12 | return [] |
13 | |
14 | def delete_queues(self, account, filters={}): |
15 | - pass |
16 | + return [] |
17 | |
18 | def get_queues(self, account, filters={}): |
19 | return [] |
20 | @@ -55,13 +55,14 @@ |
21 | def create_message(self, account, queue, message, body, attributes={}): |
22 | return True |
23 | |
24 | - def delete_message(self, account, queue, message): |
25 | - return None |
26 | - |
27 | - def get_message(self, account, queue, message): |
28 | - return None |
29 | - |
30 | - def update_message(self, account, queue, message, attributes={}): |
31 | + def delete_message(self, account, queue, message, filters={}): |
32 | + return None |
33 | + |
34 | + def get_message(self, account, queue, message, filters={}): |
35 | + return None |
36 | + |
37 | + def update_message(self, account, queue, message, attributes={}, |
38 | + filters={}): |
39 | return None |
40 | |
41 | def notify(self, account, queue): |
42 | @@ -95,3 +96,6 @@ |
43 | while True: |
44 | self.clean() |
45 | eventlet.sleep(1) |
46 | + |
47 | +class BadDetail(Exception): |
48 | + pass |
49 | |
50 | === modified file 'burrow/backend/memory.py' |
51 | --- burrow/backend/memory.py 2011-04-24 22:47:02 +0000 |
52 | +++ burrow/backend/memory.py 2011-06-13 16:44:08 +0000 |
53 | @@ -32,18 +32,24 @@ |
54 | self.accounts = Accounts() |
55 | |
56 | def delete_accounts(self, filters={}): |
57 | - self.accounts.delete(filters) |
58 | + return self.accounts.delete(filters) |
59 | |
60 | def get_accounts(self, filters={}): |
61 | + detail = filters.get('detail', 'id') |
62 | + if detail is 'none': |
63 | + detail = None |
64 | + elif detail is not None and detail not in ['id', 'all']: |
65 | + raise burrow.backend.BadDetail(detail) |
66 | for account in self.accounts.iter(filters): |
67 | - yield account[0] |
68 | + if detail is not None: |
69 | + yield account.name |
70 | |
71 | def delete_queues(self, account, filters={}): |
72 | - self.accounts.delete_queues(account, filters) |
73 | + return self.accounts.delete_queues(account, filters) |
74 | |
75 | def get_queues(self, account, filters={}): |
76 | - for queue in self.accounts.iter_queues(account, filters): |
77 | - yield queue[0] |
78 | + for queue in self.accounts.get_queues(account, filters): |
79 | + yield queue.name |
80 | |
81 | def delete_messages(self, account, queue, filters={}): |
82 | return self._scan_queue(account, queue, filters, delete=True) |
83 | @@ -62,30 +68,30 @@ |
84 | hide = attributes.get('hide', 0) |
85 | if hide > 0: |
86 | hide += int(time.time()) |
87 | - for index in xrange(0, len(queue[3])): |
88 | - if queue[3][index]['id'] == message: |
89 | - message = queue[3][index] |
90 | + for index in xrange(0, len(queue.messages)): |
91 | + if queue.messages[index]['id'] == message: |
92 | + message = queue.messages[index] |
93 | message['ttl'] = ttl |
94 | message['hide'] = hide |
95 | message['body'] = body |
96 | if hide == 0: |
97 | - self.notify(account[0], queue[0]) |
98 | + self.notify(account.name, queue.name) |
99 | return False |
100 | message = dict(id=message, ttl=ttl, hide=hide, body=body) |
101 | - queue[3].append(message) |
102 | - self.notify(account[0], queue[0]) |
103 | + queue.messages.append(message) |
104 | + self.notify(account.name, queue.name) |
105 | return True |
106 | |
107 | - def delete_message(self, account, queue, message): |
108 | + def delete_message(self, account, queue, message, filters={}): |
109 | account, queue = self.accounts.get_queue(account, queue) |
110 | if queue is None: |
111 | return None |
112 | - for index in xrange(0, len(queue[3])): |
113 | - if queue[3][index]['id'] == message: |
114 | - message = queue[3][index] |
115 | - del queue[3][index] |
116 | - if len(queue[3]) == 0: |
117 | - self.accounts.delete_queue(account[0], queue[0]) |
118 | + for index in xrange(0, len(queue.messages)): |
119 | + if queue.messages[index]['id'] == message: |
120 | + message = queue.messages[index] |
121 | + del queue.messages[index] |
122 | + if len(queue.messages) == 0: |
123 | + self.accounts.delete_queue(account.name, queue.name) |
124 | if message['ttl'] > 0: |
125 | message['ttl'] -= int(time.time()) |
126 | if message['hide'] > 0: |
127 | @@ -93,23 +99,24 @@ |
128 | return message |
129 | return None |
130 | |
131 | - def get_message(self, account, queue, message): |
132 | + def get_message(self, account, queue, message, filters={}): |
133 | account, queue = self.accounts.get_queue(account, queue) |
134 | if queue is None: |
135 | return None |
136 | - for index in xrange(0, len(queue[3])): |
137 | - if queue[3][index]['id'] == message: |
138 | - ttl = queue[3][index]['ttl'] |
139 | + for index in xrange(0, len(queue.messages)): |
140 | + if queue.messages[index]['id'] == message: |
141 | + ttl = queue.messages[index]['ttl'] |
142 | if ttl > 0: |
143 | ttl -= int(time.time()) |
144 | - hide = queue[3][index]['hide'] |
145 | + hide = queue.messages[index]['hide'] |
146 | if hide > 0: |
147 | hide -= int(time.time()) |
148 | return dict(id=message, ttl=ttl, hide=hide, |
149 | - body=queue[3][index]['body']) |
150 | + body=queue.messages[index]['body']) |
151 | return None |
152 | |
153 | - def update_message(self, account, queue, message, attributes={}): |
154 | + def update_message(self, account, queue, message, attributes={}, |
155 | + filters={}): |
156 | account, queue = self.accounts.get_queue(account, queue) |
157 | if queue is None: |
158 | return None |
159 | @@ -119,29 +126,29 @@ |
160 | hide = attributes.get('hide', None) |
161 | if hide is not None and hide > 0: |
162 | hide += int(time.time()) |
163 | - for index in xrange(0, len(queue[3])): |
164 | - if queue[3][index]['id'] == message: |
165 | - message = queue[3][index] |
166 | + for index in xrange(0, len(queue.messages)): |
167 | + if queue.messages[index]['id'] == message: |
168 | + message = queue.messages[index] |
169 | if ttl is not None: |
170 | message['ttl'] = ttl |
171 | if hide is not None: |
172 | message['hide'] = hide |
173 | if hide == 0: |
174 | - self.notify(account[0], queue[0]) |
175 | + self.notify(account.name, queue.name) |
176 | return message |
177 | return None |
178 | |
179 | def clean(self): |
180 | now = int(time.time()) |
181 | for account in self.accounts.iter(): |
182 | - for queue in account[3].iter(): |
183 | + for queue in account.queues.iter(): |
184 | index = 0 |
185 | notify = False |
186 | - total = len(queue[3]) |
187 | + total = len(queue.messages) |
188 | while index < total: |
189 | - message = queue[3][index] |
190 | + message = queue.messages[index] |
191 | if 0 < message['ttl'] <= now: |
192 | - del queue[3][index] |
193 | + del queue.messages[index] |
194 | total -= 1 |
195 | else: |
196 | if 0 < message['hide'] <= now: |
197 | @@ -149,9 +156,9 @@ |
198 | notify = True |
199 | index += 1 |
200 | if notify: |
201 | - self.notify(account[0], queue[0]) |
202 | - if len(queue[3]) == 0: |
203 | - self.accounts.delete_queue(account[0], queue[0]) |
204 | + self.notify(account.name, queue.name) |
205 | + if len(queue.messages) == 0: |
206 | + self.accounts.delete_queue(account.name, queue.name) |
207 | |
208 | def _scan_queue(self, account, queue, filters, attributes={}, |
209 | delete=False): |
210 | @@ -162,8 +169,8 @@ |
211 | notify = False |
212 | if 'marker' in filters and filters['marker'] is not None: |
213 | found = False |
214 | - for index in xrange(0, len(queue[3])): |
215 | - message = queue[3][index] |
216 | + for index in xrange(0, len(queue.messages)): |
217 | + message = queue.messages[index] |
218 | if message['id'] == filters['marker']: |
219 | index += 1 |
220 | found = True |
221 | @@ -171,7 +178,7 @@ |
222 | if not found: |
223 | index = 0 |
224 | messages = [] |
225 | - total = len(queue[3]) |
226 | + total = len(queue.messages) |
227 | limit = filters.get('limit', None) |
228 | match_hidden = filters.get('match_hidden', False) |
229 | ttl = attributes.get('ttl', None) |
230 | @@ -181,7 +188,7 @@ |
231 | if hide is not None and hide > 0: |
232 | hide += int(time.time()) |
233 | while index < total: |
234 | - message = queue[3][index] |
235 | + message = queue.messages[index] |
236 | if not match_hidden and message['hide'] != 0: |
237 | index += 1 |
238 | continue |
239 | @@ -192,7 +199,7 @@ |
240 | if hide == 0: |
241 | notify = True |
242 | if delete: |
243 | - del queue[3][index] |
244 | + del queue.messages[index] |
245 | total -= 1 |
246 | else: |
247 | index += 1 |
248 | @@ -209,15 +216,22 @@ |
249 | if limit == 0: |
250 | break |
251 | if notify: |
252 | - self.notify(account[0], queue[0]) |
253 | - if len(queue[3]) == 0: |
254 | - self.accounts.delete_queue(account[0], queue[0]) |
255 | - |
256 | - |
257 | -class IndexedTupleList(object): |
258 | - '''Class for managing an indexed tuple list. The tuple must be at |
259 | - least three elements and must reserve the first three for (name, |
260 | - next, previous).''' |
261 | + self.notify(account.name, queue.name) |
262 | + if len(queue.messages) == 0: |
263 | + self.accounts.delete_queue(account.name, queue.name) |
264 | + |
265 | + |
266 | +class Item(object): |
267 | + '''Object to represent elements in a indexed linked list.''' |
268 | + |
269 | + def __init__(self, name=None): |
270 | + self.name = name |
271 | + self.next = None |
272 | + self.prev = None |
273 | + |
274 | + |
275 | +class IndexedList(object): |
276 | + '''Class for managing an indexed linked list.''' |
277 | |
278 | def __init__(self): |
279 | self.first = None |
280 | @@ -225,11 +239,13 @@ |
281 | self.index = {} |
282 | |
283 | def add(self, item): |
284 | - item = (item[0], None, self.last) + item[3:] |
285 | if self.first is None: |
286 | self.first = item |
287 | + if self.last is not None: |
288 | + item.prev = self.last |
289 | + self.last.next = item |
290 | self.last = item |
291 | - self.index[item[0]] = item |
292 | + self.index[item.name] = item |
293 | return item |
294 | |
295 | def count(self): |
296 | @@ -241,25 +257,28 @@ |
297 | self.last = None |
298 | self.index.clear() |
299 | return |
300 | + detail = filters.get('detail', None) |
301 | + if detail is 'none': |
302 | + detail = None |
303 | + elif detail is not None and detail not in ['id', 'all']: |
304 | + raise burrow.backend.BadDetail(detail) |
305 | for item in self.iter(filters): |
306 | - self.delete_item(item[0]) |
307 | + self.delete_item(item.name) |
308 | + if detail is not None: |
309 | + yield item.name |
310 | |
311 | def delete_item(self, name): |
312 | if name not in self.index: |
313 | return |
314 | - item = self.index[name][1] |
315 | - if item is not None: |
316 | - prev_item = self.index[name][2] |
317 | - self.index[item[0]] = (item[0], item[1], prev_item) + item[3:] |
318 | - item = self.index[name][2] |
319 | - if item is not None: |
320 | - next_item = self.index[name][1] |
321 | - self.index[item[0]] = (item[0], next_item, item[2]) + item[3:] |
322 | - if self.first == self.index[name]: |
323 | - self.first = self.index[name][1] |
324 | - if self.last == self.index[name]: |
325 | - self.last = self.index[name][2] |
326 | - del self.index[name] |
327 | + item = self.index.pop(name) |
328 | + if item.next is not None: |
329 | + item.next.prev = item.prev |
330 | + if item.prev is not None: |
331 | + item.prev.next = item.next |
332 | + if self.first == item: |
333 | + self.first = item.next |
334 | + if self.last == item: |
335 | + self.last = item.prev |
336 | |
337 | def get(self, name): |
338 | if name in self.index: |
339 | @@ -269,7 +288,7 @@ |
340 | def iter(self, filters={}): |
341 | marker = filters.get('marker', None) |
342 | if marker is not None and marker in self.index: |
343 | - item = self.index[marker] |
344 | + item = self.index[marker].next |
345 | else: |
346 | item = self.first |
347 | limit = filters.get('limit', None) |
348 | @@ -279,46 +298,61 @@ |
349 | limit -= 1 |
350 | if limit == 0: |
351 | break |
352 | - item = item[1] |
353 | - |
354 | - |
355 | -class Accounts(IndexedTupleList): |
356 | + item = item.next |
357 | + |
358 | + |
359 | +class Account(Item): |
360 | + |
361 | + def __init__(self, name=None): |
362 | + super(Account, self).__init__(name) |
363 | + self.queues = Queues() |
364 | + |
365 | + |
366 | +class Accounts(IndexedList): |
367 | |
368 | def delete_queue(self, account, queue): |
369 | account = self.get(account) |
370 | if account is not None: |
371 | - account[3].delete_item(queue) |
372 | - if account[3].count() == 0: |
373 | - self.delete_item(account[0]) |
374 | + account.queues.delete_item(queue) |
375 | + if account.queues.count() == 0: |
376 | + self.delete_item(account.name) |
377 | |
378 | def delete_queues(self, account, filters): |
379 | account = self.get(account) |
380 | if account is not None: |
381 | - account[3].delete(filters) |
382 | - if account[3].count() == 0: |
383 | - self.delete_item(account[0]) |
384 | + for queue in account.queues.delete(filters): |
385 | + yield queue |
386 | + if account.queues.count() == 0: |
387 | + self.delete_item(account.name) |
388 | |
389 | def get_queue(self, account, queue, create=False): |
390 | if account in self.index: |
391 | account = self.index[account] |
392 | elif create: |
393 | - account = self.add((account, None, None, Queues())) |
394 | + account = self.add(Account(account)) |
395 | else: |
396 | return None, None |
397 | - return account, account[3].get(queue, create) |
398 | + return account, account.queues.get(queue, create) |
399 | |
400 | - def iter_queues(self, account, filters={}): |
401 | + def get_queues(self, account, filters={}): |
402 | account = self.get(account) |
403 | if account is not None: |
404 | - for queue in account[3].iter(filters): |
405 | + for queue in account.queues.iter(filters): |
406 | yield queue |
407 | |
408 | |
409 | -class Queues(IndexedTupleList): |
410 | +class Queue(Item): |
411 | + |
412 | + def __init__(self, name=None): |
413 | + super(Queue, self).__init__(name) |
414 | + self.messages = [] |
415 | + |
416 | + |
417 | +class Queues(IndexedList): |
418 | |
419 | def get(self, queue, create=False): |
420 | if queue in self.index: |
421 | return self.index[queue] |
422 | elif create: |
423 | - return self.add((queue, None, None, [])) |
424 | + return self.add(Queue(queue)) |
425 | return None |
426 | |
427 | === modified file 'burrow/backend/sqlite.py' |
428 | --- burrow/backend/sqlite.py 2011-04-24 22:47:02 +0000 |
429 | +++ burrow/backend/sqlite.py 2011-06-13 16:44:08 +0000 |
430 | @@ -54,7 +54,8 @@ |
431 | if len(filters) == 0: |
432 | self.db.execute('DELETE FROM queues') |
433 | self.db.execute('DELETE FROM messages') |
434 | - return |
435 | + return [] |
436 | + return [] |
437 | |
438 | def get_accounts(self, filters={}): |
439 | query = 'SELECT DISTINCT account FROM queues' |
440 | @@ -76,10 +77,11 @@ |
441 | for row in self.db.execute(query, (account,)): |
442 | ids.append(str(row[0])) |
443 | if len(ids) == 0: |
444 | - return |
445 | + return [] |
446 | query = 'DELETE FROM messages WHERE queue IN (%s)' |
447 | self.db.execute(query % ','.join(ids)) |
448 | self.db.execute('DELETE FROM queues WHERE account=?', (account,)) |
449 | + return [] |
450 | |
451 | def get_queues(self, account, filters={}): |
452 | query = 'SELECT queue FROM queues WHERE account=?' |
453 | |
454 | === modified file 'burrow/frontend/wsgi.py' |
455 | --- burrow/frontend/wsgi.py 2011-05-24 03:07:25 +0000 |
456 | +++ burrow/frontend/wsgi.py 2011-06-13 16:44:08 +0000 |
457 | @@ -128,7 +128,7 @@ |
458 | @webob.dec.wsgify |
459 | def _delete_version(self, req): |
460 | filters = self._parse_filters(req) |
461 | - self.backend.delete_accounts(filters) |
462 | + [account for account in self.backend.delete_accounts(filters)] |
463 | return webob.exc.HTTPNoContent() |
464 | |
465 | @webob.dec.wsgify |
466 | @@ -142,7 +142,7 @@ |
467 | @webob.dec.wsgify |
468 | def _delete_account(self, req, account): |
469 | filters = self._parse_filters(req) |
470 | - self.backend.delete_queues(account, filters) |
471 | + [queue for queue in self.backend.delete_queues(account, filters)] |
472 | return webob.exc.HTTPNoContent() |
473 | |
474 | @webob.dec.wsgify |
475 | |
476 | === added directory 'test/backend' |
477 | === added file 'test/backend/__init__.py' |
478 | === added file 'test/backend/test_memory.py' |
479 | --- test/backend/test_memory.py 1970-01-01 00:00:00 +0000 |
480 | +++ test/backend/test_memory.py 2011-06-13 16:44:08 +0000 |
481 | @@ -0,0 +1,121 @@ |
482 | +# Copyright (C) 2011 OpenStack LLC. |
483 | +# |
484 | +# Licensed under the Apache License, Version 2.0 (the "License"); |
485 | +# you may not use this file except in compliance with the License. |
486 | +# You may obtain a copy of the License at |
487 | +# |
488 | +# http://www.apache.org/licenses/LICENSE-2.0 |
489 | +# |
490 | +# Unless required by applicable law or agreed to in writing, software |
491 | +# distributed under the License is distributed on an "AS IS" BASIS, |
492 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
493 | +# See the License for the specific language governing permissions and |
494 | +# limitations under the License. |
495 | + |
496 | +import ConfigParser |
497 | +import time |
498 | +import unittest |
499 | + |
500 | +import eventlet |
501 | + |
502 | +import burrow.backend.memory |
503 | + |
504 | + |
505 | +class TestMemory(unittest.TestCase): |
506 | + '''Unittests for the memory backend.''' |
507 | + backend_class = burrow.backend.memory.Backend |
508 | + |
509 | + def setUp(self): |
510 | + config = (ConfigParser.ConfigParser(), 'test') |
511 | + self.backend = self.backend_class(config) |
512 | + self.assertEquals([], list(self.backend.get_accounts())) |
513 | + self.assertEquals([], list(self.backend.get_queues('a'))) |
514 | + self.assertEquals([], list(self.backend.get_messages('a', 'q'))) |
515 | + |
516 | + def tearDown(self): |
517 | + self.assertEquals([], list(self.backend.get_messages('a', 'q'))) |
518 | + self.assertEquals([], list(self.backend.get_queues('a'))) |
519 | + self.assertEquals([], list(self.backend.get_accounts())) |
520 | + |
521 | + def test_account(self): |
522 | + self.backend.create_message('a', 'q', 'm', 'test') |
523 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
524 | + self.assertEquals([], list(self.backend.delete_accounts())) |
525 | + |
526 | + def test_account_delete_detail_all(self): |
527 | + self.backend.create_message('a', 'q', 'm', 'test') |
528 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
529 | + filters = dict(detail='all') |
530 | + accounts = list(self.backend.delete_accounts(filters)) |
531 | + self.assertEquals(['a'], accounts) |
532 | + |
533 | + def test_account_delete_detail_id(self): |
534 | + self.backend.create_message('a', 'q', 'm', 'test') |
535 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
536 | + filters = dict(detail='id') |
537 | + accounts = list(self.backend.delete_accounts(filters)) |
538 | + self.assertEquals(['a'], accounts) |
539 | + |
540 | + def test_account_delete_detail_none(self): |
541 | + self.backend.create_message('a', 'q', 'm', 'test') |
542 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
543 | + filters = dict(detail='none') |
544 | + accounts = list(self.backend.delete_accounts(filters)) |
545 | + self.assertEquals([], accounts) |
546 | + |
547 | + def test_account_delete_detail_bad(self): |
548 | + self.backend.create_message('a', 'q', 'm', 'test') |
549 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
550 | + filters = dict(detail='bad') |
551 | + accounts = self.backend.delete_accounts(filters) |
552 | + self.assertRaises(burrow.backend.BadDetail, list, accounts) |
553 | + self.assertEquals([], list(self.backend.delete_accounts())) |
554 | + |
555 | + def test_account_get_detail_all(self): |
556 | + self.backend.create_message('a', 'q', 'm', 'test') |
557 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
558 | + filters = dict(detail='all') |
559 | + accounts = list(self.backend.get_accounts(filters)) |
560 | + self.assertEquals(['a'], accounts) |
561 | + self.assertEquals([], list(self.backend.delete_accounts())) |
562 | + |
563 | + def test_account_get_detail_id(self): |
564 | + self.backend.create_message('a', 'q', 'm', 'test') |
565 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
566 | + filters = dict(detail='id') |
567 | + accounts = list(self.backend.get_accounts(filters)) |
568 | + self.assertEquals(['a'], accounts) |
569 | + self.assertEquals([], list(self.backend.delete_accounts())) |
570 | + |
571 | + def test_account_get_detail_none(self): |
572 | + self.backend.create_message('a', 'q', 'm', 'test') |
573 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
574 | + filters = dict(detail='none') |
575 | + accounts = list(self.backend.get_accounts(filters)) |
576 | + self.assertEquals([], accounts) |
577 | + self.assertEquals([], list(self.backend.delete_accounts())) |
578 | + |
579 | + def test_account_get_detail_bad(self): |
580 | + self.backend.create_message('a', 'q', 'm', 'test') |
581 | + self.assertEquals(['a'], list(self.backend.get_accounts())) |
582 | + filters = dict(detail='bad') |
583 | + accounts = self.backend.get_accounts(filters) |
584 | + self.assertRaises(burrow.backend.BadDetail, list, accounts) |
585 | + self.assertEquals([], list(self.backend.delete_accounts())) |
586 | + |
587 | + def test_account_get_marker(self): |
588 | + self.backend.create_message('a1', 'q', 'm', 'test') |
589 | + self.backend.create_message('a2', 'q', 'm', 'test') |
590 | + self.backend.create_message('a3', 'q', 'm', 'test') |
591 | + accounts = list(self.backend.get_accounts()) |
592 | + self.assertEquals(3, len(accounts)) |
593 | + filters = dict(marker=accounts[0]) |
594 | + accounts2 = list(self.backend.get_accounts(filters)) |
595 | + self.assertEquals(accounts[1:], accounts2) |
596 | + filters = dict(marker=accounts[1]) |
597 | + accounts3 = list(self.backend.get_accounts(filters)) |
598 | + self.assertEquals(accounts[2:], accounts3) |
599 | + filters = dict(marker=accounts[2]) |
600 | + accounts4 = list(self.backend.get_accounts(filters)) |
601 | + self.assertEquals([], accounts4) |
602 | + self.assertEquals([], list(self.backend.delete_accounts())) |
The attempt to merge lp:~eday/burrow/backend-unittests into lp:burrow failed. Below is the output from the failed tests.
running test egg-info/ requires. txt egg-info/ PKG-INFO egg-info/ top_level. txt egg-info/ dependency_ links.txt egg-info/ SOURCES. txt' egg-info/ SOURCES. txt' egg-info/ SOURCES. txt'
running egg_info
creating burrow.egg-info
writing requirements to burrow.
writing burrow.
writing top-level names to burrow.
writing dependency_links to burrow.
writing manifest file 'burrow.
reading manifest file 'burrow.
reading manifest template 'MANIFEST.in'
warning: no files found matching 'ChangeLog'
writing manifest file 'burrow.
running build_ext
test_account (test.backend. test_memory. TestMemory) ... ok delete_ detail_ all (test.backend. test_memory. TestMemory) ... ok delete_ detail_ bad (test.backend. test_memory. TestMemory) ... ERROR delete_ detail_ id (test.backend. test_memory. TestMemory) ... ok delete_ detail_ none (test.backend. test_memory. TestMemory) ... ok get_detail_ all (test.backend. test_memory. TestMemory) ... ok get_detail_ bad (test.backend. test_memory. TestMemory) ... ERROR get_detail_ id (test.backend. test_memory. TestMemory) ... ok get_detail_ none (test.backend. test_memory. TestMemory) ... ok get_marker (test.backend. test_memory. TestMemory) ... ok test_wsgi. TestWSGIMemory) ... ok test_wsgi. TestWSGIMemory) ... ok delete_ limit (test.frontend. test_wsgi. TestWSGIMemory) ... ok delete_ limit_marker (test.frontend. test_wsgi. TestWSGIMemory) ... ok delete_ marker (test.frontend. test_wsgi. TestWSGIMemory) ... ok get_limit (test.frontend. test_wsgi. TestWSGIMemory) ... ok get_limit_ marker (test.frontend. test_wsgi. TestWSGIMemory) ... ok get_marker (test.frontend. test_wsgi. TestWSGIMemory) ... ok test_wsgi. TestWSGIMemory) ... ok test_wsgi. TestWSGIMemory) ... ok post_limit (test.frontend. test_wsgi. TestWSGIMemory) ... ok post_limit_ marker (test.frontend. test_wsgi. TestWSGIMemory) ... ok post_marker (test.frontend. test_wsgi. TestWSGIMemory) ... ok post_wait (test.frontend. test_wsgi. TestWSGIMemory) ... ok post_wait_ queue (test.frontend. test_wsgi. TestWSGIMemory) ... ok test_wsgi. TestWSGIMemory) ... ok put_wait (test.frontend. test_wsgi. TestWSGIMemory) ... ok put_wait_ cleanup (test.frontend. test_wsgi. TestWSGIMemory) ... ok put_wait_ overwrite (test.frontend. test_wsgi. TestWSGIMemory) ... ok test_wsgi. TestWSGIMemory) ... ok test_wsgi. TestWSGIMemory) ... ok test_wsgi. TestWSGISQLite) ... ok test_wsgi. TestWSGISQLite) ... ok delete_ limit (test.frontend. test_wsgi. TestWSGISQLite) ... ok delete_ limit_marker (test.frontend. test_wsgi. TestWSGISQLite) ... ok delete_ marker (test.frontend.t...
test_account_
test_account_
ERROR
test_account_
test_account_
test_account_
test_account_
ERROR
test_account_
test_account_
test_account_
test_account (test.frontend.
test_message (test.frontend.
test_message_
test_message_
test_message_
test_message_
test_message_
test_message_
test_message_hide (test.frontend.
test_message_post (test.frontend.
test_message_
test_message_
test_message_
test_message_
test_message_
test_message_put (test.frontend.
test_message_
test_message_
test_message_
test_message_ttl (test.frontend.
test_queue (test.frontend.
test_account (test.frontend.
test_message (test.frontend.
test_message_
test_message_
test_message_