test_hook.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. """
  4. Test cases for twisted.hook module.
  5. """
  6. from twisted.python import hook
  7. from twisted.trial import unittest
  8. class BaseClass:
  9. """
  10. dummy class to help in testing.
  11. """
  12. def __init__(self):
  13. """
  14. dummy initializer
  15. """
  16. self.calledBasePre = 0
  17. self.calledBasePost = 0
  18. self.calledBase = 0
  19. def func(self, a, b):
  20. """
  21. dummy method
  22. """
  23. assert a == 1
  24. assert b == 2
  25. self.calledBase = self.calledBase + 1
  26. class SubClass(BaseClass):
  27. """
  28. another dummy class
  29. """
  30. def __init__(self):
  31. """
  32. another dummy initializer
  33. """
  34. BaseClass.__init__(self)
  35. self.calledSubPre = 0
  36. self.calledSubPost = 0
  37. self.calledSub = 0
  38. def func(self, a, b):
  39. """
  40. another dummy function
  41. """
  42. assert a == 1
  43. assert b == 2
  44. BaseClass.func(self, a, b)
  45. self.calledSub = self.calledSub + 1
  46. _clean_BaseClass = BaseClass.__dict__.copy()
  47. _clean_SubClass = SubClass.__dict__.copy()
  48. def basePre(base, a, b):
  49. """
  50. a pre-hook for the base class
  51. """
  52. base.calledBasePre = base.calledBasePre + 1
  53. def basePost(base, a, b):
  54. """
  55. a post-hook for the base class
  56. """
  57. base.calledBasePost = base.calledBasePost + 1
  58. def subPre(sub, a, b):
  59. """
  60. a pre-hook for the subclass
  61. """
  62. sub.calledSubPre = sub.calledSubPre + 1
  63. def subPost(sub, a, b):
  64. """
  65. a post-hook for the subclass
  66. """
  67. sub.calledSubPost = sub.calledSubPost + 1
  68. class HookTests(unittest.TestCase):
  69. """
  70. test case to make sure hooks are called
  71. """
  72. def setUp(self):
  73. """Make sure we have clean versions of our classes."""
  74. BaseClass.__dict__.clear()
  75. BaseClass.__dict__.update(_clean_BaseClass)
  76. SubClass.__dict__.clear()
  77. SubClass.__dict__.update(_clean_SubClass)
  78. def testBaseHook(self):
  79. """make sure that the base class's hook is called reliably
  80. """
  81. base = BaseClass()
  82. self.assertEqual(base.calledBase, 0)
  83. self.assertEqual(base.calledBasePre, 0)
  84. base.func(1,2)
  85. self.assertEqual(base.calledBase, 1)
  86. self.assertEqual(base.calledBasePre, 0)
  87. hook.addPre(BaseClass, "func", basePre)
  88. base.func(1, b=2)
  89. self.assertEqual(base.calledBase, 2)
  90. self.assertEqual(base.calledBasePre, 1)
  91. hook.addPost(BaseClass, "func", basePost)
  92. base.func(1, b=2)
  93. self.assertEqual(base.calledBasePost, 1)
  94. self.assertEqual(base.calledBase, 3)
  95. self.assertEqual(base.calledBasePre, 2)
  96. hook.removePre(BaseClass, "func", basePre)
  97. hook.removePost(BaseClass, "func", basePost)
  98. base.func(1, b=2)
  99. self.assertEqual(base.calledBasePost, 1)
  100. self.assertEqual(base.calledBase, 4)
  101. self.assertEqual(base.calledBasePre, 2)
  102. def testSubHook(self):
  103. """test interactions between base-class hooks and subclass hooks
  104. """
  105. sub = SubClass()
  106. self.assertEqual(sub.calledSub, 0)
  107. self.assertEqual(sub.calledBase, 0)
  108. sub.func(1, b=2)
  109. self.assertEqual(sub.calledSub, 1)
  110. self.assertEqual(sub.calledBase, 1)
  111. hook.addPre(SubClass, 'func', subPre)
  112. self.assertEqual(sub.calledSub, 1)
  113. self.assertEqual(sub.calledBase, 1)
  114. self.assertEqual(sub.calledSubPre, 0)
  115. self.assertEqual(sub.calledBasePre, 0)
  116. sub.func(1, b=2)
  117. self.assertEqual(sub.calledSub, 2)
  118. self.assertEqual(sub.calledBase, 2)
  119. self.assertEqual(sub.calledSubPre, 1)
  120. self.assertEqual(sub.calledBasePre, 0)
  121. # let the pain begin
  122. hook.addPre(BaseClass, 'func', basePre)
  123. BaseClass.func(sub, 1, b=2)
  124. # sub.func(1, b=2)
  125. self.assertEqual(sub.calledBase, 3)
  126. self.assertEqual(sub.calledBasePre, 1, str(sub.calledBasePre))
  127. sub.func(1, b=2)
  128. self.assertEqual(sub.calledBasePre, 2)
  129. self.assertEqual(sub.calledBase, 4)
  130. self.assertEqual(sub.calledSubPre, 2)
  131. self.assertEqual(sub.calledSub, 3)
  132. testCases = [HookTests]