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 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