def test_stop_request_generator_queue_non_empty(): # Model scenario tested: # - The request generator **is** running # - The request queue **is not** empty # Expected result: # - ``_stop_request_generator()`` can't call ``.close()`` (since # the generator is running) but then returns with ``False`` because # the queue **is not** empty consumer = _consumer.Consumer() # Attach a "fake" queue to the request generator so the generator can # block on an empty queue while the consumer's queue is not empty. queue_ = queue.Queue() received = queue.Queue() request_generator = basic_queue_generator(queue_, received) # Make sure the consumer's queue is not empty. item1 = 'not-empty' consumer._request_queue.put(item1) thread = threading.Thread(target=next, args=(request_generator, )) thread.start() # Make sure the generator is stuck at the blocked ``.get()`` # in ``thread``. while not request_generator.gi_running: pass assert received.empty() assert request_generator.gi_frame is not None response_generator = mock.Mock(spec=('done', )) response_generator.done.return_value = True stopped = consumer._stop_request_generator(request_generator, response_generator) assert stopped is False # Make sure the generator is **still** not finished. assert request_generator.gi_running assert request_generator.gi_frame is not None assert consumer._request_queue.get() == item1 # Allow the generator to exit. item2 = 'just-exit' queue_.put(item2) # Wait until it's actually done. while request_generator.gi_running: pass assert received.get() == item2 # Check mocks. response_generator.done.assert_called_once_with()
def test_stop_request_generator_not_running(): # Model scenario tested: # - The request generator **is not** running # - The request queue **is not** empty # Expected result: # - ``_stop_request_generator()`` successfully calls ``.close()`` consumer = _consumer.Consumer() queue_ = consumer._request_queue received = queue.Queue() request_generator = basic_queue_generator(queue_, received) item1 = 'unblock-please' item2 = 'still-here' queue_.put(item1) queue_.put(item2) assert not queue_.empty() assert received.empty() thread = threading.Thread(target=next, args=(request_generator, )) thread.start() # Make sure the generator is not stuck at the blocked ``.get()`` # in the thread. while request_generator.gi_running: pass assert received.get() == item1 # Make sure it **isn't** done. assert request_generator.gi_frame is not None response_generator = mock.Mock(spec=('done', )) response_generator.done.return_value = True stopped = consumer._stop_request_generator(request_generator, response_generator) assert stopped is True # Make sure it **is** done. assert not request_generator.gi_running assert request_generator.gi_frame is None assert not queue_.empty() assert queue_.get() == item2 assert queue_.empty() # Check mocks. response_generator.done.assert_called_once_with()
def test_stop_request_generator_running(): # Model scenario tested: # - The request generator **is** running # - The request queue **is** empty # Expected result: # - ``_stop_request_generator()`` can't call ``.close()`` (since # the generator is running) but then verifies that the queue is # empty and sends ``STOP`` into the queue to successfully stop # the generator consumer = _consumer.Consumer() queue_ = consumer._request_queue received = queue.Queue() request_generator = basic_queue_generator(queue_, received) thread = threading.Thread(target=next, args=(request_generator, )) thread.start() # Make sure the generator is stuck at the blocked ``.get()`` # in the thread. while not request_generator.gi_running: pass assert received.empty() assert request_generator.gi_frame is not None response_generator = mock.Mock(spec=('done', )) response_generator.done.return_value = True stopped = consumer._stop_request_generator(request_generator, response_generator) assert stopped is True # Make sure it **is** done, though we may have to wait until # the generator finishes (it has a few instructions between the # ``get()`` and the ``break``). while request_generator.gi_running: pass request_generator.close() assert request_generator.gi_frame is None assert received.get() == _helper_threads.STOP assert queue_.empty() # Check mocks. response_generator.done.assert_called_once_with()