@@ -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+
497528class 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 ('\n RuntimeError: '
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+
21992263class 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
24112492class 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+
27612864class 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' , '' )
28522955def 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