You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.6KB

  1. import unittest
  2. import threading
  3. import greenlet
  4. class SomeError(Exception):
  5. pass
  6. class TracingTests(unittest.TestCase):
  7. if greenlet.GREENLET_USE_TRACING:
  8. def test_greenlet_tracing(self):
  9. main = greenlet.getcurrent()
  10. actions = []
  11. def trace(*args):
  12. actions.append(args)
  13. def dummy():
  14. pass
  15. def dummyexc():
  16. raise SomeError()
  17. oldtrace = greenlet.settrace(trace)
  18. try:
  19. g1 = greenlet.greenlet(dummy)
  20. g1.switch()
  21. g2 = greenlet.greenlet(dummyexc)
  22. self.assertRaises(SomeError, g2.switch)
  23. finally:
  24. greenlet.settrace(oldtrace)
  25. self.assertEqual(actions, [
  26. ('switch', (main, g1)),
  27. ('switch', (g1, main)),
  28. ('switch', (main, g2)),
  29. ('throw', (g2, main)),
  30. ])
  31. def test_exception_disables_tracing(self):
  32. main = greenlet.getcurrent()
  33. actions = []
  34. def trace(*args):
  35. actions.append(args)
  36. raise SomeError()
  37. def dummy():
  38. main.switch()
  39. g = greenlet.greenlet(dummy)
  40. g.switch()
  41. oldtrace = greenlet.settrace(trace)
  42. try:
  43. self.assertRaises(SomeError, g.switch)
  44. self.assertEqual(greenlet.gettrace(), None)
  45. finally:
  46. greenlet.settrace(oldtrace)
  47. self.assertEqual(actions, [
  48. ('switch', (main, g)),
  49. ])