test_log.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. # encoding: utf-8
  2. # Copyright (C) PyZMQ Developers
  3. # Distributed under the terms of the Modified BSD License.
  4. import logging
  5. import time
  6. from unittest import TestCase
  7. import zmq
  8. from zmq.log import handlers
  9. from zmq.utils.strtypes import b, u
  10. from zmq.tests import BaseZMQTestCase
  11. class TestPubLog(BaseZMQTestCase):
  12. iface = 'inproc://zmqlog'
  13. topic= 'zmq'
  14. @property
  15. def logger(self):
  16. # print dir(self)
  17. logger = logging.getLogger('zmqtest')
  18. logger.setLevel(logging.DEBUG)
  19. return logger
  20. def connect_handler(self, topic=None):
  21. topic = self.topic if topic is None else topic
  22. logger = self.logger
  23. pub,sub = self.create_bound_pair(zmq.PUB, zmq.SUB)
  24. handler = handlers.PUBHandler(pub)
  25. handler.setLevel(logging.DEBUG)
  26. handler.root_topic = topic
  27. logger.addHandler(handler)
  28. sub.setsockopt(zmq.SUBSCRIBE, b(topic))
  29. time.sleep(0.1)
  30. return logger, handler, sub
  31. def test_init_iface(self):
  32. logger = self.logger
  33. ctx = self.context
  34. handler = handlers.PUBHandler(self.iface)
  35. self.assertFalse(handler.ctx is ctx)
  36. self.sockets.append(handler.socket)
  37. # handler.ctx.term()
  38. handler = handlers.PUBHandler(self.iface, self.context)
  39. self.sockets.append(handler.socket)
  40. self.assertTrue(handler.ctx is ctx)
  41. handler.setLevel(logging.DEBUG)
  42. handler.root_topic = self.topic
  43. logger.addHandler(handler)
  44. sub = ctx.socket(zmq.SUB)
  45. self.sockets.append(sub)
  46. sub.setsockopt(zmq.SUBSCRIBE, b(self.topic))
  47. sub.connect(self.iface)
  48. import time; time.sleep(0.25)
  49. msg1 = 'message'
  50. logger.info(msg1)
  51. (topic, msg2) = sub.recv_multipart()
  52. self.assertEqual(topic, b'zmq.INFO')
  53. self.assertEqual(msg2, b(msg1)+b'\n')
  54. logger.removeHandler(handler)
  55. def test_init_socket(self):
  56. pub,sub = self.create_bound_pair(zmq.PUB, zmq.SUB)
  57. logger = self.logger
  58. handler = handlers.PUBHandler(pub)
  59. handler.setLevel(logging.DEBUG)
  60. handler.root_topic = self.topic
  61. logger.addHandler(handler)
  62. self.assertTrue(handler.socket is pub)
  63. self.assertTrue(handler.ctx is pub.context)
  64. self.assertTrue(handler.ctx is self.context)
  65. sub.setsockopt(zmq.SUBSCRIBE, b(self.topic))
  66. import time; time.sleep(0.1)
  67. msg1 = 'message'
  68. logger.info(msg1)
  69. (topic, msg2) = sub.recv_multipart()
  70. self.assertEqual(topic, b'zmq.INFO')
  71. self.assertEqual(msg2, b(msg1)+b'\n')
  72. logger.removeHandler(handler)
  73. def test_root_topic(self):
  74. logger, handler, sub = self.connect_handler()
  75. handler.socket.bind(self.iface)
  76. sub2 = sub.context.socket(zmq.SUB)
  77. self.sockets.append(sub2)
  78. sub2.connect(self.iface)
  79. sub2.setsockopt(zmq.SUBSCRIBE, b'')
  80. handler.root_topic = b'twoonly'
  81. msg1 = 'ignored'
  82. logger.info(msg1)
  83. self.assertRaisesErrno(zmq.EAGAIN, sub.recv, zmq.NOBLOCK)
  84. topic,msg2 = sub2.recv_multipart()
  85. self.assertEqual(topic, b'twoonly.INFO')
  86. self.assertEqual(msg2, b(msg1)+b'\n')
  87. logger.removeHandler(handler)
  88. def test_blank_root_topic(self):
  89. logger, handler, sub_everything = self.connect_handler()
  90. sub_everything.setsockopt(zmq.SUBSCRIBE, b'')
  91. handler.socket.bind(self.iface)
  92. sub_only_info = sub_everything.context.socket(zmq.SUB)
  93. self.sockets.append(sub_only_info)
  94. sub_only_info.connect(self.iface)
  95. sub_only_info.setsockopt(zmq.SUBSCRIBE, b'INFO')
  96. handler.setRootTopic(b'')
  97. msg_debug = 'debug_message'
  98. logger.debug(msg_debug)
  99. self.assertRaisesErrno(zmq.EAGAIN, sub_only_info.recv, zmq.NOBLOCK)
  100. topic, msg_debug_response = sub_everything.recv_multipart()
  101. self.assertEqual(topic, b'DEBUG')
  102. msg_info = 'info_message'
  103. logger.info(msg_info)
  104. topic, msg_info_response_everything = sub_everything.recv_multipart()
  105. self.assertEqual(topic, b'INFO')
  106. topic, msg_info_response_onlyinfo = sub_only_info.recv_multipart()
  107. self.assertEqual(topic, b'INFO')
  108. self.assertEqual(msg_info_response_everything, msg_info_response_onlyinfo)
  109. logger.removeHandler(handler)
  110. def test_unicode_message(self):
  111. logger, handler, sub = self.connect_handler()
  112. base_topic = b(self.topic + '.INFO')
  113. for msg, expected in [
  114. (u('hello'), [base_topic, b('hello\n')]),
  115. (u('héllo'), [base_topic, b('héllo\n')]),
  116. (u('tøpic::héllo'), [base_topic + b('.tøpic'), b('héllo\n')]),
  117. ]:
  118. logger.info(msg)
  119. received = sub.recv_multipart()
  120. self.assertEqual(received, expected)
  121. logger.removeHandler(handler)
  122. def test_set_info_formatter_via_property(self):
  123. logger, handler, sub = self.connect_handler()
  124. handler.formatters[logging.INFO] = logging.Formatter("%(message)s UNITTEST\n")
  125. handler.socket.bind(self.iface)
  126. sub.setsockopt(zmq.SUBSCRIBE, b(handler.root_topic))
  127. logger.info('info message')
  128. topic, msg = sub.recv_multipart()
  129. self.assertEqual(msg, b'info message UNITTEST\n')
  130. logger.removeHandler(handler)
  131. def test_custom_global_formatter(self):
  132. logger, handler, sub = self.connect_handler()
  133. formatter = logging.Formatter("UNITTEST %(message)s")
  134. handler.setFormatter(formatter)
  135. handler.socket.bind(self.iface)
  136. sub.setsockopt(zmq.SUBSCRIBE, b(handler.root_topic))
  137. logger.info('info message')
  138. topic, msg = sub.recv_multipart()
  139. self.assertEqual(msg, b'UNITTEST info message')
  140. logger.debug('debug message')
  141. topic, msg = sub.recv_multipart()
  142. self.assertEqual(msg, b'UNITTEST debug message')
  143. logger.removeHandler(handler)
  144. def test_custom_debug_formatter(self):
  145. logger, handler, sub = self.connect_handler()
  146. formatter = logging.Formatter("UNITTEST DEBUG %(message)s")
  147. handler.setFormatter(formatter, logging.DEBUG)
  148. handler.socket.bind(self.iface)
  149. sub.setsockopt(zmq.SUBSCRIBE, b(handler.root_topic))
  150. logger.info('info message')
  151. topic, msg = sub.recv_multipart()
  152. self.assertEqual(msg, b'info message\n')
  153. logger.debug('debug message')
  154. topic, msg = sub.recv_multipart()
  155. self.assertEqual(msg, b'UNITTEST DEBUG debug message')
  156. logger.removeHandler(handler)