blob: 127cf84442baa4af564cbc5a137c474ddc3aa101 [file] [log] [blame]
Neal Norwitzb4a2df02003-01-02 14:56:39 +00001#!/usr/bin/env python
2#
Vinay Sajip7dc8ec92004-06-02 10:51:05 +00003# Copyright 2001-2004 by Vinay Sajip. All Rights Reserved.
Neal Norwitzb4a2df02003-01-02 14:56:39 +00004#
5# Permission to use, copy, modify, and distribute this software and its
6# documentation for any purpose and without fee is hereby granted,
7# provided that the above copyright notice appear in all copies and that
8# both that copyright notice and this permission notice appear in
9# supporting documentation, and that the name of Vinay Sajip
10# not be used in advertising or publicity pertaining to distribution
11# of the software without specific, written prior permission.
12# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
13# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
14# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
15# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
16# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18#
19# This file is part of the Python logging distribution. See
20# http://www.red-dove.com/python_logging.html
21#
22"""Test harness for the logging module. Run all tests.
23
24Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
25"""
26
Guido van Rossum2a1d5162003-01-21 21:05:22 +000027import select
Guido van Rossum34d19282007-08-09 01:03:29 +000028import os, sys, struct, pickle, io
Vinay Sajip22b25aa2006-01-16 21:24:38 +000029import socket, tempfile, threading, time
Neal Norwitzb4a2df02003-01-02 14:56:39 +000030import logging, logging.handlers, logging.config
Thomas Wouters477c8d52006-05-27 19:21:47 +000031from test.test_support import run_with_locale
Neal Norwitzb4a2df02003-01-02 14:56:39 +000032
Neal Norwitzb4a2df02003-01-02 14:56:39 +000033BANNER = "-- %-10s %-6s ---------------------------------------------------\n"
34
Guido van Rossum376e6362003-04-25 14:22:00 +000035FINISH_UP = "Finish up, it's closing time. Messages should bear numbers 0 through 24."
36
Neal Norwitzb4a2df02003-01-02 14:56:39 +000037#----------------------------------------------------------------------------
38# Log receiver
39#----------------------------------------------------------------------------
40
41TIMEOUT = 10
42
43from SocketServer import ThreadingTCPServer, StreamRequestHandler
44
45class LogRecordStreamHandler(StreamRequestHandler):
46 """
47 Handler for a streaming logging request. It basically logs the record
48 using whatever logging policy is configured locally.
49 """
50
51 def handle(self):
52 """
53 Handle multiple requests - each expected to be a 4-byte length,
54 followed by the LogRecord in pickle format. Logs the record
55 according to whatever policy is configured locally.
56 """
57 while 1:
58 try:
59 chunk = self.connection.recv(4)
60 if len(chunk) < 4:
61 break
62 slen = struct.unpack(">L", chunk)[0]
Neal Norwitzb4a2df02003-01-02 14:56:39 +000063 chunk = self.connection.recv(slen)
64 while len(chunk) < slen:
65 chunk = chunk + self.connection.recv(slen - len(chunk))
66 obj = self.unPickle(chunk)
Raymond Hettinger6f3eaa62003-06-27 21:43:39 +000067 record = logging.makeLogRecord(obj)
Neal Norwitzb4a2df02003-01-02 14:56:39 +000068 self.handleLogRecord(record)
69 except:
70 raise
71
72 def unPickle(self, data):
Guido van Rossumbf12cdb2006-08-17 20:24:18 +000073 return pickle.loads(data)
Neal Norwitzb4a2df02003-01-02 14:56:39 +000074
75 def handleLogRecord(self, record):
76 logname = "logrecv.tcp." + record.name
Guido van Rossum376e6362003-04-25 14:22:00 +000077 #If the end-of-messages sentinel is seen, tell the server to terminate
78 if record.msg == FINISH_UP:
79 self.server.abort = 1
Neal Norwitzb4a2df02003-01-02 14:56:39 +000080 record.msg = record.msg + " (via " + logname + ")"
81 logger = logging.getLogger(logname)
82 logger.handle(record)
83
Brett Cannonf9addb62003-04-30 05:32:32 +000084# The server sets socketDataProcessed when it's done.
85socketDataProcessed = threading.Event()
Guido van Rossum376e6362003-04-25 14:22:00 +000086
Neal Norwitzb4a2df02003-01-02 14:56:39 +000087class LogRecordSocketReceiver(ThreadingTCPServer):
88 """
89 A simple-minded TCP socket-based logging receiver suitable for test
90 purposes.
91 """
92
93 allow_reuse_address = 1
94
95 def __init__(self, host='localhost',
96 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
97 handler=LogRecordStreamHandler):
98 ThreadingTCPServer.__init__(self, (host, port), handler)
99 self.abort = 0
100 self.timeout = 1
101
102 def serve_until_stopped(self):
Neal Norwitz55cd82f2006-02-05 08:21:08 +0000103 while not self.abort:
Neal Norwitz5bab0f82006-03-05 02:16:12 +0000104 rd, wr, ex = select.select([self.socket.fileno()], [], [],
105 self.timeout)
106 if rd:
107 self.handle_request()
Guido van Rossum376e6362003-04-25 14:22:00 +0000108 #notify the main thread that we're about to exit
Brett Cannonf9addb62003-04-30 05:32:32 +0000109 socketDataProcessed.set()
Martin v. Löwisf6848882006-01-29 19:55:18 +0000110 # close the listen socket
111 self.server_close()
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000112
Guido van Rossum2a1d5162003-01-21 21:05:22 +0000113 def process_request(self, request, client_address):
114 #import threading
115 t = threading.Thread(target = self.finish_request,
116 args = (request, client_address))
117 t.start()
118
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000119def runTCP(tcpserver):
120 tcpserver.serve_until_stopped()
121
122#----------------------------------------------------------------------------
123# Test 0
124#----------------------------------------------------------------------------
125
126msgcount = 0
127
128def nextmessage():
129 global msgcount
130 rv = "Message %d" % msgcount
131 msgcount = msgcount + 1
132 return rv
133
134def test0():
135 ERR = logging.getLogger("ERR")
136 ERR.setLevel(logging.ERROR)
137 INF = logging.getLogger("INF")
138 INF.setLevel(logging.INFO)
139 INF_ERR = logging.getLogger("INF.ERR")
140 INF_ERR.setLevel(logging.ERROR)
141 DEB = logging.getLogger("DEB")
142 DEB.setLevel(logging.DEBUG)
143
144 INF_UNDEF = logging.getLogger("INF.UNDEF")
145 INF_ERR_UNDEF = logging.getLogger("INF.ERR.UNDEF")
146 UNDEF = logging.getLogger("UNDEF")
147
148 GRANDCHILD = logging.getLogger("INF.BADPARENT.UNDEF")
149 CHILD = logging.getLogger("INF.BADPARENT")
150
151 #These should log
152 ERR.log(logging.FATAL, nextmessage())
153 ERR.error(nextmessage())
154
155 INF.log(logging.FATAL, nextmessage())
156 INF.error(nextmessage())
157 INF.warn(nextmessage())
158 INF.info(nextmessage())
159
160 INF_UNDEF.log(logging.FATAL, nextmessage())
161 INF_UNDEF.error(nextmessage())
162 INF_UNDEF.warn (nextmessage())
163 INF_UNDEF.info (nextmessage())
164
165 INF_ERR.log(logging.FATAL, nextmessage())
166 INF_ERR.error(nextmessage())
167
168 INF_ERR_UNDEF.log(logging.FATAL, nextmessage())
169 INF_ERR_UNDEF.error(nextmessage())
170
171 DEB.log(logging.FATAL, nextmessage())
172 DEB.error(nextmessage())
173 DEB.warn (nextmessage())
174 DEB.info (nextmessage())
175 DEB.debug(nextmessage())
176
177 UNDEF.log(logging.FATAL, nextmessage())
178 UNDEF.error(nextmessage())
179 UNDEF.warn (nextmessage())
180 UNDEF.info (nextmessage())
181
182 GRANDCHILD.log(logging.FATAL, nextmessage())
183 CHILD.log(logging.FATAL, nextmessage())
184
185 #These should not log
186 ERR.warn(nextmessage())
187 ERR.info(nextmessage())
188 ERR.debug(nextmessage())
189
190 INF.debug(nextmessage())
191 INF_UNDEF.debug(nextmessage())
192
193 INF_ERR.warn(nextmessage())
194 INF_ERR.info(nextmessage())
195 INF_ERR.debug(nextmessage())
196 INF_ERR_UNDEF.warn(nextmessage())
197 INF_ERR_UNDEF.info(nextmessage())
198 INF_ERR_UNDEF.debug(nextmessage())
199
Guido van Rossum376e6362003-04-25 14:22:00 +0000200 INF.info(FINISH_UP)
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000201
202#----------------------------------------------------------------------------
203# Test 1
204#----------------------------------------------------------------------------
205
206#
207# First, we define our levels. There can be as many as you want - the only
208# limitations are that they should be integers, the lowest should be > 0 and
209# larger values mean less information being logged. If you need specific
210# level values which do not fit into these limitations, you can use a
211# mapping dictionary to convert between your application levels and the
212# logging system.
213#
214SILENT = 10
215TACITURN = 9
216TERSE = 8
217EFFUSIVE = 7
218SOCIABLE = 6
219VERBOSE = 5
220TALKATIVE = 4
221GARRULOUS = 3
222CHATTERBOX = 2
223BORING = 1
224
225LEVEL_RANGE = range(BORING, SILENT + 1)
226
227#
228# Next, we define names for our levels. You don't need to do this - in which
229# case the system will use "Level n" to denote the text for the level.
230#
231my_logging_levels = {
232 SILENT : 'Silent',
233 TACITURN : 'Taciturn',
234 TERSE : 'Terse',
235 EFFUSIVE : 'Effusive',
236 SOCIABLE : 'Sociable',
237 VERBOSE : 'Verbose',
238 TALKATIVE : 'Talkative',
239 GARRULOUS : 'Garrulous',
240 CHATTERBOX : 'Chatterbox',
241 BORING : 'Boring',
242}
243
244#
245# Now, to demonstrate filtering: suppose for some perverse reason we only
246# want to print out all except GARRULOUS messages. Let's create a filter for
247# this purpose...
248#
249class SpecificLevelFilter(logging.Filter):
250 def __init__(self, lvl):
251 self.level = lvl
252
253 def filter(self, record):
254 return self.level != record.levelno
255
256class GarrulousFilter(SpecificLevelFilter):
257 def __init__(self):
258 SpecificLevelFilter.__init__(self, GARRULOUS)
259
260#
261# Now, let's demonstrate filtering at the logger. This time, use a filter
262# which excludes SOCIABLE and TACITURN messages. Note that GARRULOUS events
263# are still excluded.
264#
265class VerySpecificFilter(logging.Filter):
266 def filter(self, record):
267 return record.levelno not in [SOCIABLE, TACITURN]
268
269def message(s):
270 sys.stdout.write("%s\n" % s)
271
272SHOULD1 = "This should only be seen at the '%s' logging level (or lower)"
273
274def test1():
275#
276# Now, tell the logging system to associate names with our levels.
277#
278 for lvl in my_logging_levels.keys():
279 logging.addLevelName(lvl, my_logging_levels[lvl])
280
281#
282# Now, define a test function which logs an event at each of our levels.
283#
284
285 def doLog(log):
286 for lvl in LEVEL_RANGE:
287 log.log(lvl, SHOULD1, logging.getLevelName(lvl))
288
289 log = logging.getLogger("")
290 hdlr = log.handlers[0]
291#
292# Set the logging level to each different value and call the utility
293# function to log events.
294# In the output, you should see that each time round the loop, the number of
295# logging events which are actually output decreases.
296#
297 for lvl in LEVEL_RANGE:
298 message("-- setting logging level to '%s' -----" %
299 logging.getLevelName(lvl))
300 log.setLevel(lvl)
301 doLog(log)
302 #
303 # Now, we demonstrate level filtering at the handler level. Tell the
304 # handler defined above to filter at level 'SOCIABLE', and repeat the
305 # above loop. Compare the output from the two runs.
306 #
307 hdlr.setLevel(SOCIABLE)
308 message("-- Filtering at handler level to SOCIABLE --")
309 for lvl in LEVEL_RANGE:
310 message("-- setting logging level to '%s' -----" %
311 logging.getLevelName(lvl))
312 log.setLevel(lvl)
313 doLog(log)
314
315 hdlr.setLevel(0) #turn off level filtering at the handler
316
317 garr = GarrulousFilter()
318 hdlr.addFilter(garr)
319 message("-- Filtering using GARRULOUS filter --")
320 for lvl in LEVEL_RANGE:
321 message("-- setting logging level to '%s' -----" %
322 logging.getLevelName(lvl))
323 log.setLevel(lvl)
324 doLog(log)
325 spec = VerySpecificFilter()
326 log.addFilter(spec)
327 message("-- Filtering using specific filter for SOCIABLE, TACITURN --")
328 for lvl in LEVEL_RANGE:
329 message("-- setting logging level to '%s' -----" %
330 logging.getLevelName(lvl))
331 log.setLevel(lvl)
332 doLog(log)
333
334 log.removeFilter(spec)
335 hdlr.removeFilter(garr)
336 #Undo the one level which clashes...for regression tests
337 logging.addLevelName(logging.DEBUG, "DEBUG")
338
339#----------------------------------------------------------------------------
340# Test 2
341#----------------------------------------------------------------------------
342
343MSG = "-- logging %d at INFO, messages should be seen every 10 events --"
344def test2():
345 logger = logging.getLogger("")
346 sh = logger.handlers[0]
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000347 sh.close()
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000348 logger.removeHandler(sh)
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000349 mh = logging.handlers.MemoryHandler(10,logging.WARNING, sh)
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000350 logger.setLevel(logging.DEBUG)
351 logger.addHandler(mh)
352 message("-- logging at DEBUG, nothing should be seen yet --")
353 logger.debug("Debug message")
354 message("-- logging at INFO, nothing should be seen yet --")
355 logger.info("Info message")
Neal Norwitz6fa635d2003-02-18 14:20:07 +0000356 message("-- logging at WARNING, 3 messages should be seen --")
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000357 logger.warn("Warn message")
Guido van Rossum805365e2007-05-07 22:24:25 +0000358 for i in range(102):
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000359 message(MSG % i)
360 logger.info("Info index = %d", i)
361 mh.close()
362 logger.removeHandler(mh)
363 logger.addHandler(sh)
364
365#----------------------------------------------------------------------------
366# Test 3
367#----------------------------------------------------------------------------
368
369FILTER = "a.b"
370
371def doLog3():
372 logging.getLogger("a").info("Info 1")
373 logging.getLogger("a.b").info("Info 2")
374 logging.getLogger("a.c").info("Info 3")
375 logging.getLogger("a.b.c").info("Info 4")
376 logging.getLogger("a.b.c.d").info("Info 5")
377 logging.getLogger("a.bb.c").info("Info 6")
378 logging.getLogger("b").info("Info 7")
379 logging.getLogger("b.a").info("Info 8")
380 logging.getLogger("c.a.b").info("Info 9")
381 logging.getLogger("a.bb").info("Info 10")
382
383def test3():
384 root = logging.getLogger()
385 root.setLevel(logging.DEBUG)
386 hand = root.handlers[0]
387 message("Unfiltered...")
388 doLog3()
389 message("Filtered with '%s'..." % FILTER)
390 filt = logging.Filter(FILTER)
391 hand.addFilter(filt)
392 doLog3()
393 hand.removeFilter(filt)
394
395#----------------------------------------------------------------------------
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000396# Test 4
397#----------------------------------------------------------------------------
398
Vinay Sajip568482a2006-01-20 18:29:36 +0000399# config0 is a standard configuration.
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000400config0 = """
401[loggers]
402keys=root
403
404[handlers]
405keys=hand1
406
407[formatters]
408keys=form1
409
410[logger_root]
411level=NOTSET
412handlers=hand1
413
414[handler_hand1]
415class=StreamHandler
416level=NOTSET
417formatter=form1
418args=(sys.stdout,)
419
420[formatter_form1]
421format=%(levelname)s:%(name)s:%(message)s
422datefmt=
423"""
424
425# config1 adds a little to the standard configuration.
426config1 = """
427[loggers]
428keys=root,parser
429
430[handlers]
431keys=hand1
432
433[formatters]
434keys=form1
435
436[logger_root]
437level=NOTSET
438handlers=hand1
439
440[logger_parser]
441level=DEBUG
442handlers=hand1
443propagate=1
444qualname=compiler.parser
445
446[handler_hand1]
447class=StreamHandler
448level=NOTSET
449formatter=form1
450args=(sys.stdout,)
451
452[formatter_form1]
453format=%(levelname)s:%(name)s:%(message)s
454datefmt=
455"""
456
457# config2 has a subtle configuration error that should be reported
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000458config2 = config1.replace("sys.stdout", "sys.stbout")
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000459
460# config3 has a less subtle configuration error
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000461config3 = config1.replace("formatter=form1", "formatter=misspelled_name")
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000462
463def test4():
464 for i in range(4):
465 conf = globals()['config%d' % i]
466 sys.stdout.write('config%d: ' % i)
467 loggerDict = logging.getLogger().manager.loggerDict
Vinay Sajip1eb77a52006-02-09 08:31:00 +0000468 logging._acquireLock()
469 try:
470 saved_handlers = logging._handlers.copy()
471 saved_handler_list = logging._handlerList[:]
472 saved_loggers = loggerDict.copy()
473 finally:
474 logging._releaseLock()
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000475 try:
476 fn = tempfile.mktemp(".ini")
477 f = open(fn, "w")
478 f.write(conf)
479 f.close()
480 try:
481 logging.config.fileConfig(fn)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000482 #call again to make sure cleanup is correct
483 logging.config.fileConfig(fn)
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000484 except:
485 t = sys.exc_info()[0]
486 message(str(t))
487 else:
488 message('ok.')
489 os.remove(fn)
490 finally:
Vinay Sajip1eb77a52006-02-09 08:31:00 +0000491 logging._acquireLock()
492 try:
493 logging._handlers.clear()
494 logging._handlers.update(saved_handlers)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000495 logging._handlerList[:] = saved_handler_list
Vinay Sajip1eb77a52006-02-09 08:31:00 +0000496 loggerDict = logging.getLogger().manager.loggerDict
497 loggerDict.clear()
498 loggerDict.update(saved_loggers)
499 finally:
500 logging._releaseLock()
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000501
502#----------------------------------------------------------------------------
Vinay Sajip568482a2006-01-20 18:29:36 +0000503# Test 5
504#----------------------------------------------------------------------------
505
506test5_config = """
507[loggers]
508keys=root
509
510[handlers]
511keys=hand1
512
513[formatters]
514keys=form1
515
516[logger_root]
517level=NOTSET
518handlers=hand1
519
520[handler_hand1]
521class=StreamHandler
522level=NOTSET
523formatter=form1
524args=(sys.stdout,)
525
526[formatter_form1]
527class=test.test_logging.FriendlyFormatter
528format=%(levelname)s:%(name)s:%(message)s
529datefmt=
530"""
531
532class FriendlyFormatter (logging.Formatter):
533 def formatException(self, ei):
534 return "%s... Don't panic!" % str(ei[0])
535
536
537def test5():
538 loggerDict = logging.getLogger().manager.loggerDict
Vinay Sajip1eb77a52006-02-09 08:31:00 +0000539 logging._acquireLock()
540 try:
541 saved_handlers = logging._handlers.copy()
542 saved_handler_list = logging._handlerList[:]
543 saved_loggers = loggerDict.copy()
544 finally:
545 logging._releaseLock()
Vinay Sajip568482a2006-01-20 18:29:36 +0000546 try:
547 fn = tempfile.mktemp(".ini")
548 f = open(fn, "w")
549 f.write(test5_config)
550 f.close()
551 logging.config.fileConfig(fn)
552 try:
553 raise KeyError
554 except KeyError:
555 logging.exception("just testing")
556 os.remove(fn)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000557 hdlr = logging.getLogger().handlers[0]
558 logging.getLogger().handlers.remove(hdlr)
Vinay Sajip568482a2006-01-20 18:29:36 +0000559 finally:
Vinay Sajip1eb77a52006-02-09 08:31:00 +0000560 logging._acquireLock()
561 try:
562 logging._handlers.clear()
563 logging._handlers.update(saved_handlers)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000564 logging._handlerList[:] = saved_handler_list
Vinay Sajip1eb77a52006-02-09 08:31:00 +0000565 loggerDict = logging.getLogger().manager.loggerDict
566 loggerDict.clear()
567 loggerDict.update(saved_loggers)
568 finally:
569 logging._releaseLock()
Vinay Sajip568482a2006-01-20 18:29:36 +0000570
571
572#----------------------------------------------------------------------------
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000573# Test Harness
574#----------------------------------------------------------------------------
575def banner(nm, typ):
576 sep = BANNER % (nm, typ)
577 sys.stdout.write(sep)
578 sys.stdout.flush()
579
Tim Peters36f7e932003-07-23 00:05:07 +0000580def test_main_inner():
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000581 rootLogger = logging.getLogger("")
582 rootLogger.setLevel(logging.DEBUG)
583 hdlr = logging.StreamHandler(sys.stdout)
584 fmt = logging.Formatter(logging.BASIC_FORMAT)
585 hdlr.setFormatter(fmt)
586 rootLogger.addHandler(hdlr)
587
Martin v. Löwis5b1e0032006-01-29 20:10:38 +0000588 # Find an unused port number
589 port = logging.handlers.DEFAULT_TCP_LOGGING_PORT
590 while port < logging.handlers.DEFAULT_TCP_LOGGING_PORT+100:
591 try:
592 tcpserver = LogRecordSocketReceiver(port=port)
593 except socket.error:
594 port += 1
595 else:
596 break
597 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000598 raise ImportError("Could not find unused port")
Tim Peters249c7b02006-01-29 22:50:26 +0000599
Martin v. Löwis5b1e0032006-01-29 20:10:38 +0000600
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000601 #Set up a handler such that all events are sent via a socket to the log
602 #receiver (logrecv).
603 #The handler will only be added to the rootLogger for some of the tests
Martin v. Löwis5b1e0032006-01-29 20:10:38 +0000604 shdlr = logging.handlers.SocketHandler('localhost', port)
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000605
606 #Configure the logger for logrecv so events do not propagate beyond it.
607 #The sockLogger output is buffered in memory until the end of the test,
608 #and printed at the end.
Guido van Rossum34d19282007-08-09 01:03:29 +0000609 sockOut = io.StringIO()
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000610 sockLogger = logging.getLogger("logrecv")
611 sockLogger.setLevel(logging.DEBUG)
612 sockhdlr = logging.StreamHandler(sockOut)
613 sockhdlr.setFormatter(logging.Formatter(
614 "%(name)s -> %(levelname)s: %(message)s"))
615 sockLogger.addHandler(sockhdlr)
616 sockLogger.propagate = 0
617
618 #Set up servers
619 threads = []
Guido van Rossum2a1d5162003-01-21 21:05:22 +0000620 #sys.stdout.write("About to start TCP server...\n")
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000621 threads.append(threading.Thread(target=runTCP, args=(tcpserver,)))
622
623 for thread in threads:
624 thread.start()
625 try:
626 banner("log_test0", "begin")
627
Vinay Sajip6887c922004-08-04 08:29:14 +0000628 rootLogger.addHandler(shdlr)
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000629 test0()
Neal Norwitz5bab0f82006-03-05 02:16:12 +0000630 # XXX(nnorwitz): Try to fix timing related test failures.
631 # This sleep gives us some extra time to read messages.
632 # The test generally only fails on Solaris without this sleep.
633 time.sleep(2.0)
Vinay Sajip6887c922004-08-04 08:29:14 +0000634 shdlr.close()
635 rootLogger.removeHandler(shdlr)
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000636
637 banner("log_test0", "end")
638
Vinay Sajip568482a2006-01-20 18:29:36 +0000639 for t in range(1,6):
640 banner("log_test%d" % t, "begin")
641 globals()['test%d' % t]()
642 banner("log_test%d" % t, "end")
Vinay Sajip22b25aa2006-01-16 21:24:38 +0000643
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000644 finally:
Guido van Rossum376e6362003-04-25 14:22:00 +0000645 #wait for TCP receiver to terminate
Guido van Rossum376e6362003-04-25 14:22:00 +0000646 socketDataProcessed.wait()
Neal Norwitz55cd82f2006-02-05 08:21:08 +0000647 # ensure the server dies
648 tcpserver.abort = 1
Guido van Rossumecf0f022003-04-26 00:21:31 +0000649 for thread in threads:
Neal Norwitz55cd82f2006-02-05 08:21:08 +0000650 thread.join(2.0)
Guido van Rossum2a1d5162003-01-21 21:05:22 +0000651 banner("logrecv output", "begin")
652 sys.stdout.write(sockOut.getvalue())
653 sockOut.close()
Vinay Sajip6887c922004-08-04 08:29:14 +0000654 sockLogger.removeHandler(sockhdlr)
655 sockhdlr.close()
Guido van Rossum2a1d5162003-01-21 21:05:22 +0000656 banner("logrecv output", "end")
657 sys.stdout.flush()
Vinay Sajip6887c922004-08-04 08:29:14 +0000658 try:
659 hdlr.close()
660 except:
661 pass
662 rootLogger.removeHandler(hdlr)
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000663
Thomas Wouters477c8d52006-05-27 19:21:47 +0000664# Set the locale to the platform-dependent default. I have no idea
665# why the test does this, but in any case we save the current locale
666# first and restore it at the end.
667@run_with_locale('LC_ALL', '')
Tim Peters36f7e932003-07-23 00:05:07 +0000668def test_main():
Tim Peters0cdc3d82005-12-30 20:46:23 +0000669 # Save and restore the original root logger level across the tests.
670 # Otherwise, e.g., if any test using cookielib runs after test_logging,
671 # cookielib's debug-level logger tries to log messages, leading to
672 # confusing:
673 # No handlers could be found for logger "cookielib"
674 # output while the tests are running.
675 root_logger = logging.getLogger("")
676 original_logging_level = root_logger.getEffectiveLevel()
Tim Peters36f7e932003-07-23 00:05:07 +0000677 try:
678 test_main_inner()
679 finally:
Tim Peters0cdc3d82005-12-30 20:46:23 +0000680 root_logger.setLevel(original_logging_level)
Jeremy Hylton096d9862003-07-18 03:19:20 +0000681
Neal Norwitzb4a2df02003-01-02 14:56:39 +0000682if __name__ == "__main__":
683 sys.stdout.write("test_logging\n")
684 test_main()