test_log.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. from __future__ import generators
  2. import os
  3. import sys
  4. import logging
  5. import unittest2 as unittest
  6. from tempfile import mktemp
  7. from StringIO import StringIO
  8. try:
  9. from contextlib import contextmanager
  10. except ImportError:
  11. from celery.tests.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 celery.tests.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.assertIs(logger.handlers[0].stream, sys.__stderr__,
  42. "setup_logger logs to stderr without logfile argument.")
  43. self.assertDidLogFalse(logger, "Logging something",
  44. "Logger doesn't info when loglevel is ERROR",
  45. loglevel=logging.INFO)
  46. def test_emergency_error(self):
  47. sio = StringIO()
  48. emergency_error(sio, "Testing emergency error facility")
  49. self.assertEqual(rpartition(sio.getvalue(), ":")[2].strip(),
  50. "Testing emergency error facility")
  51. def test_setup_logger_no_handlers_stream(self):
  52. from multiprocessing import get_logger
  53. l = get_logger()
  54. l.handlers = []
  55. def with_override_stdouts(outs):
  56. stdout, stderr = outs
  57. l = setup_logger(logfile=stderr, loglevel=logging.INFO)
  58. l.info("The quick brown fox...")
  59. self.assertIn("The quick brown fox...", stderr.getvalue())
  60. context = override_stdouts()
  61. execute_context(context, with_override_stdouts)
  62. def test_setup_logger_no_handlers_file(self):
  63. from multiprocessing import get_logger
  64. l = get_logger()
  65. l.handlers = []
  66. tempfile = mktemp(suffix="unittest", prefix="celery")
  67. l = setup_logger(logfile=tempfile, loglevel=0)
  68. self.assertIsInstance(l.handlers[0], logging.FileHandler)
  69. def test_emergency_error_stderr(self):
  70. def with_override_stdouts(outs):
  71. stdout, stderr = outs
  72. emergency_error(None, "The lazy dog crawls under the fast fox")
  73. self.assertIn("The lazy dog crawls under the fast fox",
  74. stderr.getvalue())
  75. context = override_stdouts()
  76. execute_context(context, with_override_stdouts)
  77. def test_emergency_error_file(self):
  78. tempfile = mktemp(suffix="unittest", prefix="celery")
  79. emergency_error(tempfile, "Vandelay Industries")
  80. tempfilefh = open(tempfile, "r")
  81. try:
  82. self.assertIn("Vandelay Industries", "".join(tempfilefh))
  83. finally:
  84. tempfilefh.close()
  85. os.unlink(tempfile)
  86. def test_redirect_stdouts(self):
  87. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  88. try:
  89. def with_wrap_logger(sio):
  90. redirect_stdouts_to_logger(logger, loglevel=logging.ERROR)
  91. logger.error("foo")
  92. self.assertIn("foo", sio.getvalue())
  93. context = wrap_logger(logger)
  94. execute_context(context, with_wrap_logger)
  95. finally:
  96. sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__
  97. def test_logging_proxy(self):
  98. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  99. def with_wrap_logger(sio):
  100. p = LoggingProxy(logger)
  101. p.close()
  102. p.write("foo")
  103. self.assertNotIn("foo", sio.getvalue())
  104. p.closed = False
  105. p.write("foo")
  106. self.assertIn("foo", sio.getvalue())
  107. lines = ["baz", "xuzzy"]
  108. p.writelines(lines)
  109. for line in lines:
  110. self.assertIn(line, sio.getvalue())
  111. p.flush()
  112. p.close()
  113. self.assertFalse(p.isatty())
  114. self.assertIsNone(p.fileno())
  115. context = wrap_logger(logger)
  116. execute_context(context, with_wrap_logger)