from __future__ import absolute_import import sys import logging from tempfile import mktemp from mock import patch, Mock from nose import SkipTest from celery import signals from celery.app.log import TaskFormatter from celery.utils.log import LoggingProxy from celery.utils import uuid from celery.utils.log import ( get_logger, ColorFormatter, logger as base_logger, get_task_logger, task_logger, in_sighandler, logger_isa, _patch_logger_class, ) from celery.tests.case import ( AppCase, override_stdouts, wrap_logger, get_handlers, restore_logging, ) class test_TaskFormatter(AppCase): def test_no_task(self): class Record(object): msg = 'hello world' levelname = 'info' exc_text = exc_info = None stack_info = None def getMessage(self): return self.msg record = Record() x = TaskFormatter() x.format(record) self.assertEqual(record.task_name, '???') self.assertEqual(record.task_id, '???') class test_logger_isa(AppCase): def test_isa(self): x = get_task_logger('Z1george') self.assertTrue(logger_isa(x, task_logger)) prev_x, x.parent = x.parent, None try: self.assertFalse(logger_isa(x, task_logger)) finally: x.parent = prev_x y = get_task_logger('Z1elaine') y.parent = x self.assertTrue(logger_isa(y, task_logger)) self.assertTrue(logger_isa(y, x)) self.assertTrue(logger_isa(y, y)) z = get_task_logger('Z1jerry') z.parent = y self.assertTrue(logger_isa(z, task_logger)) self.assertTrue(logger_isa(z, y)) self.assertTrue(logger_isa(z, x)) self.assertTrue(logger_isa(z, z)) def test_recursive(self): x = get_task_logger('X1foo') prev, x.parent = x.parent, x try: with self.assertRaises(RuntimeError): logger_isa(x, task_logger) finally: x.parent = prev y = get_task_logger('X2foo') z = get_task_logger('X2foo') prev_y, y.parent = y.parent, z try: prev_z, z.parent = z.parent, y try: with self.assertRaises(RuntimeError): logger_isa(y, task_logger) finally: z.parent = prev_z finally: y.parent = prev_y class test_ColorFormatter(AppCase): @patch('celery.utils.log.safe_str') @patch('logging.Formatter.formatException') def test_formatException_not_string(self, fe, safe_str): x = ColorFormatter('HELLO') value = KeyError() fe.return_value = value self.assertIs(x.formatException(value), value) self.assertTrue(fe.called) self.assertFalse(safe_str.called) @patch('logging.Formatter.formatException') @patch('celery.utils.log.safe_str') def test_formatException_string(self, safe_str, fe, value='HELLO'): x = ColorFormatter(value) fe.return_value = value self.assertTrue(x.formatException(value)) if sys.version_info[0] == 2: self.assertTrue(safe_str.called) @patch('logging.Formatter.format') def test_format_object(self, _format): x = ColorFormatter(object()) x.use_color = True record = Mock() record.levelname = 'ERROR' record.msg = object() self.assertTrue(x.format(record)) @patch('celery.utils.log.safe_str') def test_format_raises(self, safe_str): x = ColorFormatter('HELLO') def on_safe_str(s): try: raise ValueError('foo') finally: safe_str.side_effect = None safe_str.side_effect = on_safe_str class Record(object): levelname = 'ERROR' msg = 'HELLO' exc_text = 'error text' stack_info = None def __str__(self): return on_safe_str('') def getMessage(self): return self.msg record = Record() safe_str.return_value = record x.format(record) self.assertIn('