/tests/conftest.py

https://bitbucket.org/prologic/circuits/ · Python · 157 lines · 110 code · 42 blank · 5 comment · 26 complexity · ca2853cecd2a0ee939a4389b6a972a7b MD5 · raw file

  1. # Module: conftest
  2. # Date: 6th December 2010
  3. # Author: James Mills, prologic at shortcircuit dot net dot au
  4. """py.test config"""
  5. import pytest
  6. import sys
  7. import threading
  8. import collections
  9. from time import sleep
  10. from collections import deque
  11. from circuits.core.manager import TIMEOUT
  12. from circuits import handler, BaseComponent, Debugger, Manager
  13. class Watcher(BaseComponent):
  14. def init(self):
  15. self._lock = threading.Lock()
  16. self.events = deque()
  17. @handler(channel="*", priority=999.9)
  18. def _on_event(self, event, *args, **kwargs):
  19. with self._lock:
  20. self.events.append(event)
  21. def clear(self):
  22. self.events.clear()
  23. def wait(self, name, channel=None, timeout=6.0):
  24. try:
  25. for i in range(int(timeout / TIMEOUT)):
  26. if channel is None:
  27. with self._lock:
  28. for event in self.events:
  29. if event.name == name:
  30. return True
  31. else:
  32. with self._lock:
  33. for event in self.events:
  34. if event.name == name and \
  35. channel in event.channels:
  36. return True
  37. sleep(TIMEOUT)
  38. finally:
  39. pass
  40. #self.events.clear()
  41. class Flag(object):
  42. status = False
  43. def call_event_from_name(manager, event, event_name, *channels):
  44. fired = False
  45. value = None
  46. for r in manager.waitEvent(event_name):
  47. if not fired:
  48. fired = True
  49. value = manager.fire(event, *channels)
  50. sleep(0.1)
  51. return value
  52. def call_event(manager, event, *channels):
  53. return call_event_from_name(manager, event, event.name, *channels)
  54. class WaitEvent(object):
  55. def __init__(self, manager, name, channel=None, timeout=6.0):
  56. if channel is None:
  57. channel = getattr(manager, "channel", None)
  58. self.timeout = timeout
  59. self.manager = manager
  60. flag = Flag()
  61. @handler(name, channel=channel)
  62. def on_event(self, *args, **kwargs):
  63. flag.status = True
  64. self.handler = self.manager.addHandler(on_event)
  65. self.flag = flag
  66. def wait(self):
  67. try:
  68. for i in range(int(self.timeout / TIMEOUT)):
  69. if self.flag.status:
  70. return True
  71. sleep(TIMEOUT)
  72. finally:
  73. self.manager.removeHandler(self.handler)
  74. def wait_for(obj, attr, value=True, timeout=3.0):
  75. from circuits.core.manager import TIMEOUT
  76. for i in range(int(timeout / TIMEOUT)):
  77. if isinstance(value, collections.Callable):
  78. if value(obj, attr):
  79. return True
  80. elif getattr(obj, attr) == value:
  81. return True
  82. sleep(TIMEOUT)
  83. @pytest.fixture(scope="session")
  84. def manager(request):
  85. manager = Manager()
  86. def finalizer():
  87. manager.stop()
  88. request.addfinalizer(finalizer)
  89. waiter = WaitEvent(manager, "started")
  90. manager.start()
  91. assert waiter.wait()
  92. if request.config.option.verbose:
  93. verbose = True
  94. else:
  95. verbose = False
  96. Debugger(events=verbose).register(manager)
  97. return manager
  98. @pytest.fixture
  99. def watcher(request, manager):
  100. watcher = Watcher().register(manager)
  101. def finalizer():
  102. waiter = WaitEvent(manager, "unregistered")
  103. watcher.unregister()
  104. waiter.wait()
  105. request.addfinalizer(finalizer)
  106. return watcher
  107. def pytest_namespace():
  108. return dict((
  109. ("WaitEvent", WaitEvent),
  110. ("wait_for", wait_for),
  111. ("call_event", call_event),
  112. ("PLATFORM", sys.platform),
  113. ("PYVER", sys.version_info[:3]),
  114. ("call_event_from_name", call_event_from_name),
  115. ))