diff --git a/tests/__init__.py b/tests/__init__.py index c21074e1..852de9a8 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -44,6 +44,16 @@ def is_gevent_monkey_patched(): return socket.socket is gevent.socket.socket +def is_gevent_time_monkey_patched(): + import gevent.monkey + return "time" in gevent.monkey.saved + + +def is_eventlet_time_monkey_patched(): + import eventlet + return eventlet.patcher.is_monkey_patched('time') + + def is_monkey_patched(): return is_gevent_monkey_patched() or is_eventlet_monkey_patched() diff --git a/tests/unit/io/eventlet_utils.py b/tests/unit/io/eventlet_utils.py index e06d3f77..05ef6bc9 100644 --- a/tests/unit/io/eventlet_utils.py +++ b/tests/unit/io/eventlet_utils.py @@ -16,13 +16,20 @@ import os import select import socket -import thread -import Queue +try: + import thread + import Queue + import __builtin__ +except: + import _thread as thread + import queue as Queue + import builtins + import threading -import __builtin__ import ssl import time - +import eventlet +from imp import reload def eventlet_un_patch_all(): """ @@ -34,4 +41,7 @@ def eventlet_un_patch_all(): for to_unpatch in modules_to_unpatch: reload(to_unpatch) +def restore_saved_module(module): + reload(module) + del eventlet.patcher.already_patched[module.__name__] diff --git a/tests/unit/io/test_eventletreactor.py b/tests/unit/io/test_eventletreactor.py index 6aa76fa7..44af1f40 100644 --- a/tests/unit/io/test_eventletreactor.py +++ b/tests/unit/io/test_eventletreactor.py @@ -19,8 +19,10 @@ except ImportError: import unittest # noqa from tests.unit.io.utils import submit_and_wait_for_completion, TimerCallback -from tests import is_eventlet_monkey_patched +from tests import is_eventlet_time_monkey_patched, is_gevent_time_monkey_patched +from tests.unit.io.eventlet_utils import restore_saved_module import time +from eventlet import monkey_patch try: from cassandra.io.eventletreactor import EventletConnection @@ -29,12 +31,25 @@ except ImportError: class EventletTimerTest(unittest.TestCase): + need_unpatch = False + + @classmethod + def setUpClass(cls): + if is_eventlet_time_monkey_patched(): + return # no dynamic patching if we have eventlet applied + if EventletConnection is not None: + if not is_gevent_time_monkey_patched(): + cls.need_unpatch = True + monkey_patch(time=True) + + @classmethod + def tearDownClass(cls): + if cls.need_unpatch: + restore_saved_module(time) def setUp(self): - if EventletConnection is None: - raise unittest.SkipTest("Eventlet libraries not available") - if not is_eventlet_monkey_patched(): - raise unittest.SkipTest("Can't test eventlet without monkey patching") + if not is_eventlet_time_monkey_patched(): + raise unittest.SkipTest("Can't test gevent without monkey patching") EventletConnection.initialize_reactor() def test_multi_timer_validation(self, *args): diff --git a/tests/unit/io/test_geventreactor.py b/tests/unit/io/test_geventreactor.py index 4a8ba307..ed5f9281 100644 --- a/tests/unit/io/test_geventreactor.py +++ b/tests/unit/io/test_geventreactor.py @@ -19,12 +19,12 @@ except ImportError: import time from tests.unit.io.utils import submit_and_wait_for_completion, TimerCallback -from tests import is_gevent_monkey_patched, is_eventlet_monkey_patched +from tests import is_gevent_time_monkey_patched, is_eventlet_monkey_patched try: from cassandra.io.geventreactor import GeventConnection import gevent.monkey - from gevent_utils import gevent_un_patch_all + from tests.unit.io.gevent_utils import restore_saved_module except ImportError: GeventConnection = None # noqa @@ -38,17 +38,17 @@ class GeventTimerTest(unittest.TestCase): if is_eventlet_monkey_patched(): return # no dynamic patching if we have eventlet applied if GeventConnection is not None: - if not is_gevent_monkey_patched(): + if not is_gevent_time_monkey_patched(): cls.need_unpatch = True - gevent.monkey.patch_all() + gevent.monkey.patch_time() @classmethod def tearDownClass(cls): if cls.need_unpatch: - gevent_un_patch_all() + restore_saved_module("time") def setUp(self): - if not is_gevent_monkey_patched(): + if not is_gevent_time_monkey_patched(): raise unittest.SkipTest("Can't test gevent without monkey patching") GeventConnection.initialize_reactor()