From 6052ecfce63ffb230d9f0795e5fff14ad5ee62e8 Mon Sep 17 00:00:00 2001 From: Vitaly Kruglikov Date: Thu, 26 Mar 2015 00:05:29 -0700 Subject: [PATCH 1/2] PIKA-532 Fix bug in BlockingConnection._handle_timeout that was preventing _on_connection_closed from being called when not closing. --- pika/adapters/blocking_connection.py | 2 +- tests/unit/blocking_connection_tests.py | 97 +++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 tests/unit/blocking_connection_tests.py diff --git a/pika/adapters/blocking_connection.py b/pika/adapters/blocking_connection.py index 9f9a419fb..9c8e6f6f4 100644 --- a/pika/adapters/blocking_connection.py +++ b/pika/adapters/blocking_connection.py @@ -356,7 +356,7 @@ def _handle_timeout(self): LOGGER.debug('Handling timeout %i with a threshold of %i', self._socket_timeouts, threshold) - if self.is_closing and self._socket_timeouts > threshold: + if self._socket_timeouts > threshold: if not self.is_closing: LOGGER.critical('Closing connection due to timeout') self._on_connection_closed(None, True) diff --git a/tests/unit/blocking_connection_tests.py b/tests/unit/blocking_connection_tests.py new file mode 100644 index 000000000..a9f856cab --- /dev/null +++ b/tests/unit/blocking_connection_tests.py @@ -0,0 +1,97 @@ +# -*- coding: utf8 -*- +""" +Tests for pika.adapters.blocking_connection.BlockingConnection + +""" +import socket + +import mock +from mock import patch +try: + import unittest2 as unittest +except ImportError: + import unittest + +import pika +from pika.adapters import blocking_connection + + +class BlockingConnectionMockTemplate(blocking_connection.BlockingConnection): + _socket_timeouts = None + connection_state = None + + + +class BlockingConnectionTests(unittest.TestCase): + + @patch.object(blocking_connection.BlockingConnection, 'connect', + spec_set=blocking_connection.BlockingConnection.connect) + def test_handle_timeout_when_closing_exceeds_threshold(self, connect_mock): + params = pika.ConnectionParameters(socket_timeout=2.0) + connection = BlockingConnectionMockTemplate(params) + + connection_patch = patch.multiple( + connection, + _on_connection_closed=mock.DEFAULT, + _socket_timeouts=connection.SOCKET_TIMEOUT_CLOSE_THRESHOLD, + connection_state=connection.CONNECTION_CLOSING) + + with connection_patch as mocks: + connection._handle_timeout() + + self.assertEqual(mocks["_on_connection_closed"].call_count, 1) + + + @patch.object(blocking_connection.BlockingConnection, 'connect', + spec_set=blocking_connection.BlockingConnection.connect) + def test_handle_timeout_when_closing_below_threshold(self, connect_mock): + params = pika.ConnectionParameters(socket_timeout=2.0) + connection = BlockingConnectionMockTemplate(params) + + connection_patch = patch.multiple( + connection, + _on_connection_closed=mock.DEFAULT, + _socket_timeouts=connection.SOCKET_TIMEOUT_CLOSE_THRESHOLD / 2, + connection_state=connection.CONNECTION_CLOSING) + + with connection_patch as mocks: + connection._handle_timeout() + + self.assertEqual(mocks["_on_connection_closed"].call_count, 0) + + @patch.object(blocking_connection.BlockingConnection, 'connect', + spec_set=blocking_connection.BlockingConnection.connect) + def test_handle_timeout_when_not_closing_exceeds_threshold(self, + connect_mock): + params = pika.ConnectionParameters(socket_timeout=2.0) + connection = BlockingConnectionMockTemplate(params) + + connection_patch = patch.multiple( + connection, + _on_connection_closed=mock.DEFAULT, + _socket_timeouts=connection.SOCKET_TIMEOUT_THRESHOLD, + connection_state=connection.CONNECTION_OPEN) + + with connection_patch as mocks: + connection._handle_timeout() + + self.assertEqual(mocks["_on_connection_closed"].call_count, 1) + + @patch.object(blocking_connection.BlockingConnection, 'connect', + spec_set=blocking_connection.BlockingConnection.connect) + def test_handle_timeout_when_not_closing_below_threshold(self, + connect_mock): + params = pika.ConnectionParameters(socket_timeout=2.0) + connection = BlockingConnectionMockTemplate(params) + + connection_patch = patch.multiple( + connection, + _on_connection_closed=mock.DEFAULT, + _socket_timeouts=connection.SOCKET_TIMEOUT_THRESHOLD / 2, + connection_state=connection.CONNECTION_OPEN) + + with connection_patch as mocks: + connection._handle_timeout() + + self.assertEqual(mocks["_on_connection_closed"].call_count, 0) + From 8c08f931f05f3b5e45aa154d429bec6ccebc3435 Mon Sep 17 00:00:00 2001 From: Vitaly Kruglikov Date: Thu, 26 Mar 2015 00:19:16 -0700 Subject: [PATCH 2/2] PIKA-532 Removed unnecessary params --- tests/unit/blocking_connection_tests.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/unit/blocking_connection_tests.py b/tests/unit/blocking_connection_tests.py index a9f856cab..86d26373e 100644 --- a/tests/unit/blocking_connection_tests.py +++ b/tests/unit/blocking_connection_tests.py @@ -27,8 +27,7 @@ class BlockingConnectionTests(unittest.TestCase): @patch.object(blocking_connection.BlockingConnection, 'connect', spec_set=blocking_connection.BlockingConnection.connect) def test_handle_timeout_when_closing_exceeds_threshold(self, connect_mock): - params = pika.ConnectionParameters(socket_timeout=2.0) - connection = BlockingConnectionMockTemplate(params) + connection = BlockingConnectionMockTemplate() connection_patch = patch.multiple( connection, @@ -45,8 +44,7 @@ def test_handle_timeout_when_closing_exceeds_threshold(self, connect_mock): @patch.object(blocking_connection.BlockingConnection, 'connect', spec_set=blocking_connection.BlockingConnection.connect) def test_handle_timeout_when_closing_below_threshold(self, connect_mock): - params = pika.ConnectionParameters(socket_timeout=2.0) - connection = BlockingConnectionMockTemplate(params) + connection = BlockingConnectionMockTemplate() connection_patch = patch.multiple( connection, @@ -63,8 +61,7 @@ def test_handle_timeout_when_closing_below_threshold(self, connect_mock): spec_set=blocking_connection.BlockingConnection.connect) def test_handle_timeout_when_not_closing_exceeds_threshold(self, connect_mock): - params = pika.ConnectionParameters(socket_timeout=2.0) - connection = BlockingConnectionMockTemplate(params) + connection = BlockingConnectionMockTemplate() connection_patch = patch.multiple( connection, @@ -81,8 +78,7 @@ def test_handle_timeout_when_not_closing_exceeds_threshold(self, spec_set=blocking_connection.BlockingConnection.connect) def test_handle_timeout_when_not_closing_below_threshold(self, connect_mock): - params = pika.ConnectionParameters(socket_timeout=2.0) - connection = BlockingConnectionMockTemplate(params) + connection = BlockingConnectionMockTemplate() connection_patch = patch.multiple( connection,