|
Packit Service |
21c75c |
# -*- coding: utf-8 -*-
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
# Copyright (C) 2013-2018 Red Hat, Inc.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
# This copyrighted material is made available to anyone wishing to use,
|
|
Packit Service |
21c75c |
# modify, copy, or redistribute it subject to the terms and conditions of
|
|
Packit Service |
21c75c |
# the GNU General Public License v.2, or (at your option) any later version.
|
|
Packit Service |
21c75c |
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
Packit Service |
21c75c |
# ANY WARRANTY expressed or implied, including the implied warranties of
|
|
Packit Service |
21c75c |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
Packit Service |
21c75c |
# Public License for more details. You should have received a copy of the
|
|
Packit Service |
21c75c |
# GNU General Public License along with this program; if not, write to the
|
|
Packit Service |
21c75c |
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
21c75c |
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
|
|
Packit Service |
21c75c |
# source code or documentation are not subject to the GNU General Public
|
|
Packit Service |
21c75c |
# License and may only be used or replicated with the express permission of
|
|
Packit Service |
21c75c |
# Red Hat, Inc.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
from __future__ import absolute_import
|
|
Packit Service |
21c75c |
from __future__ import unicode_literals
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
import logging
|
|
Packit Service |
21c75c |
import collections
|
|
Packit Service |
21c75c |
import gzip
|
|
Packit Service |
21c75c |
import operator
|
|
Packit Service |
21c75c |
import os
|
|
Packit Service |
21c75c |
import tempfile
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
import dnf.const
|
|
Packit Service |
21c75c |
import dnf.logging
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
import tests.support
|
|
Packit Service |
21c75c |
from tests.support import mock
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
LogfileEntry = collections.namedtuple('LogfileEntry', ('date', 'time', 'message'))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def _split_logfile_entry(entry):
|
|
Packit Service |
21c75c |
record = entry.split(' ')
|
|
Packit Service |
21c75c |
datetime = record[0].split('T')
|
|
Packit Service |
21c75c |
# strip the trailing '\n' from the message:
|
|
Packit Service |
21c75c |
message = ' '.join(record[2:])[:-1]
|
|
Packit Service |
21c75c |
return LogfileEntry(date=datetime[0],
|
|
Packit Service |
21c75c |
time=datetime[1], message=message)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def drop_all_handlers():
|
|
Packit Service |
21c75c |
for logger_name in ('dnf', 'dnf.rpm'):
|
|
Packit Service |
21c75c |
logger = logging.getLogger(logger_name)
|
|
Packit Service |
21c75c |
for handler in logger.handlers[:]:
|
|
Packit Service |
21c75c |
logger.removeHandler(handler)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
class TestLogging(tests.support.TestCase):
|
|
Packit Service |
21c75c |
"""Tests the logging mechanisms in DNF.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
If it causes a problem in the future that loggers are singletons that don't
|
|
Packit Service |
21c75c |
get torn down between tests, look at logging.Manager internals.
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
"""
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def setUp(self):
|
|
Packit Service |
21c75c |
self.logdir = tempfile.mkdtemp(prefix="dnf-logtest-")
|
|
Packit Service |
21c75c |
self.log_size = 1024 * 1024
|
|
Packit Service |
21c75c |
self.log_rotate = 4
|
|
Packit Service |
21c75c |
self.log_compress = False
|
|
Packit Service |
21c75c |
self.logging = dnf.logging.Logging()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def tearDown(self):
|
|
Packit Service |
21c75c |
drop_all_handlers()
|
|
Packit Service |
21c75c |
dnf.util.rm_rf(self.logdir)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
@staticmethod
|
|
Packit Service |
21c75c |
def _bench(logger):
|
|
Packit Service |
21c75c |
logger.debug(u"d")
|
|
Packit Service |
21c75c |
logger.info(u"i")
|
|
Packit Service |
21c75c |
logger.warning(u"w")
|
|
Packit Service |
21c75c |
logger.error(u"e")
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def test_level_conversion(self):
|
|
Packit Service |
21c75c |
self.assertRaises(AssertionError, dnf.logging._cfg_verbose_val2level, 11)
|
|
Packit Service |
21c75c |
self.assertEqual(dnf.logging._cfg_verbose_val2level(0),
|
|
Packit Service |
21c75c |
dnf.logging.SUPERCRITICAL)
|
|
Packit Service |
21c75c |
self.assertEqual(dnf.logging._cfg_verbose_val2level(7),
|
|
Packit Service |
21c75c |
dnf.logging.DDEBUG)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def test_setup(self):
|
|
Packit Service |
21c75c |
logger = logging.getLogger("dnf")
|
|
Packit Service |
21c75c |
with tests.support.patch_std_streams() as (stdout, stderr):
|
|
Packit Service |
21c75c |
self.logging._setup(
|
|
Packit Service |
21c75c |
logging.INFO, logging.ERROR, dnf.logging.TRACE,
|
|
Packit Service |
21c75c |
self.logdir, self.log_size, self.log_rotate, self.log_compress)
|
|
Packit Service |
21c75c |
self._bench(logger)
|
|
Packit Service |
21c75c |
self.assertEqual("i\n", stdout.getvalue())
|
|
Packit Service |
21c75c |
self.assertEqual("e\n", stderr.getvalue())
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def test_setup_verbose(self):
|
|
Packit Service |
21c75c |
logger = logging.getLogger("dnf")
|
|
Packit Service |
21c75c |
with tests.support.patch_std_streams() as (stdout, stderr):
|
|
Packit Service |
21c75c |
self.logging._setup(
|
|
Packit Service |
21c75c |
logging.DEBUG, logging.WARNING, dnf.logging.TRACE,
|
|
Packit Service |
21c75c |
self.logdir, self.log_size, self.log_rotate, self.log_compress)
|
|
Packit Service |
21c75c |
self._bench(logger)
|
|
Packit Service |
21c75c |
self.assertEqual("d\ni\n", stdout.getvalue())
|
|
Packit Service |
21c75c |
self.assertEqual("w\ne\n", stderr.getvalue())
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
@mock.patch('dnf.logging.Logging._setup')
|
|
Packit Service |
21c75c |
def test_setup_from_dnf_conf(self, setup_m):
|
|
Packit Service |
21c75c |
conf = mock.Mock(
|
|
Packit Service |
21c75c |
debuglevel=2, errorlevel=3, logfilelevel=2, logdir=self.logdir,
|
|
Packit Service |
21c75c |
log_size=self.log_size, log_rotate=self.log_rotate, log_compress=self.log_compress)
|
|
Packit Service |
21c75c |
self.logging._setup_from_dnf_conf(conf)
|
|
Packit Service |
21c75c |
self.assertEqual(setup_m.call_args, mock.call(dnf.logging.INFO,
|
|
Packit Service |
21c75c |
dnf.logging.WARNING,
|
|
Packit Service |
21c75c |
dnf.logging.INFO,
|
|
Packit Service |
21c75c |
self.logdir,
|
|
Packit Service |
21c75c |
self.log_size,
|
|
Packit Service |
21c75c |
self.log_rotate,
|
|
Packit Service |
21c75c |
self.log_compress))
|
|
Packit Service |
21c75c |
conf = mock.Mock(
|
|
Packit Service |
21c75c |
debuglevel=6, errorlevel=6, logfilelevel=6, logdir=self.logdir,
|
|
Packit Service |
21c75c |
log_size=self.log_size, log_rotate=self.log_rotate, log_compress=self.log_compress)
|
|
Packit Service |
21c75c |
self.logging._setup_from_dnf_conf(conf)
|
|
Packit Service |
21c75c |
self.assertEqual(setup_m.call_args, mock.call(dnf.logging.DEBUG,
|
|
Packit Service |
21c75c |
dnf.logging.WARNING,
|
|
Packit Service |
21c75c |
dnf.logging.DEBUG,
|
|
Packit Service |
21c75c |
self.logdir,
|
|
Packit Service |
21c75c |
self.log_size,
|
|
Packit Service |
21c75c |
self.log_rotate,
|
|
Packit Service |
21c75c |
self.log_compress))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def test_file_logging(self):
|
|
Packit Service |
21c75c |
# log nothing to the console:
|
|
Packit Service |
21c75c |
self.logging._setup(
|
|
Packit Service |
21c75c |
dnf.logging.SUPERCRITICAL, dnf.logging.SUPERCRITICAL, dnf.logging.TRACE,
|
|
Packit Service |
21c75c |
self.logdir, self.log_size, self.log_rotate, self.log_compress)
|
|
Packit Service |
21c75c |
logger = logging.getLogger("dnf")
|
|
Packit Service |
21c75c |
with tests.support.patch_std_streams() as (stdout, stderr):
|
|
Packit Service |
21c75c |
logger.info("i")
|
|
Packit Service |
21c75c |
logger.critical("c")
|
|
Packit Service |
21c75c |
self.assertEqual(stdout.getvalue(), '')
|
|
Packit Service |
21c75c |
self.assertEqual(stderr.getvalue(), '')
|
|
Packit Service |
21c75c |
# yet the file should contain both the entries:
|
|
Packit Service |
21c75c |
logfile = os.path.join(self.logdir, "dnf.log")
|
|
Packit Service |
21c75c |
self.assertFile(logfile)
|
|
Packit Service |
21c75c |
with open(logfile) as f:
|
|
Packit Service |
21c75c |
msgs = map(operator.attrgetter("message"),
|
|
Packit Service |
21c75c |
map(_split_logfile_entry, f.readlines()))
|
|
Packit Service |
21c75c |
self.assertSequenceEqual(list(msgs), [dnf.const.LOG_MARKER, 'i', 'c'])
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def test_rpm_logging(self):
|
|
Packit Service |
21c75c |
# log everything to the console:
|
|
Packit Service |
21c75c |
self.logging._setup(
|
|
Packit Service |
21c75c |
dnf.logging.SUBDEBUG, dnf.logging.SUBDEBUG, dnf.logging.TRACE,
|
|
Packit Service |
21c75c |
self.logdir, self.log_size, self.log_rotate, self.log_compress)
|
|
Packit Service |
21c75c |
logger = logging.getLogger("dnf.rpm")
|
|
Packit Service |
21c75c |
with tests.support.patch_std_streams() as (stdout, stderr):
|
|
Packit Service |
21c75c |
logger.info('rpm transaction happens.')
|
|
Packit Service |
21c75c |
# rpm logger never outputs to the console:
|
|
Packit Service |
21c75c |
self.assertEqual(stdout.getvalue(), "")
|
|
Packit Service |
21c75c |
self.assertEqual(stderr.getvalue(), "")
|
|
Packit Service |
21c75c |
logfile = os.path.join(self.logdir, "dnf.rpm.log")
|
|
Packit Service |
21c75c |
self.assertFile(logfile)
|
|
Packit Service |
21c75c |
with open(logfile) as f:
|
|
Packit Service |
21c75c |
msgs = map(operator.attrgetter("message"),
|
|
Packit Service |
21c75c |
map(_split_logfile_entry, f.readlines()))
|
|
Packit Service |
21c75c |
self.assertSequenceEqual(
|
|
Packit Service |
21c75c |
list(msgs),
|
|
Packit Service |
21c75c |
[dnf.const.LOG_MARKER, 'rpm transaction happens.']
|
|
Packit Service |
21c75c |
)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def test_setup_only_once(self):
|
|
Packit Service |
21c75c |
logger = logging.getLogger("dnf")
|
|
Packit Service |
21c75c |
self.assertLength(logger.handlers, 0)
|
|
Packit Service |
21c75c |
self.logging._setup(
|
|
Packit Service |
21c75c |
dnf.logging.SUBDEBUG, dnf.logging.SUBDEBUG, dnf.logging.TRACE,
|
|
Packit Service |
21c75c |
self.logdir, self.log_size, self.log_rotate, self.log_compress)
|
|
Packit Service |
21c75c |
cnt = len(logger.handlers)
|
|
Packit Service |
21c75c |
self.assertGreater(cnt, 0)
|
|
Packit Service |
21c75c |
self.logging._setup(
|
|
Packit Service |
21c75c |
dnf.logging.SUBDEBUG, dnf.logging.SUBDEBUG,
|
|
Packit Service |
21c75c |
self.logdir, self.log_size, self.log_rotate, self.log_compress)
|
|
Packit Service |
21c75c |
# no new handlers
|
|
Packit Service |
21c75c |
self.assertEqual(cnt, len(logger.handlers))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def test_log_compression(self):
|
|
Packit Service |
21c75c |
# log nothing to the console and set log_compress=True and log_size to minimal size, so it's always rotated:
|
|
Packit Service |
21c75c |
self.logging._setup(
|
|
Packit Service |
21c75c |
dnf.logging.SUPERCRITICAL, dnf.logging.SUPERCRITICAL, dnf.logging.TRACE,
|
|
Packit Service |
21c75c |
self.logdir, log_size=1, log_rotate=self.log_rotate, log_compress=True)
|
|
Packit Service |
21c75c |
logger = logging.getLogger("dnf")
|
|
Packit Service |
21c75c |
with tests.support.patch_std_streams() as (stdout, stderr):
|
|
Packit Service |
21c75c |
logger.info("i")
|
|
Packit Service |
21c75c |
logger.critical("c")
|
|
Packit Service |
21c75c |
logfile = os.path.join(self.logdir, "dnf.log")
|
|
Packit Service |
21c75c |
self.assertFile(logfile)
|
|
Packit Service |
21c75c |
with open(logfile) as f:
|
|
Packit Service |
21c75c |
msgs = map(operator.attrgetter("message"),
|
|
Packit Service |
21c75c |
map(_split_logfile_entry, f.readlines()))
|
|
Packit Service |
21c75c |
self.assertSequenceEqual(list(msgs), ['c'])
|
|
Packit Service |
21c75c |
logfile_rotated = os.path.join(self.logdir, "dnf.log.1.gz")
|
|
Packit Service |
21c75c |
self.assertFile(logfile_rotated)
|
|
Packit Service |
21c75c |
with gzip.open(logfile_rotated, 'rt') as f:
|
|
Packit Service |
21c75c |
msgs = map(operator.attrgetter("message"),
|
|
Packit Service |
21c75c |
map(_split_logfile_entry, f.readlines()))
|
|
Packit Service |
21c75c |
self.assertSequenceEqual(list(msgs), ['i'])
|