def test_search_timeout(self, _find): _impl = Mock() plugin = Mock() plugin.Reader.return_value = _impl _find.return_value = plugin received = [ (Mock(), Document(sn='1')), (Mock(), Document(sn='2')), (None, None) ] # test url = TEST_URL node = Node('') reader = Reader(node, url) reader.next = Mock(side_effect=received) document = reader.search('', timeout=10) # validation next_calls = reader.next.call_args_list self.assertEqual(len(next_calls), len(received)) self.assertEqual(document, None) for call in next_calls: self.assertEqual(call[0][0], 10) self.assertTrue(received[0][0].ack.called) self.assertTrue(received[1][0].ack.called)
def test_search(self, _find): _impl = Mock() plugin = Mock() plugin.Reader.return_value = _impl _find.return_value = plugin received = [(Mock(), Document(sn='1')), (Mock(), Document(sn='2')), (Mock(), Document(sn='3'))] # test url = TEST_URL node = Node('') sn = received[1][1].sn reader = Reader(node, url) reader.next = Mock(side_effect=received) document = reader.search(sn, timeout=10) # validation next_calls = reader.next.call_args_list self.assertEqual(len(next_calls), 2) self.assertEqual(document, received[1][1]) for call in next_calls: self.assertEqual(call[0][0], 10) self.assertTrue(received[0][0].ack.called) self.assertTrue(received[1][0].ack.called) self.assertFalse(received[2][0].ack.called)
def test_next_not_found(self, _find): _impl = Mock() plugin = Mock() plugin.Reader.return_value = _impl _find.return_value = plugin # test reader = Reader(Node('')) reader.get = Mock(return_value=None) reader.authenticator = Mock() _message, _document = reader.next(10) # validation reader.get.assert_called_once_with(10) self.assertEqual(_message, None) self.assertEqual(_document, None)
def test_next(self, _find, auth, validate): _impl = Mock() plugin = Mock() plugin.Reader.return_value = _impl _find.return_value = plugin message = Mock(body='test-content') document = Mock() auth.validate.return_value = document # test reader = Reader(Node('')) reader.get = Mock(return_value=message) reader.authenticator = Mock() _message, _document = reader.next(10) # validation reader.get.assert_called_once_with(10) auth.validate.assert_called_once_with(reader.authenticator, message.body) validate.assert_called_once_with(document) self.assertEqual(_message, reader.get.return_value) self.assertEqual(_document, document)
class ConsumerThread(Thread): """ An AMQP (abstract) consumer. """ def __init__(self, node, url): """ :param node: An AMQP queue. :type node: gofer.messaging.adapter.model.Node :param url: The broker URL. :type url: str """ Thread.__init__(self, name=node.name) self.url = url self.node = node self.authenticator = None self._reader = None self.setDaemon(True) def shutdown(self): """ Shutdown the consumer. """ self.abort() @released def run(self): """ Main consumer loop. """ self._reader = Reader(self.node, self.url) self._reader.authenticator = self.authenticator self._open() try: while not Thread.aborted(): self._read() finally: self._close() def _open(self): """ Open the reader. """ while not Thread.aborted(): try: self._reader.open() break except Exception: log.exception(self.getName()) sleep(60) def _close(self): """ Close the reader. """ try: self._reader.close() except Exception: log.exception(self.getName()) def _read(self): """ Read and process incoming documents. """ try: message, document = self._reader.next(10) if message is None: return log.debug('{%s} read: %s', self.getName(), document) self.dispatch(document) message.ack() except InvalidDocument, invalid: self._rejected(invalid.code, invalid.description, invalid.document, invalid.details) except Exception: log.exception(self.getName()) sleep(60) self._close() self._open()