xref: /openbmc/u-boot/test/py/tests/test_log.py (revision e3963c09)
1# SPDX-License-Identifier: GPL-2.0+
2# Copyright (c) 2016, Google Inc.
3#
4# U-Boot Verified Boot Test
5
6"""
7This tests U-Boot logging. It uses the 'log test' command with various options
8and checks that the output is correct.
9"""
10
11import pytest
12
13LOGL_FIRST, LOGL_WARNING, LOGL_INFO = (0, 4, 6)
14
15@pytest.mark.buildconfigspec('cmd_log')
16def test_log(u_boot_console):
17    """Test that U-Boot logging works correctly."""
18    def check_log_entries(lines, mask, max_level=LOGL_INFO):
19        """Check that the expected log records appear in the output
20
21        Args:
22            lines: iterator containing lines to check
23            mask: bit mask to select which lines to check for:
24                bit 0: standard log line
25                bit 1: _log line
26            max_level: maximum log level to expect in the output
27        """
28        for i in range(max_level):
29            if mask & 1:
30                assert 'log_run() log %d' % i == lines.next()
31            if mask & 3:
32                assert 'func() _log %d' % i == lines.next()
33
34    def run_test(testnum):
35        """Run a particular test number (the 'log test' command)
36
37        Args:
38            testnum: Test number to run
39        Returns:
40            iterator containing the lines output from the command
41        """
42        with cons.log.section('basic'):
43           output = u_boot_console.run_command('log test %d' % testnum)
44        split = output.replace('\r', '').splitlines()
45        lines = iter(split)
46        assert 'test %d' % testnum == lines.next()
47        return lines
48
49    def test0():
50        lines = run_test(0)
51        check_log_entries(lines, 3)
52
53    def test1():
54        lines = run_test(1)
55        check_log_entries(lines, 3)
56
57    def test2():
58        lines = run_test(2)
59
60    def test3():
61        lines = run_test(3)
62        check_log_entries(lines, 2)
63
64    def test4():
65        lines = run_test(4)
66        assert next(lines, None) == None
67
68    def test5():
69        lines = run_test(5)
70        check_log_entries(lines, 2)
71
72    def test6():
73        lines = run_test(6)
74        check_log_entries(lines, 3)
75
76    def test7():
77        lines = run_test(7)
78        check_log_entries(lines, 3, LOGL_WARNING)
79
80    def test8():
81        lines = run_test(8)
82        check_log_entries(lines, 3)
83
84    def test9():
85        lines = run_test(9)
86        check_log_entries(lines, 3)
87
88    def test10():
89        lines = run_test(10)
90        for i in range(7):
91            assert 'log_test() level %d' % i == lines.next()
92
93    # TODO(sjg@chromium.org): Consider structuring this as separate tests
94    cons = u_boot_console
95    test0()
96    test1()
97    test2()
98    test3()
99    test4()
100    test5()
101    test6()
102    test7()
103    test8()
104    test9()
105    test10()
106
107@pytest.mark.buildconfigspec('cmd_log')
108def test_log_format(u_boot_console):
109    """Test the 'log format' and 'log rec' commands"""
110    def run_with_format(fmt, expected_output):
111        """Set up the log format and then write a log record
112
113        Args:
114            fmt: Format to use for 'log format'
115            expected_output: Expected output from the 'log rec' command
116        """
117        output = cons.run_command('log format %s' % fmt)
118        assert output == ''
119        output = cons.run_command('log rec arch notice file.c 123 func msg')
120        assert output == expected_output
121
122    cons = u_boot_console
123    with cons.log.section('format'):
124        run_with_format('all', 'NOTICE.arch,file.c:123-func() msg')
125        output = cons.run_command('log format')
126        assert output == 'Log format: clFLfm'
127
128        run_with_format('fm', 'func() msg')
129        run_with_format('clfm', 'NOTICE.arch,func() msg')
130        run_with_format('FLfm', 'file.c:123-func() msg')
131        run_with_format('lm', 'NOTICE. msg')
132        run_with_format('m', 'msg')
133