File: test_cat_log.py

package info (click to toggle)
cylc-flow 8.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,368 kB
  • sloc: python: 87,751; sh: 17,109; sql: 233; xml: 171; javascript: 78; lisp: 55; makefile: 11
file content (89 lines) | stat: -rw-r--r-- 2,831 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
# THIS FILE IS PART OF THE CYLC WORKFLOW ENGINE.
# Copyright (C) NIWA & British Crown (Met Office) & Contributors.
#
# 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/>.

from subprocess import Popen, PIPE

from ansimarkup import parse as cparse
from colorama import Style
import pytest

from cylc.flow.loggingutil import CylcLogFormatter
from cylc.flow.scripts.cat_log import (
    colorise_cat_log,
)


@pytest.fixture
def log_file(tmp_path):
    _log_file = tmp_path / 'log'
    with open(_log_file, 'w+') as fh:
        fh.write('DEBUG - 1\n')
        fh.write('INFO - 2\n')
        fh.write('WARNING - 3\n')
        fh.write('ERROR - 4\n')
        fh.write('CRITICAL - 5\n')
    return _log_file


def test_colorise_cat_log_plain(log_file):
    """It should not colourise logs when color=False."""
    # command for colorise_cat_log to colourise
    cat_proc = Popen(
        ['cat', str(log_file)],
        stdout=PIPE,
    )
    colorise_cat_log(cat_proc, color=False)
    assert cat_proc.communicate()[0].decode().splitlines() == [
        # there should not be any ansii color characters here
        'DEBUG - 1',
        'INFO - 2',
        'WARNING - 3',
        'ERROR - 4',
        'CRITICAL - 5',
    ]


def test_colorise_cat_log_colour(log_file):
    """It should colourise logs when color=True."""
    # command for colorise_cat_log to colourise
    cat_proc = Popen(
        ['cat', str(log_file)],
        stdout=PIPE,
    )
    out, err = colorise_cat_log(cat_proc, color=True, stdout=PIPE)

    # strip the line breaks (because tags can come before or after them)
    # strip the reset tags (because they might not be needed if redeclared)
    out = ''.join(
        line.replace(Style.RESET_ALL, '')
        for line in out.decode().splitlines()
    )

    col = CylcLogFormatter.COLORS
    assert out == (
        ''.join([
            # strip the reset tags
            cparse(line).replace(Style.RESET_ALL, '')
            for line in [
                col['DEBUG'].format('DEBUG - 1'),
                'INFO - 2',
                col['WARNING'].format('WARNING - 3'),
                col['ERROR'].format('ERROR - 4'),
                col['CRITICAL'].format('CRITICAL - 5'),
                ''
            ]
        ])
    )