test_kqueuereactor.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. """
  4. Tests for L{twisted.internet.kqueuereactor}.
  5. """
  6. from __future__ import division, absolute_import
  7. import errno
  8. from zope.interface import implementer
  9. from twisted.trial.unittest import TestCase
  10. try:
  11. from twisted.internet.kqreactor import KQueueReactor, _IKQueue
  12. kqueueSkip = None
  13. except ImportError:
  14. kqueueSkip = "KQueue not available."
  15. def _fakeKEvent(*args, **kwargs):
  16. """
  17. Do nothing.
  18. """
  19. def makeFakeKQueue(testKQueue, testKEvent):
  20. """
  21. Create a fake that implements L{_IKQueue}.
  22. @param testKQueue: Something that acts like L{select.kqueue}.
  23. @param testKEvent: Something that acts like L{select.kevent}.
  24. @return: An implementation of L{_IKQueue} that includes C{testKQueue} and
  25. C{testKEvent}.
  26. """
  27. @implementer(_IKQueue)
  28. class FakeKQueue(object):
  29. kqueue = testKQueue
  30. kevent = testKEvent
  31. return FakeKQueue()
  32. class KQueueTests(TestCase):
  33. """
  34. These are tests for L{KQueueReactor}'s implementation, not its real world
  35. behaviour. For that, look at
  36. L{twisted.internet.test.reactormixins.ReactorBuilder}.
  37. """
  38. skip = kqueueSkip
  39. def test_EINTR(self):
  40. """
  41. L{KQueueReactor} handles L{errno.EINTR} in C{doKEvent} by returning.
  42. """
  43. class FakeKQueue(object):
  44. """
  45. A fake KQueue that raises L{errno.EINTR} when C{control} is called,
  46. like a real KQueue would if it was interrupted.
  47. """
  48. def control(self, *args, **kwargs):
  49. raise OSError(errno.EINTR, "Interrupted")
  50. reactor = KQueueReactor(makeFakeKQueue(FakeKQueue, _fakeKEvent))
  51. # This should return cleanly -- should not raise the OSError we're
  52. # spawning, nor get upset and raise about the incomplete KQueue fake.
  53. reactor.doKEvent(0)