File: test_logging.py

package info (click to toggle)
ros2-colcon-core 0.20.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,156 kB
  • sloc: python: 10,333; makefile: 7
file content (104 lines) | stat: -rw-r--r-- 3,319 bytes parent folder | download | duplicates (2)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# Copyright 2016-2018 Dirk Thomas
# Licensed under the Apache License, Version 2.0

import logging
from pathlib import Path
from unittest.mock import Mock

from colcon_core.logging import add_file_handler
from colcon_core.logging import get_effective_console_level
from colcon_core.logging import get_numeric_log_level
from colcon_core.logging import set_logger_level_from_env
import pytest

from .environment_context import EnvironmentContext


def test_set_logger_level_from_env():
    logger = logging.getLogger('test')
    default_level = logger.getEffectiveLevel()

    # not set
    set_logger_level_from_env(logger, 'COLCON_TEST_LOGGER_LEVEL')
    assert logger.getEffectiveLevel() == default_level

    # invalid value
    with EnvironmentContext(COLCON_TEST_LOGGER_LEVEL='invalid'):
        logger.warning = Mock()
        set_logger_level_from_env(logger, 'COLCON_TEST_LOGGER_LEVEL')
        assert logger.warning.call_count == 1
    assert logger.getEffectiveLevel() == default_level

    # valid value
    with EnvironmentContext(COLCON_TEST_LOGGER_LEVEL='debug'):
        set_logger_level_from_env(logger, 'COLCON_TEST_LOGGER_LEVEL')
    assert logger.getEffectiveLevel() == logging.DEBUG


def test_get_numeric_log_level():
    # numeric
    log_level = get_numeric_log_level('10')
    assert log_level == logging.DEBUG

    # string
    log_level = get_numeric_log_level('info')
    assert log_level == logging.INFO

    # string with mixed case
    log_level = get_numeric_log_level('Warning')
    assert log_level == logging.WARNING

    # invalid string
    with pytest.raises(ValueError) as e:
        get_numeric_log_level('invalid')
    assert str(e.value).endswith(
        'valid names are: CRITICAL, ERROR, WARNING, INFO, DEBUG '
        '(case-insensitive)')

    # negative numeric
    with pytest.raises(ValueError) as e:
        get_numeric_log_level('-1')
    assert str(e.value).endswith('numeric log levels must be positive')


def test_add_file_handler(tmpdir):
    log_path = Path(tmpdir) / 'test_add_file_handler.log'
    log_path.touch()
    logger = logging.getLogger('test_add_file_handler')
    try:
        logger.setLevel(logging.WARN)
        add_file_handler(logger, log_path)
        assert logger.getEffectiveLevel() != logging.WARN
        logger.info('test_add_file_handler')
    finally:
        for handler in logger.handlers:
            logger.removeHandler(handler)
            handler.close()

    # check only that we logged SOMETHING to the file
    assert log_path.stat().st_size > 10


def test_get_effective_console_level(tmpdir):
    logger = logging.getLogger('test_sync_console_log_level')

    # no level set
    level = get_effective_console_level(logger)
    assert level == logger.getEffectiveLevel()

    # change the level to ERROR
    logger.setLevel(logging.ERROR)
    level = get_effective_console_level(logger)
    assert level == logger.getEffectiveLevel() == logging.ERROR

    # after add_file_handler
    log_path = Path(tmpdir) / 'test_add_file_handler.log'
    log_path.touch()
    try:
        add_file_handler(logger, log_path)
        level = get_effective_console_level(logger)
        assert level == logging.ERROR
    finally:
        for handler in logger.handlers:
            logger.removeHandler(handler)
            handler.close()