test_log.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from __future__ import with_statement
  2. import os
  3. import sys
  4. import logging
  5. import unittest
  6. from tempfile import mktemp
  7. from StringIO import StringIO
  8. from contextlib import contextmanager
  9. from carrot.utils import rpartition
  10. from celery.log import (setup_logger, emergency_error,
  11. redirect_stdouts_to_logger, LoggingProxy)
  12. from celery.tests.utils import override_stdouts
  13. @contextmanager
  14. def wrap_logger(logger, loglevel=logging.ERROR):
  15. old_handlers = logger.handlers
  16. sio = StringIO()
  17. siohandler = logging.StreamHandler(sio)
  18. logger.handlers = [siohandler]
  19. yield sio
  20. logger.handlers = old_handlers
  21. class TestLog(unittest.TestCase):
  22. def _assertLog(self, logger, logmsg, loglevel=logging.ERROR):
  23. with wrap_logger(logger, loglevel=loglevel) as sio:
  24. logger.log(loglevel, logmsg)
  25. return sio.getvalue().strip()
  26. def assertDidLogTrue(self, logger, logmsg, reason, loglevel=None):
  27. val = self._assertLog(logger, logmsg, loglevel=loglevel)
  28. return self.assertEqual(val, logmsg, reason)
  29. def assertDidLogFalse(self, logger, logmsg, reason, loglevel=None):
  30. val = self._assertLog(logger, logmsg, loglevel=loglevel)
  31. return self.assertFalse(val, reason)
  32. def test_setup_logger(self):
  33. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  34. logger.handlers = [] # Reset previously set logger.
  35. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  36. self.assertTrue(logger.handlers[0].stream is sys.stderr,
  37. "setup_logger logs to stderr without logfile argument.")
  38. #self.assertTrue(logger._process_aware,
  39. # "setup_logger() returns process aware logger.")
  40. self.assertDidLogTrue(logger, "Logging something",
  41. "Logger logs error when loglevel is ERROR",
  42. loglevel=logging.ERROR)
  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.assertEquals(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. with override_stdouts() as outs:
  56. stdout, stderr = outs
  57. l = setup_logger(logfile=stderr, loglevel=logging.INFO)
  58. l.info("The quick brown fox...")
  59. self.assertTrue("The quick brown fox..." in stderr.getvalue())
  60. def test_setup_logger_no_handlers_file(self):
  61. from multiprocessing import get_logger
  62. l = get_logger()
  63. l.handlers = []
  64. tempfile = mktemp(suffix="unittest", prefix="celery")
  65. l = setup_logger(logfile=tempfile, loglevel=0)
  66. self.assertTrue(isinstance(l.handlers[0], logging.FileHandler))
  67. def test_emergency_error_stderr(self):
  68. with override_stdouts() as outs:
  69. stdout, stderr = outs
  70. emergency_error(None, "The lazy dog crawls under the fast fox")
  71. self.assertTrue("The lazy dog crawls under the fast fox" in \
  72. stderr.getvalue())
  73. def test_emergency_error_file(self):
  74. tempfile = mktemp(suffix="unittest", prefix="celery")
  75. emergency_error(tempfile, "Vandelay Industries")
  76. with open(tempfile, "r") as tempfilefh:
  77. self.assertTrue("Vandelay Industries" in "".join(tempfilefh))
  78. os.unlink(tempfile)
  79. def test_redirect_stdouts(self):
  80. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  81. try:
  82. with wrap_logger(logger) as sio:
  83. redirect_stdouts_to_logger(logger, loglevel=logging.ERROR)
  84. logger.error("foo")
  85. self.assertTrue("foo" in sio.getvalue())
  86. finally:
  87. sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__
  88. def test_logging_proxy(self):
  89. logger = setup_logger(loglevel=logging.ERROR, logfile=None)
  90. with wrap_logger(logger) as sio:
  91. p = LoggingProxy(logger)
  92. p.close()
  93. p.write("foo")
  94. self.assertTrue("foo" not in sio.getvalue())
  95. p.closed = False
  96. p.write("foo")
  97. self.assertTrue("foo" in sio.getvalue())
  98. lines = ["baz", "xuzzy"]
  99. p.writelines(lines)
  100. for line in lines:
  101. self.assertTrue(line in sio.getvalue())
  102. p.flush()
  103. p.close()
  104. self.assertFalse(p.isatty())
  105. self.assertTrue(p.fileno() is None)