PageRenderTime 33ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/regressiontests/dispatch/tests/test_dispatcher.py

https://code.google.com/p/mango-py/
Python | 124 lines | 99 code | 20 blank | 5 comment | 3 complexity | c6f61d91185a08c86356584ac1faa0cf MD5 | raw file
Possible License(s): BSD-3-Clause
  1. import gc
  2. import sys
  3. from django.dispatch import Signal
  4. from django.utils import unittest
  5. import django.utils.copycompat as copy
  6. if sys.platform.startswith('java'):
  7. def garbage_collect():
  8. """Run the garbage collector and wait a bit to let it do his work"""
  9. import time
  10. gc.collect()
  11. time.sleep(0.1)
  12. else:
  13. def garbage_collect():
  14. gc.collect()
  15. def receiver_1_arg(val, **kwargs):
  16. return val
  17. class Callable(object):
  18. def __call__(self, val, **kwargs):
  19. return val
  20. def a(self, val, **kwargs):
  21. return val
  22. a_signal = Signal(providing_args=["val"])
  23. class DispatcherTests(unittest.TestCase):
  24. """Test suite for dispatcher (barely started)"""
  25. def _testIsClean(self, signal):
  26. """Assert that everything has been cleaned up automatically"""
  27. self.assertEqual(signal.receivers, [])
  28. # force cleanup just in case
  29. signal.receivers = []
  30. def testExact(self):
  31. a_signal.connect(receiver_1_arg, sender=self)
  32. expected = [(receiver_1_arg,"test")]
  33. result = a_signal.send(sender=self, val="test")
  34. self.assertEqual(result, expected)
  35. a_signal.disconnect(receiver_1_arg, sender=self)
  36. self._testIsClean(a_signal)
  37. def testIgnoredSender(self):
  38. a_signal.connect(receiver_1_arg)
  39. expected = [(receiver_1_arg,"test")]
  40. result = a_signal.send(sender=self, val="test")
  41. self.assertEqual(result, expected)
  42. a_signal.disconnect(receiver_1_arg)
  43. self._testIsClean(a_signal)
  44. def testGarbageCollected(self):
  45. a = Callable()
  46. a_signal.connect(a.a, sender=self)
  47. expected = []
  48. del a
  49. garbage_collect()
  50. result = a_signal.send(sender=self, val="test")
  51. self.assertEqual(result, expected)
  52. self._testIsClean(a_signal)
  53. def testMultipleRegistration(self):
  54. a = Callable()
  55. a_signal.connect(a)
  56. a_signal.connect(a)
  57. a_signal.connect(a)
  58. a_signal.connect(a)
  59. a_signal.connect(a)
  60. a_signal.connect(a)
  61. result = a_signal.send(sender=self, val="test")
  62. self.assertEqual(len(result), 1)
  63. self.assertEqual(len(a_signal.receivers), 1)
  64. del a
  65. del result
  66. garbage_collect()
  67. self._testIsClean(a_signal)
  68. def testUidRegistration(self):
  69. def uid_based_receiver_1(**kwargs):
  70. pass
  71. def uid_based_receiver_2(**kwargs):
  72. pass
  73. a_signal.connect(uid_based_receiver_1, dispatch_uid = "uid")
  74. a_signal.connect(uid_based_receiver_2, dispatch_uid = "uid")
  75. self.assertEqual(len(a_signal.receivers), 1)
  76. a_signal.disconnect(dispatch_uid = "uid")
  77. self._testIsClean(a_signal)
  78. def testRobust(self):
  79. """Test the sendRobust function"""
  80. def fails(val, **kwargs):
  81. raise ValueError('this')
  82. a_signal.connect(fails)
  83. result = a_signal.send_robust(sender=self, val="test")
  84. err = result[0][1]
  85. self.assertTrue(isinstance(err, ValueError))
  86. self.assertEqual(err.args, ('this',))
  87. a_signal.disconnect(fails)
  88. self._testIsClean(a_signal)
  89. def testDisconnection(self):
  90. receiver_1 = Callable()
  91. receiver_2 = Callable()
  92. receiver_3 = Callable()
  93. a_signal.connect(receiver_1)
  94. a_signal.connect(receiver_2)
  95. a_signal.connect(receiver_3)
  96. a_signal.disconnect(receiver_1)
  97. del receiver_2
  98. garbage_collect()
  99. a_signal.disconnect(receiver_3)
  100. self._testIsClean(a_signal)
  101. def getSuite():
  102. return unittest.makeSuite(DispatcherTests,'test')
  103. if __name__ == "__main__":
  104. unittest.main()