Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 26fe4b7

Browse files
committed
test_logging coverage improvements.
1 parent 45456a0 commit 26fe4b7

2 files changed

Lines changed: 136 additions & 33 deletions

File tree

Lib/logging/__init__.py

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737

3838
try:
3939
import codecs
40-
except ImportError:
40+
except ImportError: #pragma: no cover
4141
codecs = None
4242

4343
try:
4444
import _thread as thread
4545
import threading
46-
except ImportError:
46+
except ImportError: #pragma: no cover
4747
thread = None
4848

4949
__author__ = "Vinay Sajip <[email protected]>"
@@ -67,16 +67,16 @@
6767
_srcfile = __file__
6868
_srcfile = os.path.normcase(_srcfile)
6969

70-
# next bit filched from 1.5.2's inspect.py
71-
def currentframe():
72-
"""Return the frame object for the caller's stack frame."""
73-
try:
74-
raise Exception
75-
except:
76-
return sys.exc_info()[2].tb_frame.f_back
7770

78-
if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
79-
# done filching
71+
if hasattr(sys, '_getframe'):
72+
currentframe = lambda: sys._getframe(3)
73+
else: #pragma: no cover
74+
def currentframe():
75+
"""Return the frame object for the caller's stack frame."""
76+
try:
77+
raise Exception
78+
except:
79+
return sys.exc_info()[2].tb_frame.f_back
8080

8181
# _srcfile is only used in conjunction with sys._getframe().
8282
# To provide compatibility with older versions of Python, set _srcfile
@@ -94,22 +94,22 @@ def currentframe():
9494
#raiseExceptions is used to see if exceptions during handling should be
9595
#propagated
9696
#
97-
raiseExceptions = 1
97+
raiseExceptions = True
9898

9999
#
100100
# If you don't want threading information in the log, set this to zero
101101
#
102-
logThreads = 1
102+
logThreads = True
103103

104104
#
105105
# If you don't want multiprocessing information in the log, set this to zero
106106
#
107-
logMultiprocessing = 1
107+
logMultiprocessing = True
108108

109109
#
110110
# If you don't want process information in the log, set this to zero
111111
#
112-
logProcesses = 1
112+
logProcesses = True
113113

114114
#---------------------------------------------------------------------------
115115
# Level related stuff
@@ -201,7 +201,7 @@ def _checkLevel(level):
201201
#
202202
if thread:
203203
_lock = threading.RLock()
204-
else:
204+
else: #pragma: no cover
205205
_lock = None
206206

207207

@@ -281,10 +281,10 @@ def __init__(self, name, level, pathname, lineno,
281281
if logThreads and thread:
282282
self.thread = thread.get_ident()
283283
self.threadName = threading.current_thread().name
284-
else:
284+
else: # pragma: no cover
285285
self.thread = None
286286
self.threadName = None
287-
if not logMultiprocessing:
287+
if not logMultiprocessing: # pragma: no cover
288288
self.processName = None
289289
else:
290290
self.processName = 'MainProcess'
@@ -644,11 +644,11 @@ def filter(self, record):
644644
yes. If deemed appropriate, the record may be modified in-place.
645645
"""
646646
if self.nlen == 0:
647-
return 1
647+
return True
648648
elif self.name == record.name:
649-
return 1
649+
return True
650650
elif record.name.find(self.name, 0, self.nlen) != 0:
651-
return 0
651+
return False
652652
return (record.name[self.nlen] == ".")
653653

654654
class Filterer(object):
@@ -775,7 +775,7 @@ def createLock(self):
775775
"""
776776
if thread:
777777
self.lock = threading.RLock()
778-
else:
778+
else: #pragma: no cover
779779
self.lock = None
780780

781781
def acquire(self):
@@ -939,7 +939,7 @@ def emit(self, record):
939939
stream.write(msg)
940940
stream.write(self.terminator)
941941
self.flush()
942-
except (KeyboardInterrupt, SystemExit):
942+
except (KeyboardInterrupt, SystemExit): #pragma: no cover
943943
raise
944944
except:
945945
self.handleError(record)
@@ -948,13 +948,13 @@ class FileHandler(StreamHandler):
948948
"""
949949
A handler class which writes formatted logging records to disk files.
950950
"""
951-
def __init__(self, filename, mode='a', encoding=None, delay=0):
951+
def __init__(self, filename, mode='a', encoding=None, delay=False):
952952
"""
953953
Open the specified file and use it as the stream for logging.
954954
"""
955955
#keep the absolute path, otherwise derived classes which use this
956956
#may come a cropper when the current directory changes
957-
if codecs is None:
957+
if codecs is None: #pragma: no cover
958958
encoding = None
959959
self.baseFilename = os.path.abspath(filename)
960960
self.mode = mode
@@ -1352,9 +1352,9 @@ def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
13521352
#IronPython can use logging.
13531353
try:
13541354
fn, lno, func, sinfo = self.findCaller(stack_info)
1355-
except ValueError:
1355+
except ValueError: # pragma: no cover
13561356
fn, lno, func = "(unknown file)", 0, "(unknown function)"
1357-
else:
1357+
else: # pragma: no cover
13581358
fn, lno, func = "(unknown file)", 0, "(unknown function)"
13591359
if exc_info:
13601360
if not isinstance(exc_info, tuple):
@@ -1465,7 +1465,7 @@ def isEnabledFor(self, level):
14651465
Is this logger enabled for level 'level'?
14661466
"""
14671467
if self.manager.disable >= level:
1468-
return 0
1468+
return False
14691469
return level >= self.getEffectiveLevel()
14701470

14711471
def getChild(self, suffix):

Lib/test/test_logging.py

Lines changed: 108 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,37 @@ def test_specific_filters(self):
494494
handler.removeFilter(garr)
495495

496496

497+
class HandlerTest(BaseTest):
498+
def test_name(self):
499+
h = logging.Handler()
500+
h.name = 'generic'
501+
self.assertEqual(h.name, 'generic')
502+
h.name = 'anothergeneric'
503+
self.assertEqual(h.name, 'anothergeneric')
504+
self.assertRaises(NotImplementedError, h.emit, None)
505+
506+
def test_abc(self):
507+
pass
508+
509+
class BadStream(object):
510+
def write(self, data):
511+
raise RuntimeError('deliberate mistake')
512+
513+
class TestStreamHandler(logging.StreamHandler):
514+
def handleError(self, record):
515+
self.error_record = record
516+
517+
class StreamHandlerTest(BaseTest):
518+
def test_error_handling(self):
519+
h = TestStreamHandler(BadStream())
520+
r = logging.makeLogRecord({})
521+
old_raise = logging.raiseExceptions
522+
try:
523+
h.handle(r)
524+
self.assertIs(h.error_record, r)
525+
finally:
526+
logging.raiseExceptions = old_raise
527+
497528
class MemoryHandlerTest(BaseTest):
498529

499530
"""Tests for the MemoryHandler."""
@@ -2196,6 +2227,39 @@ def test_dollars(self):
21962227
f = logging.Formatter('asctime', style='$')
21972228
self.assertFalse(f.usesTime())
21982229

2230+
def test_invalid_style(self):
2231+
self.assertRaises(ValueError, logging.Formatter, None, None, 'x')
2232+
2233+
def test_time(self):
2234+
r = self.get_record()
2235+
r.created = 735375780.0 # 21 April 1993 08:03:00
2236+
r.msecs = 123
2237+
f = logging.Formatter('%(asctime)s %(message)s')
2238+
self.assertEqual(f.formatTime(r), '1993-04-21 08:03:00,123')
2239+
self.assertEqual(f.formatTime(r, '%Y:%d'), '1993:21')
2240+
2241+
class ExceptionTest(BaseTest):
2242+
def test_formatting(self):
2243+
r = self.root_logger
2244+
h = RecordingHandler()
2245+
r.addHandler(h)
2246+
try:
2247+
raise RuntimeError('deliberate mistake')
2248+
except:
2249+
logging.exception('failed', stack_info=True)
2250+
r.removeHandler(h)
2251+
h.close()
2252+
r = h.records[0]
2253+
self.assertTrue(r.exc_text.startswith('Traceback (most recent '
2254+
'call last):\n'))
2255+
self.assertTrue(r.exc_text.endswith('\nRuntimeError: '
2256+
'deliberate mistake'))
2257+
self.assertTrue(r.stack_info.startswith('Stack (most recent '
2258+
'call last):\n'))
2259+
self.assertTrue(r.stack_info.endswith('logging.exception(\'failed\', '
2260+
'stack_info=True)'))
2261+
2262+
21992263
class LastResortTest(BaseTest):
22002264
def test_last_resort(self):
22012265
# Test the last resort handler
@@ -2407,6 +2471,23 @@ class MyLogger(logging.Logger):
24072471
logging.setLoggerClass(logging.Logger)
24082472
self.assertEqual(logging.getLoggerClass(), logging.Logger)
24092473

2474+
class LogRecordTest(BaseTest):
2475+
def test_str_rep(self):
2476+
r = logging.makeLogRecord({})
2477+
s = str(r)
2478+
self.assertTrue(s.startswith('<LogRecord: '))
2479+
self.assertTrue(s.endswith('>'))
2480+
2481+
def test_dict_arg(self):
2482+
h = RecordingHandler()
2483+
r = logging.getLogger()
2484+
r.addHandler(h)
2485+
d = {'less' : 'more' }
2486+
logging.warning('less is %(less)s', d)
2487+
self.assertIs(h.records[0].args, d)
2488+
self.assertEqual(h.records[0].message, 'less is more')
2489+
r.removeHandler(h)
2490+
h.close()
24102491

24112492
class BasicConfigTest(unittest.TestCase):
24122493

@@ -2508,6 +2589,9 @@ def test_level(self):
25082589

25092590
logging.basicConfig(level=57)
25102591
self.assertEqual(logging.root.level, 57)
2592+
# Test that second call has no effect
2593+
logging.basicConfig(level=58)
2594+
self.assertEqual(logging.root.level, 57)
25112595

25122596
def test_incompatible(self):
25132597
assertRaises = self.assertRaises
@@ -2521,12 +2605,20 @@ def test_incompatible(self):
25212605
handlers=handlers)
25222606

25232607
def test_handlers(self):
2524-
handlers = [logging.StreamHandler(), logging.StreamHandler(sys.stdout)]
2608+
handlers = [
2609+
logging.StreamHandler(),
2610+
logging.StreamHandler(sys.stdout),
2611+
logging.StreamHandler(),
2612+
]
2613+
f = logging.Formatter()
2614+
handlers[2].setFormatter(f)
25252615
logging.basicConfig(handlers=handlers)
25262616
self.assertIs(handlers[0], logging.root.handlers[0])
25272617
self.assertIs(handlers[1], logging.root.handlers[1])
2618+
self.assertIs(handlers[2], logging.root.handlers[2])
25282619
self.assertIsNotNone(handlers[0].formatter)
25292620
self.assertIsNotNone(handlers[1].formatter)
2621+
self.assertIs(handlers[2].formatter, f)
25302622
self.assertIs(handlers[0].formatter, handlers[1].formatter)
25312623

25322624
def _test_log(self, method, level=None):
@@ -2758,6 +2850,17 @@ def assertLogFile(self, filename):
27582850
self.rmfiles.append(filename)
27592851

27602852

2853+
class FileHandlerTest(BaseFileTest):
2854+
def test_delay(self):
2855+
os.unlink(self.fn)
2856+
fh = logging.FileHandler(self.fn, delay=True)
2857+
self.assertIsNone(fh.stream)
2858+
self.assertFalse(os.path.exists(self.fn))
2859+
fh.handle(logging.makeLogRecord({}))
2860+
self.assertIsNotNone(fh.stream)
2861+
self.assertTrue(os.path.exists(self.fn))
2862+
fh.close()
2863+
27612864
class RotatingFileHandlerTest(BaseFileTest):
27622865
def next_rec(self):
27632866
return logging.LogRecord('n', logging.DEBUG, 'p', 1,
@@ -2851,15 +2954,15 @@ def test_compute_rollover(self, when=when, exp=exp):
28512954
@run_with_locale('LC_ALL', '')
28522955
def test_main():
28532956
run_unittest(BuiltinLevelsTest, BasicFilterTest,
2854-
CustomLevelsAndFiltersTest, MemoryHandlerTest,
2957+
CustomLevelsAndFiltersTest, HandlerTest, MemoryHandlerTest,
28552958
ConfigFileTest, SocketHandlerTest, MemoryTest,
28562959
EncodingTest, WarningsTest, ConfigDictTest, ManagerTest,
2857-
FormatterTest,
2960+
FormatterTest, StreamHandlerTest,
28582961
LogRecordFactoryTest, ChildLoggerTest, QueueHandlerTest,
28592962
ShutdownTest, ModuleLevelMiscTest, BasicConfigTest,
28602963
LoggerAdapterTest, LoggerTest,
2861-
RotatingFileHandlerTest,
2862-
LastResortTest,
2964+
FileHandlerTest, RotatingFileHandlerTest,
2965+
LastResortTest, LogRecordTest, ExceptionTest,
28632966
TimedRotatingFileHandlerTest
28642967
)
28652968

0 commit comments

Comments
 (0)