test_log.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. from __future__ import generators
  2. import os
  3. import sys
  4. import logging
  5. import unittest
  6. from tempfile import mktemp
  7. from StringIO import StringIO
  8. try:
  9. from contextlib import contextmanager
  10. except ImportError:
  11. from testunits.utils import fallback_contextmanager as contextmanager
  12. from carrot.utils import rpartition
  13. from celery.log import (setup_logger, emergency_error,
  14. redirect_stdouts_to_logger, LoggingProxy)
  15. from testunits.utils import override_stdouts, execute_context
  16. @contextmanager
  17. def wrap_logger(logger, loglevel=logging.ERROR):
  18. old_handlers = logger.handlers
  19. sio = StringIO()
  20. siohandler = logging.StreamHandler(sio)
  21. logger.handlers = [siohandler]
  22. yield sio
  23. logger.handlers = old_handlers
  24. class TestLog(unittest.TestCase):
  25. def _assertLog(self, logger, logmsg, loglevel=logging.ERROR):
  26. def with_wrap_logger(sio):
  27. logger.log(loglevel, logmsg)
  28. return sio.getvalue().strip()
  29. context = wrap_logger(logger, loglevel=loglevel)
  30. execute_context(context, with_wrap_logger)
  31. def assertDidLogTrue(self, logger, logmsg, reason, loglevel=None):
  32. val = self._assertLog(logger, logmsg, loglevel=loglevel)
  33. return self.assertEqual(val, logmsg, reason)
  34. def assertDidLogFalse(self, logger, logmsg, reason, loglevel=None):
  35. val = self._assertLog(logger, logmsg, loglevel=loglevel)
  36. return self.assertFalse(val, reason)
  37. def test_setup_logger(self):
  38. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  39. logger.handlers = [] # Reset previously set logger.
  40. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  41. self.assertTrue(logger.handlers[0].stream is sys.__stderr__,
  42. "setup_logger logs to stderr without logfile argument.")
  43. #self.assertTrue(logger._process_aware,
  44. # "setup_logger() returns process aware logger.")
  45. #self.assertDidLogTrue(logger, "Logging something",
  46. # "Logger logs error when loglevel is ERROR",
  47. # loglevel=logging.ERROR)
  48. self.assertDidLogFalse(logger, "Logging something",
  49. "Logger doesn't info when loglevel is ERROR",
  50. loglevel=logging.INFO)
  51. def test_emergency_error(self):
  52. sio = StringIO()
  53. emergency_error(sio, "Testing emergency error facility")
  54. self.assertEquals(rpartition(sio.getvalue(), ":")[2].strip(),
  55. "Testing emergency error facility")
  56. def test_setup_logger_no_handlers_stream(self):
  57. from multiprocessing import get_logger
  58. l = get_logger()
  59. l.handlers = []
  60. def with_override_stdouts(outs):
  61. stdout, stderr = outs
  62. l = setup_logger(logfile=stderr, loglevel=logging.INFO)
  63. l.info("The quick brown fox...")
  64. self.assertTrue("The quick brown fox..." in stderr.getvalue())
  65. context = override_stdouts()
  66. execute_context(context, with_override_stdouts)
  67. def test_setup_logger_no_handlers_file(self):
  68. from multiprocessing import get_logger
  69. l = get_logger()
  70. l.handlers = []
  71. tempfile = mktemp(suffix="unittest", prefix="celery")
  72. l = setup_logger(logfile=tempfile, loglevel=0)
  73. self.assertTrue(isinstance(l.handlers[0], logging.FileHandler))
  74. def test_emergency_error_stderr(self):
  75. def with_override_stdouts(outs):
  76. stdout, stderr = outs
  77. emergency_error(None, "The lazy dog crawls under the fast fox")
  78. self.assertTrue("The lazy dog crawls under the fast fox" in
  79. stderr.getvalue())
  80. context = override_stdouts()
  81. execute_context(context, with_override_stdouts)
  82. def test_emergency_error_file(self):
  83. tempfile = mktemp(suffix="unittest", prefix="celery")
  84. emergency_error(tempfile, "Vandelay Industries")
  85. tempfilefh = open(tempfile, "r")
  86. try:
  87. self.assertTrue("Vandelay Industries" in "".join(tempfilefh))
  88. finally:
  89. tempfilefh.close()
  90. os.unlink(tempfile)
  91. def test_redirect_stdouts(self):
  92. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  93. try:
  94. def with_wrap_logger(sio):
  95. redirect_stdouts_to_logger(logger, loglevel=logging.ERROR)
  96. logger.error("foo")
  97. self.assertTrue("foo" in sio.getvalue())
  98. context = wrap_logger(logger)
  99. execute_context(context, with_wrap_logger)
  100. finally:
  101. sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__
  102. def test_logging_proxy(self):
  103. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  104. def with_wrap_logger(sio):
  105. p = LoggingProxy(logger)
  106. p.close()
  107. p.write("foo")
  108. self.assertTrue("foo" not in sio.getvalue())
  109. p.closed = False
  110. p.write("foo")
  111. self.assertTrue("foo" in sio.getvalue())
  112. lines = ["baz", "xuzzy"]
  113. p.writelines(lines)
  114. for line in lines:
  115. self.assertTrue(line in sio.getvalue())
  116. p.flush()
  117. p.close()
  118. self.assertFalse(p.isatty())
  119. self.assertTrue(p.fileno() is None)
  120. context = wrap_logger(logger)
  121. execute_context(context, with_wrap_logger)