def test_execute(self, treq_mock): response_mock = Mock(code=200) treq_mock.request.return_value = succeed(response_mock) treq_mock.json_content.return_value = succeed({'_id': 123}) conn = HTTPConnection() conn.connect('s1', pool=Mock()) conn.add_server('s2') yield conn.execute( 'GET', 'index/doc/_search', body={'query': {'term': 'something'}}) assert treq_mock.json_content.called conn.close()
def setUp(self): """Setup connection mocks.""" self.conn = HTTPConnection() self.conn.connect('s1', pool=Mock()) self.conn.add_server('s2')
class HTTPConnectionTest(TestCase): """Tests for the HTTPConnection module.""" def setUp(self): """Setup connection mocks.""" self.conn = HTTPConnection() self.conn.connect('s1', pool=Mock()) self.conn.add_server('s2') def test_prepare_url(self, _): result = _prepare_url('s1', 'index/doc/_search', {'size': 5}) self.assertTrue(result == 'http://s1/index/doc/_search?size=5') def test_prepare_url_handles_ssl(self, _): result = _prepare_url('https://s1:443', 'index/doc/_search', {'size': 5}) self.assertTrue(result == 'https://s1:443/index/doc/_search?size=5') @inlineCallbacks def test_execute(self, treq_mock): response_mock = Mock(code=200) response_mock.json.return_value = succeed({'_id': 123}) treq_mock.request.return_value = succeed(response_mock) yield self.conn.execute('GET', 'index/doc/_search', body={'query': { 'term': 'something' }}) assert response_mock.json.called self.conn.close() @inlineCallbacks def test_execute_marks_dead_on_connection_failure(self, treq_mock): """ Handle ConnectionRefusedError error. When Twisted raises exception, we mark the server dead and retry. """ def raise_connection_refused(*args, **kwargs): """Raise ConnectionRefusedError.""" raise ConnectionRefusedError() treq_mock.request.side_effect = raise_connection_refused self.conn.servers.mark_dead = Mock() yield self.assertFailure(self.conn.execute('GET', 'index/doc/_search'), ConnectionRefusedError) # Ensure we retry enough times self.assertEquals(self.conn.servers.mark_dead.call_count, 4) self.conn.close() @inlineCallbacks def test_execute_doesnt_retry_on_client_error(self, treq_mock): """When ES returns a client-exception, we shouldn't retry.""" response_mock = Mock(code=429) response_mock.json.return_value = succeed({ u'status': 429, u'error': u'ReduceSearchPhaseException[Failed to execute phase [fetch], [reduce] ; shardFailures {[2A-6X8MDRP-gZ6M_752d-A][tmp][0]: EsRejectedExecutionException[rejected execution (queue capacity 0) on org.elasticsearch.search.action.SearchServiceTransportAction$23@24084605]}]; nested: EsRejectedExecutionException[rejected execution (queue capacity 0) on org.elasticsearch.action.search.type.TransportSearchQueryThenFetchAction$AsyncAction$2@42658745]' }) # noqa treq_mock.request.return_value = succeed(response_mock) self.conn.servers.mark_dead = Mock() yield self.assertFailure(self.conn.execute('GET', 'index/doc/_search'), ElasticSearchException) # Ensure no retries self.assertEquals(self.conn.servers.mark_dead.call_count, 0) self.conn.close()
class HTTPConnectionTest(TestCase): """Tests for the HTTPConnection module.""" def setUp(self): """Setup connection mocks.""" self.conn = HTTPConnection() self.conn.connect('s1', pool=Mock()) self.conn.add_server('s2') def test_prepare_url(self, _): result = _prepare_url('s1', 'index/doc/_search', {'size': 5}) self.assertTrue(result == 'http://s1/index/doc/_search?size=5') def test_prepare_url_handles_ssl(self, _): result = _prepare_url( 'https://s1:443', 'index/doc/_search', {'size': 5}) self.assertTrue(result == 'https://s1:443/index/doc/_search?size=5') @inlineCallbacks def test_execute(self, treq_mock): response_mock = Mock(code=200) response_mock.json.return_value = succeed({'_id': 123}) treq_mock.request.return_value = succeed(response_mock) yield self.conn.execute( 'GET', 'index/doc/_search', body={'query': {'term': 'something'}}) assert response_mock.json.called self.conn.close() @inlineCallbacks def test_execute_marks_dead_on_connection_failure(self, treq_mock): """ Handle ConnectionRefusedError error. When Twisted raises exception, we mark the server dead and retry. """ def raise_connection_refused(*args, **kwargs): """Raise ConnectionRefusedError.""" raise ConnectionRefusedError() treq_mock.request.side_effect = raise_connection_refused self.conn.servers.mark_dead = Mock() yield self.assertFailure( self.conn.execute('GET', 'index/doc/_search'), ConnectionRefusedError) # Ensure we retry enough times self.assertEquals(self.conn.servers.mark_dead.call_count, 3) self.conn.close() @inlineCallbacks def test_execute_doesnt_retry_on_client_error(self, treq_mock): """When ES returns a client-exception, we shouldn't retry.""" response_mock = Mock(code=429) response_mock.json.return_value = succeed({ u'status': 429, u'error': u'ReduceSearchPhaseException[Failed to execute phase [fetch], [reduce] ; shardFailures {[2A-6X8MDRP-gZ6M_752d-A][tmp][0]: EsRejectedExecutionException[rejected execution (queue capacity 0) on org.elasticsearch.search.action.SearchServiceTransportAction$23@24084605]}]; nested: EsRejectedExecutionException[rejected execution (queue capacity 0) on org.elasticsearch.action.search.type.TransportSearchQueryThenFetchAction$AsyncAction$2@42658745]'}) # noqa treq_mock.request.return_value = succeed(response_mock) self.conn.servers.mark_dead = Mock() yield self.assertFailure( self.conn.execute('GET', 'index/doc/_search'), ElasticSearchException) # Ensure no retries self.assertEquals(self.conn.servers.mark_dead.call_count, 0) self.conn.close()