202
181
m = "Bad Event received: Got %r while in %s" % (event, n_from)
203
182
self.assertEqual(in_log, self.check_log('warning', m))
205
def test_idle_mq_waiting(self):
206
"""MQ Waiting when in IDLE."""
207
self.check('IDLE', 'SYS_META_QUEUE_WAITING', 'WORKING_ON_METADATA')
208
self.assertEqual(self.aq.execs, ['MQ'])
210
def test_idle_mq_done(self):
211
"""MQ Done when in IDLE."""
212
self.check('IDLE', 'SYS_META_QUEUE_DONE', 'IDLE', in_log=True)
214
def test_idle_cq_waiting(self):
215
"""CQ Waiting when in IDLE."""
216
self.check('IDLE', 'SYS_CONTENT_QUEUE_WAITING', 'WORKING_ON_CONTENT')
217
self.assertEqual(self.aq.execs, ['CQ'])
219
def test_idle_cq_done(self):
220
"""CQ Done when in IDLE."""
221
self.check('IDLE', 'SYS_CONTENT_QUEUE_DONE', 'IDLE', in_log=True)
223
def test_workingmetadata_mq_waiting(self):
224
"""MQ Waiting when in WORKING_ON_METADATA."""
225
self.check('WORKING_ON_METADATA', 'SYS_META_QUEUE_WAITING',
226
'WORKING_ON_METADATA')
227
self.assertEqual(self.aq.execs, ['MQ'])
229
def test_workingmetadata_mq_done(self):
230
"""MQ Done when in WORKING_ON_METADATA."""
231
self.check('WORKING_ON_METADATA', 'SYS_META_QUEUE_DONE', 'IDLE')
233
def test_workingmetadata_cq_waiting(self):
234
"""CQ Waiting when in WORKING_ON_METADATA."""
235
self.check('WORKING_ON_METADATA', 'SYS_CONTENT_QUEUE_WAITING',
238
def test_workingmetadata_cq_done(self):
239
"""CQ Done when in WORKING_ON_METADATA."""
240
self.check('WORKING_ON_METADATA', 'SYS_CONTENT_QUEUE_DONE',
241
'WORKING_ON_METADATA', in_log=True)
243
def test_workingcontent_mq_waiting(self):
244
"""MQ Waiting when in WORKING_ON_CONTENT."""
245
self.check('WORKING_ON_CONTENT', 'SYS_META_QUEUE_WAITING',
247
self.assertEqual(self.aq.execs, ['MQ'])
249
def test_workingcontent_mq_done(self):
250
"""MQ Done when in WORKING_ON_CONTENT."""
251
self.check('WORKING_ON_CONTENT', 'SYS_META_QUEUE_DONE',
252
'WORKING_ON_CONTENT', in_log=True)
254
def test_workingcontent_cq_waiting(self):
255
"""CQ Waiting when in WORKING_ON_CONTENT."""
256
self.check('WORKING_ON_CONTENT', 'SYS_CONTENT_QUEUE_WAITING',
257
'WORKING_ON_CONTENT')
258
self.assertEqual(self.aq.execs, ['CQ'])
260
def test_workingcontent_cq_done(self):
261
"""CQ Done when in WORKING_ON_CONTENT."""
262
self.check('WORKING_ON_CONTENT', 'SYS_CONTENT_QUEUE_DONE', 'IDLE')
264
def test_workingboth_mq_waiting(self):
265
"""MQ Waiting when in WORKING_ON_BOTH."""
266
self.check('WORKING_ON_BOTH', 'SYS_META_QUEUE_WAITING',
268
self.assertEqual(self.aq.execs, ['MQ'])
270
def test_workingboth_mq_done(self):
271
"""MQ Done when in WORKING_ON_BOTH."""
272
self.check('WORKING_ON_BOTH', 'SYS_META_QUEUE_DONE',
273
'WORKING_ON_CONTENT')
274
self.assertEqual(self.aq.execs, ['CQ'])
276
def test_workingboth_cq_waiting(self):
277
"""CQ Waiting when in WORKING_ON_BOTH."""
278
self.check('WORKING_ON_BOTH', 'SYS_CONTENT_QUEUE_WAITING',
281
def test_workingboth_cq_done(self):
282
"""CQ Done when in WORKING_ON_BOTH."""
283
self.check('WORKING_ON_BOTH', 'SYS_CONTENT_QUEUE_DONE',
284
'WORKING_ON_METADATA')
184
def test_idle_waiting(self):
185
"""Waiting when in IDLE."""
186
self.check('IDLE', 'SYS_QUEUE_WAITING', 'WORKING')
188
def test_idle_done(self):
189
"""Done when in IDLE."""
190
self.check('IDLE', 'SYS_QUEUE_DONE', 'IDLE', in_log=True)
192
def test_working_waiting(self):
193
"""Waiting when in WORKING."""
194
self.check('WORKING', 'SYS_QUEUE_WAITING', 'WORKING', in_log=True)
196
def test_working_done(self):
197
"""Done when in WORKING."""
198
self.check('WORKING', 'SYS_QUEUE_DONE', 'IDLE')
287
201
class TestQueueManagerFromOutside(QueueBase):
288
"""Getting into QueueManager."""
202
"""Getting in/out QueueManager."""
204
def test_into_idle(self):
291
205
"""Entering when IDLE."""
206
assert not self.aq.queue.active
292
207
self.qm.state = QueueManager.IDLE
293
208
self.sm.state = StateManager.SERVER_RESCAN
294
209
self.sm.handle_default('SYS_SERVER_RESCAN_DONE')
295
210
self.assertEqual(self.qm.state, QueueManager.IDLE)
296
self.assertEqual(self.aq.execs, [])
298
def test_workingmeta(self):
299
"""Entering when WORKING_ON_METADATA."""
300
self.qm.state = QueueManager.WORKING_ON_METADATA
301
self.sm.state = StateManager.SERVER_RESCAN
302
self.sm.handle_default('SYS_SERVER_RESCAN_DONE')
303
self.assertEqual(self.qm.state, QueueManager.WORKING_ON_METADATA)
304
self.assertEqual(self.aq.execs, ['MQ'])
306
def test_workingcontent(self):
307
"""Entering when WORKING_ON_CONTENT."""
308
self.qm.state = QueueManager.WORKING_ON_CONTENT
309
self.sm.state = StateManager.SERVER_RESCAN
310
self.sm.handle_default('SYS_SERVER_RESCAN_DONE')
311
self.assertEqual(self.qm.state, QueueManager.WORKING_ON_CONTENT)
312
self.assertEqual(self.aq.execs, ['CQ'])
314
def test_workingboth(self):
315
"""Entering when WORKING_ON_BOTH."""
316
self.qm.state = QueueManager.WORKING_ON_BOTH
317
self.sm.state = StateManager.SERVER_RESCAN
318
self.sm.handle_default('SYS_SERVER_RESCAN_DONE')
319
self.assertEqual(self.qm.state, QueueManager.WORKING_ON_BOTH)
320
self.assertEqual(self.aq.execs, ['MQ'])
323
class TestQueueManagerRunQueues(QueueBase):
324
"""QueueManager run the queues when it should."""
326
def test_mq_run_something_yes(self):
327
"""MQ.run() is executed when something in the queue and working."""
328
self.sm.state = StateManager.QUEUE_MANAGER
329
self.qm._run(self.qm.mq)
330
self.assertEqual(self.aq.execs, ['MQ'])
332
def test_cq_run_something_yes(self):
333
"""CQ.run() is executed when something in the queue and working."""
334
self.sm.state = StateManager.QUEUE_MANAGER
335
self.qm._run(self.qm.cq)
336
self.assertEqual(self.aq.execs, ['CQ'])
338
def test_mq_run_something_noqueue(self):
339
"""MQ.run() is not executed if nothing in the queue."""
340
self.qm.mq.jobs[:] = []
341
self.sm.state = StateManager.QUEUE_MANAGER
342
self.qm._run(self.qm.mq)
343
self.assertEqual(self.aq.execs, [])
345
def test_cq_run_something_noqueue(self):
346
"""CQ.run() is not executed if nothing in the queue."""
347
self.qm.cq.jobs[:] = []
348
self.sm.state = StateManager.QUEUE_MANAGER
349
self.qm._run(self.qm.cq)
350
self.assertEqual(self.aq.execs, [])
352
def test_mq_run_something_noworking(self):
353
"""MQ.run() is not executed if not working."""
354
self.sm.state = StateManager.INIT # just not QM
355
self.qm._run(self.qm.mq)
356
self.assertEqual(self.aq.execs, [])
358
def test_cq_run_something_noworking(self):
359
"""CQ.run() is not executed if not working."""
360
self.sm.state = StateManager.INIT # just not QM
361
self.qm._run(self.qm.cq)
362
self.assertEqual(self.aq.execs, [])
365
class TestQueueManagerBehaviour(Base):
366
"""Behaviour of QueueManager when managing queues.
368
The rules of who is sending us events are defined in the FakeQueues above.
373
self.sm.state = StateManager.QUEUE_MANAGER
375
def execute_test(self, events, should_happen):
376
"""Execute the test."""
378
self.qm.on_event(evt)
379
self.assertEqual(self.aq.execs, should_happen)
380
self.assertEqual(self.qm.state, QueueManager.IDLE)
382
def test_onlyMQ(self):
384
self.qm.mq.queue(defer.succeed(True))
385
self.assertEqual(self.aq.execs, ['MQ'])
386
self.assertEqual(self.qm.state, QueueManager.IDLE)
388
def test_onlyCQ(self):
390
self.qm.cq.queue(defer.succeed(True))
391
self.assertEqual(self.aq.execs, ['CQ'])
392
self.assertEqual(self.qm.state, QueueManager.IDLE)
394
def test_mixed_simple(self):
395
"""A couple of both, sequential."""
396
self.qm.mq.queue(defer.succeed(True))
397
self.qm.cq.queue(defer.succeed(True))
398
self.qm.mq.queue(defer.succeed(True))
399
self.qm.cq.queue(defer.succeed(True))
400
self.assertEqual(self.aq.execs, ['MQ', 'CQ', 'MQ', 'CQ'])
401
self.assertEqual(self.qm.state, QueueManager.IDLE)
403
def test_workingCQ_stillCQ(self):
404
"""Has CQ pending when finishing CQ."""
407
self.qm.cq.queue(defer.succeed(True))
410
self.assertEqual(self.aq.execs, ['CQ', 'CQ'])
411
self.assertEqual(self.qm.state, QueueManager.IDLE)
413
def test_workingCQ_stillMQ_first_ends_CQ(self):
414
"""Has MQ pending when finishing CQ, then CQ finishes first."""
415
dc = defer.Deferred()
416
dm = defer.Deferred()
422
self.assertEqual(self.aq.execs, ['CQ', 'MQ'])
423
self.assertEqual(self.qm.state, QueueManager.IDLE)
425
def test_workingCQ_stillMQ_first_ends_MQ(self):
426
"""Has MQ pending when finishing CQ, then MQ finishes first."""
427
dc = defer.Deferred()
428
dm = defer.Deferred()
434
self.assertEqual(self.aq.execs, ['CQ', 'MQ'])
435
self.assertEqual(self.qm.state, QueueManager.IDLE)
437
def test_workingMQ_stillCQ(self):
438
"""Has CQ pending when finishing MQ."""
441
self.qm.cq.queue(defer.succeed(True))
444
self.assertEqual(self.aq.execs, ['MQ', 'CQ'])
445
self.assertEqual(self.qm.state, QueueManager.IDLE)
447
def test_workingMQ_stillMQ(self):
448
"""Has MQ pending when finishing MQ."""
451
self.qm.mq.queue(defer.succeed(True))
454
self.assertEqual(self.aq.execs, ['MQ', 'MQ'])
455
self.assertEqual(self.qm.state, QueueManager.IDLE)
457
def test_workingCQ_still_both_cm(self):
458
"""Has both pending (C-M) when finishing CQ."""
459
dc = defer.Deferred()
460
dm = defer.Deferred()
462
self.qm.cq.queue(defer.succeed(True))
467
self.assertEqual(self.aq.execs, ['CQ', 'CQ', 'MQ'])
468
self.assertEqual(self.qm.state, QueueManager.IDLE)
470
def test_workingCQ_still_both_mc(self):
471
"""Has both pending (M-C) when finishing CQ."""
472
dc = defer.Deferred()
473
dm = defer.Deferred()
476
self.qm.cq.queue(defer.succeed(True))
480
self.assertEqual(self.aq.execs, ['CQ', 'MQ', 'CQ'])
481
self.assertEqual(self.qm.state, QueueManager.IDLE)
483
def test_workingMQ_still_both_mc(self):
484
"""Has both pending (M-C) when finishing MQ."""
485
dc = defer.Deferred()
486
dm = defer.Deferred()
488
self.qm.mq.queue(defer.succeed(True))
493
self.assertEqual(self.aq.execs, ['MQ', 'MQ', 'CQ'])
494
self.assertEqual(self.qm.state, QueueManager.IDLE)
496
def test_workingMQ_still_both_cm(self):
497
"""Has both pending (C-M) when finishing MQ."""
498
# this is the assymetric one that gives MQ higher priority!
499
dc = defer.Deferred()
500
dm = defer.Deferred()
502
self.qm.cq.queue(defer.succeed(True))
507
self.assertEqual(self.aq.execs, ['MQ', 'MQ', 'CQ'])
508
self.assertEqual(self.qm.state, QueueManager.IDLE)
211
self.assertTrue(self.aq.queue.active)
213
def test_into_working(self):
214
"""Entering when WORKING."""
215
assert not self.aq.queue.active
216
self.qm.state = QueueManager.WORKING
217
self.sm.state = StateManager.SERVER_RESCAN
218
self.sm.handle_default('SYS_SERVER_RESCAN_DONE')
219
self.assertEqual(self.qm.state, QueueManager.WORKING)
220
self.assertTrue(self.aq.queue.active)
512
223
class TestConnectionManager(Base):