def setUp(self): self.queue = IndexQueue()
class QueueTests(CleanUp, TestCase): def setUp(self): self.queue = IndexQueue() def tearDown(self): self.queue.clear() def testInterface(self): self.failUnless(IIndexQueue.providedBy(self.queue)) def testQueueHook(self): class CaptainHook: def __init__(self): self.hooked = 0 def __call__(self): self.hooked += 1 hook = CaptainHook() queue = self.queue queue.setHook(hook) self.assertEqual(hook.hooked, 0) queue.index("foo") queue.reindex("foo") queue.reindex("bar") self.assertEqual(len(queue.getState()), 3) self.assertEqual(hook.hooked, 3) self.assertEqual(queue.process(), 2) self.assertEqual(hook.hooked, 3) def testQueueState(self): queue = self.queue queue.index("foo") self.assertEqual(queue.getState(), [(INDEX, "foo", None)]) state = queue.getState() queue.reindex("bar") self.assertEqual(queue.getState(), [(INDEX, "foo", None), (REINDEX, "bar", None)]) queue.setState(state) self.assertEqual(queue.getState(), [(INDEX, "foo", None)]) self.assertEqual(queue.process(), 1) def testQueueProcessor(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index("foo") self.assertEqual(queue.process(), 1) # also do the processing... self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), [(INDEX, "foo", None)]) self.assertEqual(proc.state, "started") # the real queue won't update the state... queue.commit() self.assertEqual(proc.state, "finished") def testMultipleQueueProcessors(self): queue = self.queue proc1 = utils.MockQueueProcessor() proc2 = utils.MockQueueProcessor() provideUtility(proc1, IIndexQueueProcessor, name="proc1") provideUtility(proc2, IIndexQueueProcessor, name="proc2") queue.index("foo") self.assertEqual(queue.process(), 1) # also do the processing... self.assertEqual(queue.getState(), []) self.assertEqual(proc1.getState(), [(INDEX, "foo", None)]) self.assertEqual(proc2.getState(), [(INDEX, "foo", None)]) self.assertEqual(proc1.state, "started") # the real queue won't... self.assertEqual(proc2.state, "started") # update the state... queue.commit() self.assertEqual(proc1.state, "finished") self.assertEqual(proc2.state, "finished") def testQueueOperations(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index("foo") queue.reindex("foo") self.assertEqual(queue.process(), 1) self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), [(INDEX, "foo", None)]) # the real queue won't update the state self.assertEqual(proc.state, "started") queue.commit() self.assertEqual(proc.state, "finished") def testQueueOptimization(self): queue = self.queue queue.index("foo") queue.reindex("foo") queue.unindex("foo") queue.index("foo", "bar") queue.optimize() self.assertEqual(queue.getState(), [(INDEX, "foo", None)]) def testCustomQueueOptimization(self): def optimize(self): self.setState([op for op in self.getState() if not op[0] == UNINDEX]) queue = self.queue queue.index("foo") queue.reindex("foo") queue.unindex("foo") queue.index("foo", "bar") queue.optimize() self.assertEqual(queue.getState(), [(INDEX, "foo", None)]) queue.clear() # hook up the custom optimize orig_optimize = queue.optimize try: queue.optimize = optimize queue.index("foo") queue.reindex("foo") queue.unindex("foo") queue.index("foo", "bar") queue.optimize(queue) self.assertEqual(queue.getState(), [(INDEX, "foo", None), (REINDEX, "foo", None), (INDEX, "foo", "bar")]) finally: queue.optimize = orig_optimize def testQueueAbortBeforeProcessing(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index("foo") queue.reindex("foo") self.assertNotEqual(queue.getState(), []) queue.abort() self.assertEqual(queue.process(), 0) # nothing left... self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), []) self.assertEqual(proc.state, "aborted") def testQueueAbortAfterProcessing(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index("foo") queue.reindex("foo") self.assertEqual(queue.process(), 1) self.assertNotEqual(proc.getState(), []) queue.abort() self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), []) self.assertEqual(proc.state, "aborted") def testOptimizeQueue(self): queue = self.queue queue.setState([(REINDEX, "A", None), (REINDEX, "A", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, "A", None)]) queue.setState([(INDEX, "A", None), (REINDEX, "A", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(INDEX, "A", None)]) queue.setState([(INDEX, "A", None), (UNINDEX, "A", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), []) queue.setState([(UNINDEX, "A", None), (INDEX, "A", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, "A", None)]) def testOptimizeQueueWithAttributes(self): queue = self.queue queue.setState([(REINDEX, "A", None), (REINDEX, "A", ("a", "b"))]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, "A", None)]) queue.setState([(REINDEX, "A", ("a", "b")), (REINDEX, "A", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, "A", None)]) queue.setState([(REINDEX, "A", ("a", "b")), (REINDEX, "A", ("b", "c"))]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, "A", ("a", "c", "b"))]) queue.setState([(INDEX, "A", None), (REINDEX, "A", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(INDEX, "A", None)]) queue.setState([(REINDEX, "A", ("a", "b")), (UNINDEX, "A", None), (INDEX, "A", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, "A", None)]) def testOptimizeQueueSortsByOpcode(self): queue = self.queue queue.setState([(INDEX, "C", None), (UNINDEX, "B", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(UNINDEX, "B", None), (INDEX, "C", None)]) queue.setState([(REINDEX, "A", None), (UNINDEX, "B", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(UNINDEX, "B", None), (REINDEX, "A", None)]) queue.setState([(REINDEX, "A", None), (UNINDEX, "B", None), (INDEX, "C", None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(UNINDEX, "B", None), (REINDEX, "A", None), (INDEX, "C", None)])
class QueueTests(CleanUp, TestCase): def setUp(self): self.queue = IndexQueue() def tearDown(self): self.queue.clear() def testInterface(self): self.failUnless(IIndexQueue.providedBy(self.queue)) def testQueueHook(self): class CaptainHook: def __init__(self): self.hooked = 0 def __call__(self): self.hooked += 1 hook = CaptainHook() queue = self.queue queue.setHook(hook) self.assertEqual(hook.hooked, 0) queue.index('foo') queue.reindex('foo') queue.reindex('bar') self.assertEqual(len(queue.getState()), 3) self.assertEqual(hook.hooked, 3) self.assertEqual(queue.process(), 2) self.assertEqual(hook.hooked, 3) def testQueueState(self): queue = self.queue queue.index('foo') self.assertEqual(queue.getState(), [(INDEX, 'foo', None)]) state = queue.getState() queue.reindex('bar') self.assertEqual(queue.getState(), [(INDEX, 'foo', None), (REINDEX, 'bar', None)]) queue.setState(state) self.assertEqual(queue.getState(), [(INDEX, 'foo', None)]) self.assertEqual(queue.process(), 1) def testQueueProcessor(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index('foo') self.assertEqual(queue.process(), 1) # also do the processing... self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), [(INDEX, 'foo', None)]) self.assertEqual(proc.state, 'started') # the real queue won't update the state... queue.commit() self.assertEqual(proc.state, 'finished') def testMultipleQueueProcessors(self): queue = self.queue proc1 = utils.MockQueueProcessor() proc2 = utils.MockQueueProcessor() provideUtility(proc1, IIndexQueueProcessor, name='proc1') provideUtility(proc2, IIndexQueueProcessor, name='proc2') queue.index('foo') self.assertEqual(queue.process(), 1) # also do the processing... self.assertEqual(queue.getState(), []) self.assertEqual(proc1.getState(), [(INDEX, 'foo', None)]) self.assertEqual(proc2.getState(), [(INDEX, 'foo', None)]) self.assertEqual(proc1.state, 'started') # the real queue won't... self.assertEqual(proc2.state, 'started') # update the state... queue.commit() self.assertEqual(proc1.state, 'finished') self.assertEqual(proc2.state, 'finished') def testQueueOperations(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index('foo') queue.reindex('foo') self.assertEqual(queue.process(), 1) self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), [(INDEX, 'foo', None)]) # the real queue won't update the state self.assertEqual(proc.state, 'started') queue.commit() self.assertEqual(proc.state, 'finished') def testQueueOptimization(self): queue = self.queue queue.index('foo') queue.reindex('foo') queue.unindex('foo') queue.index('foo', 'bar') queue.optimize() self.assertEqual(queue.getState(), [(INDEX, 'foo', None)]) def testCustomQueueOptimization(self): def optimize(self): self.setState( [op for op in self.getState() if not op[0] == UNINDEX]) queue = self.queue queue.index('foo') queue.reindex('foo') queue.unindex('foo') queue.index('foo', 'bar') queue.optimize() self.assertEqual(queue.getState(), [(INDEX, 'foo', None)]) queue.clear() # hook up the custom optimize orig_optimize = queue.optimize try: queue.optimize = optimize queue.index('foo') queue.reindex('foo') queue.unindex('foo') queue.index('foo', 'bar') queue.optimize(queue) self.assertEqual(queue.getState(), [(INDEX, 'foo', None), (REINDEX, 'foo', None), (INDEX, 'foo', 'bar')]) finally: queue.optimize = orig_optimize def testQueueAbortBeforeProcessing(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index('foo') queue.reindex('foo') self.assertNotEqual(queue.getState(), []) queue.abort() self.assertEqual(queue.process(), 0) # nothing left... self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), []) self.assertEqual(proc.state, 'aborted') def testQueueAbortAfterProcessing(self): queue = self.queue proc = utils.MockQueueProcessor() provideUtility(proc, IIndexQueueProcessor) queue.index('foo') queue.reindex('foo') self.assertEqual(queue.process(), 1) self.assertNotEqual(proc.getState(), []) queue.abort() self.assertEqual(queue.getState(), []) self.assertEqual(proc.getState(), []) self.assertEqual(proc.state, 'aborted') def testOptimizeQueue(self): queue = self.queue queue.setState([(REINDEX, 'A', None), (REINDEX, 'A', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, 'A', None)]) queue.setState([(INDEX, 'A', None), (REINDEX, 'A', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(INDEX, 'A', None)]) queue.setState([(INDEX, 'A', None), (UNINDEX, 'A', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), []) queue.setState([(UNINDEX, 'A', None), (INDEX, 'A', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, 'A', None)]) def testOptimizeQueueWithAttributes(self): queue = self.queue queue.setState([(REINDEX, 'A', None), (REINDEX, 'A', ('a', 'b'))]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, 'A', None)]) queue.setState([(REINDEX, 'A', ('a', 'b')), (REINDEX, 'A', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, 'A', None)]) queue.setState([(REINDEX, 'A', ('a', 'b')), (REINDEX, 'A', ('b', 'c'))]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, 'A', ('a', 'c', 'b'))]) queue.setState([(INDEX, 'A', None), (REINDEX, 'A', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(INDEX, 'A', None)]) queue.setState([(REINDEX, 'A', ('a', 'b')), (UNINDEX, 'A', None), (INDEX, 'A', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(REINDEX, 'A', None)]) def testOptimizeQueueSortsByOpcode(self): queue = self.queue queue.setState([(INDEX, 'C', None), (UNINDEX, 'B', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(UNINDEX, 'B', None), (INDEX, 'C', None)]) queue.setState([(REINDEX, 'A', None), (UNINDEX, 'B', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(UNINDEX, 'B', None), (REINDEX, 'A', None)]) queue.setState([(REINDEX, 'A', None), (UNINDEX, 'B', None), (INDEX, 'C', None)]) queue.optimize() self.failUnlessEqual(queue.getState(), [(UNINDEX, 'B', None), (REINDEX, 'A', None), (INDEX, 'C', None)])