def test_implemensts_ILoop(self): from gevent.testing import verify from gevent._interfaces import ILoop loop = get_hub().loop verify.verifyObject(ILoop, loop)
def test_callback_ts_implements_ICallback(self): from gevent.testing import verify from gevent._interfaces import ICallback loop = get_hub().loop cb = loop.run_callback_threadsafe(lambda: None) verify.verifyObject(ICallback, cb)
def test_patch_events(self): from gevent import events from gevent.testing import verify all_events = self.all_events def veto(event): if isinstance(event, events.GeventWillPatchModuleEvent ) and event.module_name == 'ssl': raise events.DoNotPatch self.addSubscriber(veto) monkey.saved = {} # Reset monkey.patch_all(thread=False, select=False, extra_kwarg=42) # Go again self.assertIsInstance(all_events[0], events.GeventWillPatchAllEvent) self.assertEqual({'extra_kwarg': 42}, all_events[0].patch_all_kwargs) verify.verifyObject(events.IGeventWillPatchAllEvent, all_events[0]) self.assertIsInstance(all_events[1], events.GeventWillPatchModuleEvent) verify.verifyObject(events.IGeventWillPatchModuleEvent, all_events[1]) self.assertIsInstance(all_events[2], events.GeventDidPatchModuleEvent) verify.verifyObject(events.IGeventWillPatchModuleEvent, all_events[1]) self.assertIsInstance(all_events[-2], events.GeventDidPatchBuiltinModulesEvent) verify.verifyObject(events.IGeventDidPatchBuiltinModulesEvent, all_events[-2]) self.assertIsInstance(all_events[-1], events.GeventDidPatchAllEvent) verify.verifyObject(events.IGeventDidPatchAllEvent, all_events[-1]) for e in all_events: self.assertFalse( isinstance(e, events.GeventDidPatchModuleEvent) and e.module_name == 'ssl')
def test_monitor_blocking(self): # Initially there's no active greenlet and no switches, # so nothing is considered blocked from gevent.events import subscribers from gevent.events import IEventLoopBlocked events = [] subscribers.append(events.append) self.assertFalse(self.pmt.monitor_blocking(self.hub)) # Give it an active greenlet origin = object() target = object() self.pmt._greenlet_tracer('switch', (origin, target)) # We've switched, so we're not blocked self.assertFalse(self.pmt.monitor_blocking(self.hub)) self.assertFalse(events) # Again without switching is a problem. self.assertTrue(self.pmt.monitor_blocking(self.hub)) self.assertTrue(events) verify.verifyObject(IEventLoopBlocked, events[0]) del events[:] # But we can order it not to be a problem self.pmt.ignore_current_greenlet_blocking() self.assertFalse(self.pmt.monitor_blocking(self.hub)) self.assertFalse(events) # And back again self.pmt.monitor_current_greenlet_blocking() self.assertTrue(self.pmt.monitor_blocking(self.hub)) # A bad thread_ident in the hub doesn't mess things up self.hub.thread_ident = -1 self.assertTrue(self.pmt.monitor_blocking(self.hub))
def test_patch_twice_warnings_events(self): import warnings from gevent.testing import verify orig_saved = {} for k, v in monkey.saved.items(): orig_saved[k] = v.copy() from gevent import events all_events = [] events.subscribers.append(all_events.append) def veto(event): if isinstance(event, events.GeventWillPatchModuleEvent ) and event.module_name == 'ssl': raise events.DoNotPatch events.subscribers.append(veto) with warnings.catch_warnings(record=True) as issued_warnings: # Patch again, triggering three warnings, one for os=False/signal=True, # one for repeated monkey-patching, one for patching after ssl (on python >= 2.7.9) monkey.patch_all(os=False, extra_kwarg=42) self.assertGreaterEqual(len(issued_warnings), 2) self.assertIn('SIGCHLD', str(issued_warnings[-1].message)) self.assertIn('more than once', str(issued_warnings[0].message)) # Patching with the exact same argument doesn't issue a second warning. # in fact, it doesn't do anything del issued_warnings[:] monkey.patch_all(os=False) orig_saved['_gevent_saved_patch_all'] = monkey.saved[ '_gevent_saved_patch_all'] self.assertFalse(issued_warnings) # Make sure that re-patching did not change the monkey.saved # attribute, overwriting the original functions. if 'logging' in monkey.saved and 'logging' not in orig_saved: # some part of the warning or unittest machinery imports logging orig_saved['logging'] = monkey.saved['logging'] self.assertEqual(orig_saved, monkey.saved) # Make sure some problematic attributes stayed correct. # NOTE: This was only a problem if threading was not previously imported. for k, v in monkey.saved['threading'].items(): self.assertNotIn('gevent', str(v)) self.assertIsInstance(all_events[0], events.GeventWillPatchAllEvent) self.assertEqual({'extra_kwarg': 42}, all_events[0].patch_all_kwargs) verify.verifyObject(events.IGeventWillPatchAllEvent, all_events[0]) self.assertIsInstance(all_events[1], events.GeventWillPatchModuleEvent) verify.verifyObject(events.IGeventWillPatchModuleEvent, all_events[1]) self.assertIsInstance(all_events[2], events.GeventDidPatchModuleEvent) verify.verifyObject(events.IGeventWillPatchModuleEvent, all_events[1]) self.assertIsInstance(all_events[-2], events.GeventDidPatchBuiltinModulesEvent) verify.verifyObject(events.IGeventDidPatchBuiltinModulesEvent, all_events[-2]) self.assertIsInstance(all_events[-1], events.GeventDidPatchAllEvent) verify.verifyObject(events.IGeventDidPatchAllEvent, all_events[-1]) for e in all_events: self.assertFalse( isinstance(e, events.GeventDidPatchModuleEvent) and e.module_name == 'ssl')
def test_patch_twice_warnings_events(self): import warnings from gevent.testing import verify orig_saved = {} for k, v in monkey.saved.items(): orig_saved[k] = v.copy() from gevent import events all_events = [] events.subscribers.append(all_events.append) def veto(event): if isinstance(event, events.GeventWillPatchModuleEvent) and event.module_name == 'ssl': raise events.DoNotPatch events.subscribers.append(veto) with warnings.catch_warnings(record=True) as issued_warnings: # Patch again, triggering three warnings, one for os=False/signal=True, # one for repeated monkey-patching, one for patching after ssl (on python >= 2.7.9) monkey.patch_all(os=False, extra_kwarg=42) self.assertGreaterEqual(len(issued_warnings), 2) self.assertIn('SIGCHLD', str(issued_warnings[-1].message)) self.assertIn('more than once', str(issued_warnings[0].message)) # Patching with the exact same argument doesn't issue a second warning. # in fact, it doesn't do anything del issued_warnings[:] monkey.patch_all(os=False) orig_saved['_gevent_saved_patch_all'] = monkey.saved['_gevent_saved_patch_all'] self.assertFalse(issued_warnings) # Make sure that re-patching did not change the monkey.saved # attribute, overwriting the original functions. if 'logging' in monkey.saved and 'logging' not in orig_saved: # some part of the warning or unittest machinery imports logging orig_saved['logging'] = monkey.saved['logging'] self.assertEqual(orig_saved, monkey.saved) # Make sure some problematic attributes stayed correct. # NOTE: This was only a problem if threading was not previously imported. for k, v in monkey.saved['threading'].items(): self.assertNotIn('gevent', str(v)) self.assertIsInstance(all_events[0], events.GeventWillPatchAllEvent) self.assertEqual({'extra_kwarg': 42}, all_events[0].patch_all_kwargs) verify.verifyObject(events.IGeventWillPatchAllEvent, all_events[0]) self.assertIsInstance(all_events[1], events.GeventWillPatchModuleEvent) verify.verifyObject(events.IGeventWillPatchModuleEvent, all_events[1]) self.assertIsInstance(all_events[2], events.GeventDidPatchModuleEvent) verify.verifyObject(events.IGeventWillPatchModuleEvent, all_events[1]) self.assertIsInstance(all_events[-2], events.GeventDidPatchBuiltinModulesEvent) verify.verifyObject(events.IGeventDidPatchBuiltinModulesEvent, all_events[-2]) self.assertIsInstance(all_events[-1], events.GeventDidPatchAllEvent) verify.verifyObject(events.IGeventDidPatchAllEvent, all_events[-1]) for e in all_events: self.assertFalse(isinstance(e, events.GeventDidPatchModuleEvent) and e.module_name == 'ssl')