diff --git a/oslo_service/service.py b/oslo_service/service.py index 2e56d30a..133a6a2b 100644 --- a/oslo_service/service.py +++ b/oslo_service/service.py @@ -28,7 +28,6 @@ import io import logging import os import random -import select import signal import six import sys @@ -204,8 +203,9 @@ class SignalHandler(object): For Python 3.5 and later, deal with the changes in PEP 475 that prevent a signal from interrupting eventlet's call to poll() or sleep(). """ + select_module = eventlet.patcher.original('select') self.__force_interrupt_on_signal = (sys.version_info >= (3, 5) and - hasattr(select, 'poll')) + hasattr(select_module, 'poll')) if self.__force_interrupt_on_signal: try: diff --git a/oslo_service/tests/test_service.py b/oslo_service/tests/test_service.py index 0114eb58..07c5226a 100644 --- a/oslo_service/tests/test_service.py +++ b/oslo_service/tests/test_service.py @@ -478,15 +478,28 @@ class ProcessLauncherTest(base.ServiceBaseTestCase): signal_handler.clear() @mock.patch('sys.version_info', (3, 5)) - @mock.patch.object(service, 'select', spec=[]) - def test_setup_signal_interruption_no_select_poll(self, mock_select): + def test_setup_signal_interruption_no_select_poll(self): + # NOTE(claudiub): SignalHandler is a singleton, which means that it + # might already be initialized. We need to clear to clear the cache + # in order to prevent race conditions between tests. + service.SignalHandler.__class__._instances.clear() + with mock.patch('eventlet.patcher.original', + return_value=object()) as get_original: + signal_handler = service.SignalHandler() + get_original.assert_called_with('select') + self.addCleanup(service.SignalHandler.__class__._instances.clear) + self.assertFalse( + signal_handler._SignalHandler__force_interrupt_on_signal) + + @mock.patch('sys.version_info', (3, 5)) + def test_setup_signal_interruption_select_poll(self): # NOTE(claudiub): SignalHandler is a singleton, which means that it # might already be initialized. We need to clear to clear the cache # in order to prevent race conditions between tests. service.SignalHandler.__class__._instances.clear() signal_handler = service.SignalHandler() self.addCleanup(service.SignalHandler.__class__._instances.clear) - self.assertFalse( + self.assertTrue( signal_handler._SignalHandler__force_interrupt_on_signal) @mock.patch('signal.alarm')