summaryrefslogtreecommitdiffstats
path: root/ipatests/pytest_plugins/nose_compat.py
blob: 67eb6e074a7ed3aea5f5ab7f02a3d2a38c30f627 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# Authors:
#   Petr Viktorin <pviktori@redhat.com>
#
# Copyright (C) 2014  Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""Provides command-line options for very limited Nose compatibility"""

import os
import sys
import logging

from ipapython.ipa_log_manager import log_mgr


def pytest_addoption(parser):
    group = parser.getgroup("IPA nosetests compatibility shim")

    group.addoption('--with-xunit', action="store_const",
           dest="xmlpath", metavar="path",  default=None,
           const=os.environ.get('IPATEST_XUNIT_PATH', './nosetests.xml'),
           help="create junit-xml style report file at $IPATEST_XUNIT_PATH,"
                "or nosetests.xml by default")

    group.addoption('--logging-level', action="store",
           dest="logging_level", metavar="level", default='CRITICAL',
           help="level for logging to stderr. "
                "Bypasses pytest logging redirection."
                "May be used to show progress of long-running tests.")


def pytest_configure(config):
    if config.getoption('logging_level'):
        # Forward IPA logging to a normal Python logger. Nose's logcapture plugin
        # can't work with IPA-managed loggers
        class LogHandler(logging.Handler):
            name = 'forwarding log handler'
            logger = logging.getLogger('IPA')

            def emit(self, record):
                capture = config.pluginmanager.getplugin('capturemanager')
                orig_stdout, orig_stderr = sys.stdout, sys.stderr
                if capture:
                    capture._capturing.suspend_capturing()
                sys.stderr.write(self.format(record))
                sys.stderr.write('\n')
                if capture:
                    capture._capturing.resume_capturing()
                sys.stdout, sys.stderr = orig_stdout, orig_stderr

        log_mgr.configure(
            {
                'default_level': config.getoption('logging_level'),
                'handlers': [{'log_handler': LogHandler(),
                            'format': '[%(name)s] %(message)s',
                            'level': 'debug'},
                            {'level': 'debug',
                            'name': 'real_stderr',
                            'stream': sys.stderr}]},
            configure_state='tests')