test_extension_interface.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from __future__ import print_function
  2. from __future__ import absolute_import
  3. import sys
  4. import greenlet
  5. from . import _test_extension
  6. from . import TestCase
  7. # pylint:disable=c-extension-no-member
  8. class CAPITests(TestCase):
  9. def test_switch(self):
  10. self.assertEqual(
  11. 50, _test_extension.test_switch(greenlet.greenlet(lambda: 50)))
  12. def test_switch_kwargs(self):
  13. def adder(x, y):
  14. return x * y
  15. g = greenlet.greenlet(adder)
  16. self.assertEqual(6, _test_extension.test_switch_kwargs(g, x=3, y=2))
  17. def test_setparent(self):
  18. # pylint:disable=disallowed-name
  19. def foo():
  20. def bar():
  21. greenlet.getcurrent().parent.switch()
  22. # This final switch should go back to the main greenlet, since
  23. # the test_setparent() function in the C extension should have
  24. # reparented this greenlet.
  25. greenlet.getcurrent().parent.switch()
  26. raise AssertionError("Should never have reached this code")
  27. child = greenlet.greenlet(bar)
  28. child.switch()
  29. greenlet.getcurrent().parent.switch(child)
  30. greenlet.getcurrent().parent.throw(
  31. AssertionError("Should never reach this code"))
  32. foo_child = greenlet.greenlet(foo).switch()
  33. self.assertEqual(None, _test_extension.test_setparent(foo_child))
  34. def test_getcurrent(self):
  35. _test_extension.test_getcurrent()
  36. def test_new_greenlet(self):
  37. self.assertEqual(-15, _test_extension.test_new_greenlet(lambda: -15))
  38. def test_raise_greenlet_dead(self):
  39. self.assertRaises(
  40. greenlet.GreenletExit, _test_extension.test_raise_dead_greenlet)
  41. def test_raise_greenlet_error(self):
  42. self.assertRaises(
  43. greenlet.error, _test_extension.test_raise_greenlet_error)
  44. def test_throw(self):
  45. seen = []
  46. def foo(): # pylint:disable=disallowed-name
  47. try:
  48. greenlet.getcurrent().parent.switch()
  49. except ValueError:
  50. seen.append(sys.exc_info()[1])
  51. except greenlet.GreenletExit:
  52. raise AssertionError
  53. g = greenlet.greenlet(foo)
  54. g.switch()
  55. _test_extension.test_throw(g)
  56. self.assertEqual(len(seen), 1)
  57. self.assertTrue(
  58. isinstance(seen[0], ValueError),
  59. "ValueError was not raised in foo()")
  60. self.assertEqual(
  61. str(seen[0]),
  62. 'take that sucka!',
  63. "message doesn't match")
  64. def test_non_traceback_param(self):
  65. with self.assertRaises(TypeError) as exc:
  66. _test_extension.test_throw_exact(
  67. greenlet.getcurrent(),
  68. Exception,
  69. Exception(),
  70. self
  71. )
  72. self.assertEqual(str(exc.exception),
  73. "throw() third argument must be a traceback object")
  74. def test_instance_of_wrong_type(self):
  75. with self.assertRaises(TypeError) as exc:
  76. _test_extension.test_throw_exact(
  77. greenlet.getcurrent(),
  78. Exception(),
  79. BaseException(),
  80. None,
  81. )
  82. self.assertEqual(str(exc.exception),
  83. "instance exception may not have a separate value")
  84. def test_not_throwable(self):
  85. with self.assertRaises(TypeError) as exc:
  86. _test_extension.test_throw_exact(
  87. greenlet.getcurrent(),
  88. "abc",
  89. None,
  90. None,
  91. )
  92. self.assertEqual(str(exc.exception),
  93. "exceptions must be classes, or instances, not str")
  94. if __name__ == '__main__':
  95. import unittest
  96. unittest.main()