def setUp(self): DefaultTestFixture.setUp(self) self.lock = Lock() self.tq = ThreadQueue(ThreadPool(3), 3) self.queue = Queue() self.simple_action_counter = 0 return
class TestCase(DefaultTestFixture): def setUp(self): DefaultTestFixture.setUp(self) self.lock = Lock() self.tq = ThreadQueue(ThreadPool(3), 3) self.queue = Queue() self.simple_action_counter = 0 return def tearDown(self): self.tq._unload() DefaultTestFixture.tearDown(self) return def simple_action(self, object): # @note It appears that even the '+= 1' operation is not # guaranteed to be atomic. self.lock.acquire() self.simple_action_counter += 1 self.lock.release() return 'simple_action_result' def slow_action(self, object): time.sleep(1.0) return 'slow_action_result' def simple_queue_action(self, object): self.queue.put(object) return def test_simple_queue(self): self.tq.queue(self.simple_queue_action, self) result = self.queue.get(1.0) if result is not self: raise "Queue returned %r instead of self, %r." % (result, self) return def test_result(self): t1 = time.time() pending_result = self.tq.queue(self.simple_action, self) result = pending_result.result(10.0) t2 = time.time() if result != 'simple_action_result': raise ("pending_result.result() returned the wrong value (%s)." % result) if (t2 - t1) >= 10.0: raise "pending_result.result() blocked for no reason." return def test_pending_reasult(self): t1 = time.time() pending_result = ThreadQueueResult(None, None, self.simple_action, self) pending_result_two = self.tq.queue_pending_result(pending_result) if pending_result_two is not pending_result: raise "pending_result_two is NOT pending_result" result = pending_result.result(10.0) t2 = time.time() if result != 'simple_action_result': raise ("pending_result.result() returned the wrong value (%s)." % result) if (t2 - t1) >= 10.0: raise "pending_result.result() blocked for no reason." return def test_pending_action(self): pending_action = ThreadQueueAction(self.simple_queue_action, self) self.tq.queue_pending_action(pending_action) result = self.queue.get(1.0) if result is not self: raise "Queue returned %r instead of self, %r." % (result, self) return return def test_result_timeout(self): t1 = time.time() pending_result = self.tq.queue(self.slow_action, self) result = pending_result.result(0.25) t2 = time.time() if (t2 - t2) >= 1.0: raise "Blocked 1 second when a 1/4 second timeout." if result != NORESULT: raise "Got a result (%s) when none was expected." return def test_1000_actions(self): for i in xrange(0, 1000): self.tq.queue(self.simple_action, self) time.sleep(0.1) t1 = time.time() while self.simple_action_counter < 1000: tn = time.time() if (tn - t1) > 3.0: raise ( "Taking ridiculously long to process 1000 queued actions.") time.sleep(0.1) return
class TestCase(DefaultTestFixture): def setUp(self): DefaultTestFixture.setUp(self) self.lock = Lock() self.tq = ThreadQueue(ThreadPool(3), 3) self.queue = Queue() self.simple_action_counter = 0 return def tearDown(self): self.tq._unload() DefaultTestFixture.tearDown(self) return def simple_action(self, object): # @note It appears that even the '+= 1' operation is not # guaranteed to be atomic. self.lock.acquire() self.simple_action_counter += 1 self.lock.release() return 'simple_action_result' def slow_action(self, object): time.sleep(1.0) return 'slow_action_result' def simple_queue_action(self, object): self.queue.put(object) return def test_simple_queue(self): self.tq.queue(self.simple_queue_action, self) result = self.queue.get(1.0) if result is not self: raise "Queue returned %r instead of self, %r." % (result, self) return def test_result(self): t1 = time.time() pending_result = self.tq.queue(self.simple_action, self) result = pending_result.result(10.0) t2 = time.time() if result != 'simple_action_result': raise ( "pending_result.result() returned the wrong value (%s)." % result ) if (t2-t1) >= 10.0: raise "pending_result.result() blocked for no reason." return def test_pending_reasult(self): t1 = time.time() pending_result = ThreadQueueResult(None, None, self.simple_action, self) pending_result_two = self.tq.queue_pending_result(pending_result) if pending_result_two is not pending_result: raise "pending_result_two is NOT pending_result" result = pending_result.result(10.0) t2 = time.time() if result != 'simple_action_result': raise ( "pending_result.result() returned the wrong value (%s)." % result ) if (t2-t1) >= 10.0: raise "pending_result.result() blocked for no reason." return def test_pending_action(self): pending_action = ThreadQueueAction(self.simple_queue_action, self) self.tq.queue_pending_action(pending_action) result = self.queue.get(1.0) if result is not self: raise "Queue returned %r instead of self, %r." % (result, self) return return def test_result_timeout(self): t1 = time.time() pending_result = self.tq.queue(self.slow_action, self) result = pending_result.result(0.25) t2 = time.time() if (t2-t2) >= 1.0: raise "Blocked 1 second when a 1/4 second timeout." if result != NORESULT: raise "Got a result (%s) when none was expected." return def test_1000_actions(self): for i in xrange(0,1000): self.tq.queue(self.simple_action, self) time.sleep(0.1) t1 = time.time() while self.simple_action_counter < 1000: tn = time.time() if (tn-t1) > 3.0: raise ( "Taking ridiculously long to process 1000 queued actions." ) time.sleep(0.1) return