Skip to content

Commit

Permalink
100% coverage for loghandler.py
Browse files Browse the repository at this point in the history
- Fix StartupHandler on Python 3.
  • Loading branch information
jamadden committed Feb 11, 2017
1 parent c3037f2 commit e461ad3
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 37 deletions.
2 changes: 2 additions & 0 deletions ZConfig/_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ def TextIO(text):
exec_ = getattr(builtins, "exec")
text_type = str
binary_type = bytes
maxsize = sys.maxsize

def reraise(tp, value, tb=None): #pragma NO COVER
if value.__traceback__ is not tb:
Expand All @@ -70,6 +71,7 @@ def reraise(tp, value, tb=None): #pragma NO COVER
else: # pragma: no cover
text_type = unicode
binary_type = bytes
maxsize = sys.maxint

def exec_(code, globs=None, locs=None): #pragma NO COVER
"""Execute code in a namespace."""
Expand Down
11 changes: 9 additions & 2 deletions ZConfig/components/logger/loghandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"""Handlers which can plug into a PEP 282 logger."""

import os
import sys

import weakref

from logging import Handler, StreamHandler
Expand All @@ -25,6 +25,13 @@
from logging.handlers import HTTPHandler, SMTPHandler
from logging.handlers import NTEventLogHandler as Win32EventLogHandler

# Export these, they're used in handlers.py
SysLogHandler = SysLogHandler
HTTPHandler = HTTPHandler
SMTPHandler = SMTPHandler
Win32EventLogHandler = Win32EventLogHandler

from ZConfig._compat import maxsize


_reopenable_handlers = []
Expand Down Expand Up @@ -162,7 +169,7 @@ class StartupHandler(BufferingHandler):
"""

def __init__(self):
BufferingHandler.__init__(self, sys.maxint)
BufferingHandler.__init__(self, maxsize)

def shouldFlush(self, record):
return False
Expand Down
98 changes: 63 additions & 35 deletions ZConfig/components/logger/tests/test_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from ZConfig.components.logger import loghandler

from ZConfig._compat import NStringIO as StringIO
from ZConfig._compat import maxsize

class CustomFormatter(logging.Formatter):
def formatException(self, ei):
Expand Down Expand Up @@ -117,38 +118,6 @@ class TestConfig(LoggingTestHelper, unittest.TestCase):
</schema>
"""

def test_logging_level(self):
# Make sure the expected names are supported; it's not clear
# how to check the values in a meaningful way.
# Just make sure they're case-insensitive.
convert = datatypes.logging_level
for name in ["notset", "all", "trace", "debug", "blather",
"info", "warn", "warning", "error", "fatal",
"critical"]:
self.assertEqual(convert(name), convert(name.upper()))
self.assertRaises(ValueError, convert, "hopefully-not-a-valid-value")
self.assertEqual(convert('10'), 10)
self.assertRaises(ValueError, convert, '100')

def test_http_method(self):
convert = handlers.get_or_post
self.assertEqual(convert("get"), "GET")
self.assertEqual(convert("GET"), "GET")
self.assertEqual(convert("post"), "POST")
self.assertEqual(convert("POST"), "POST")
self.assertRaises(ValueError, convert, "")
self.assertRaises(ValueError, convert, "foo")

def test_syslog_facility(self):
convert = handlers.syslog_facility
for name in ["auth", "authpriv", "cron", "daemon", "kern",
"lpr", "mail", "news", "security", "syslog",
"user", "uucp", "local0", "local1", "local2",
"local3", "local4", "local5", "local6", "local7"]:
self.assertEqual(convert(name), name)
self.assertEqual(convert(name.upper()), name)
self.assertRaises(ValueError, convert, "hopefully-never-a-valid-value")

def test_config_without_logger(self):
conf = self.get_config("")
self.assertTrue(conf.eventlog is None)
Expand All @@ -164,6 +133,29 @@ def test_config_without_handlers(self):
logger.handlers[0].emit(None)
logger.handlers[0].handle(None)

def test_factory_without_stream(self):
factory = self.check_simple_logger_factory("<eventlog>\n"
" <logfile>\n"
" path STDERR\n"
" </logfile>\n"
" <logfile>\n"
" path STDERR\n"
" level info\n"
" </logfile>\n"
" <logfile>\n"
" path STDERR\n"
" level debug\n"
" </logfile>\n"
"</eventlog>")

factory.startup()
logger = factory.instance

factory.level = logging.NOTSET
self.assertEqual(factory.getLowestHandlerLevel(), logging.DEBUG)
logger.handlers[0].reopen = lambda: None
factory.reopen()

def test_with_logfile(self):
fn = self.mktemp()
logger = self.check_simple_logger("<eventlog>\n"
Expand Down Expand Up @@ -436,11 +428,14 @@ def test_with_email_notifier_with_invalid_credentials(self):
" </email-notifier>\n"
"</eventlog>")

def check_simple_logger(self, text, level=logging.INFO):
def check_simple_logger_factory(self, text, level=logging.INFO):
conf = self.get_config(text)
self.assertTrue(conf.eventlog is not None)
self.assertEqual(conf.eventlog.level, level)
logger = conf.eventlog()
return conf.eventlog

def check_simple_logger(self, text, level=logging.INFO):
logger = self.check_simple_logger_factory(text, level)()
self.assertTrue(isinstance(logger, logging.Logger))
self.assertEqual(len(logger.handlers), 1)
return logger
Expand Down Expand Up @@ -735,12 +730,45 @@ def wr():
loghandler._reopenable_handlers.append(wr)
loghandler.reopenFiles()

def test_logging_level(self):
# Make sure the expected names are supported; it's not clear
# how to check the values in a meaningful way.
# Just make sure they're case-insensitive.
convert = datatypes.logging_level
for name in ["notset", "all", "trace", "debug", "blather",
"info", "warn", "warning", "error", "fatal",
"critical"]:
self.assertEqual(convert(name), convert(name.upper()))
self.assertRaises(ValueError, convert, "hopefully-not-a-valid-value")
self.assertEqual(convert('10'), 10)
self.assertRaises(ValueError, convert, '100')

def test_http_method(self):
convert = handlers.get_or_post
self.assertEqual(convert("get"), "GET")
self.assertEqual(convert("GET"), "GET")
self.assertEqual(convert("post"), "POST")
self.assertEqual(convert("POST"), "POST")
self.assertRaises(ValueError, convert, "")
self.assertRaises(ValueError, convert, "foo")

def test_syslog_facility(self):
convert = handlers.syslog_facility
for name in ["auth", "authpriv", "cron", "daemon", "kern",
"lpr", "mail", "news", "security", "syslog",
"user", "uucp", "local0", "local1", "local2",
"local3", "local4", "local5", "local6", "local7"]:
self.assertEqual(convert(name), name)
self.assertEqual(convert(name.upper()), name)
self.assertRaises(ValueError, convert, "hopefully-never-a-valid-value")


class TestStartupHandler(unittest.TestCase):

def test_buffer(self):
handler = loghandler.StartupHandler()
self.assertFalse(handler.shouldFlush(None))
self.assertEqual(sys.maxint, handler.capacity)
self.assertEqual(maxsize, handler.capacity)

records = []
def handle(record):
Expand Down

0 comments on commit e461ad3

Please sign in to comment.