xref: /openbmc/u-boot/test/py/tests/test_log.py (revision 3d5ced9e22d32112a20f9dc0f5fb1f22ef088079)
120faa27cSSimon Glass# SPDX-License-Identifier: GPL-2.0+
283d290c5STom Rini# Copyright (c) 2016, Google Inc.
320faa27cSSimon Glass#
420faa27cSSimon Glass# U-Boot Verified Boot Test
520faa27cSSimon Glass
620faa27cSSimon Glass"""
720faa27cSSimon GlassThis tests U-Boot logging. It uses the 'log test' command with various options
820faa27cSSimon Glassand checks that the output is correct.
920faa27cSSimon Glass"""
1020faa27cSSimon Glass
1120faa27cSSimon Glassimport pytest
1220faa27cSSimon Glass
1320faa27cSSimon GlassLOGL_FIRST, LOGL_WARNING, LOGL_INFO = (0, 4, 6)
1420faa27cSSimon Glass
15680a52c3STom Rini@pytest.mark.buildconfigspec('cmd_log')
1620faa27cSSimon Glassdef test_log(u_boot_console):
1720faa27cSSimon Glass    """Test that U-Boot logging works correctly."""
1820faa27cSSimon Glass    def check_log_entries(lines, mask, max_level=LOGL_INFO):
1920faa27cSSimon Glass        """Check that the expected log records appear in the output
2020faa27cSSimon Glass
2120faa27cSSimon Glass        Args:
2220faa27cSSimon Glass            lines: iterator containing lines to check
2320faa27cSSimon Glass            mask: bit mask to select which lines to check for:
2420faa27cSSimon Glass                bit 0: standard log line
2520faa27cSSimon Glass                bit 1: _log line
2620faa27cSSimon Glass            max_level: maximum log level to expect in the output
2720faa27cSSimon Glass        """
2820faa27cSSimon Glass        for i in range(max_level):
2920faa27cSSimon Glass            if mask & 1:
30deca50fbSSimon Glass                assert 'log_run() log %d' % i == lines.next()
3120faa27cSSimon Glass            if mask & 3:
32deca50fbSSimon Glass                assert 'func() _log %d' % i == lines.next()
3320faa27cSSimon Glass
3420faa27cSSimon Glass    def run_test(testnum):
3520faa27cSSimon Glass        """Run a particular test number (the 'log test' command)
3620faa27cSSimon Glass
3720faa27cSSimon Glass        Args:
3820faa27cSSimon Glass            testnum: Test number to run
3920faa27cSSimon Glass        Returns:
4020faa27cSSimon Glass            iterator containing the lines output from the command
4120faa27cSSimon Glass        """
4220faa27cSSimon Glass        with cons.log.section('basic'):
4320faa27cSSimon Glass           output = u_boot_console.run_command('log test %d' % testnum)
4420faa27cSSimon Glass        split = output.replace('\r', '').splitlines()
4520faa27cSSimon Glass        lines = iter(split)
4620faa27cSSimon Glass        assert 'test %d' % testnum == lines.next()
4720faa27cSSimon Glass        return lines
4820faa27cSSimon Glass
4920faa27cSSimon Glass    def test0():
5020faa27cSSimon Glass        lines = run_test(0)
5120faa27cSSimon Glass        check_log_entries(lines, 3)
5220faa27cSSimon Glass
5320faa27cSSimon Glass    def test1():
5420faa27cSSimon Glass        lines = run_test(1)
5520faa27cSSimon Glass        check_log_entries(lines, 3)
5620faa27cSSimon Glass
5720faa27cSSimon Glass    def test2():
5820faa27cSSimon Glass        lines = run_test(2)
5920faa27cSSimon Glass
6020faa27cSSimon Glass    def test3():
6120faa27cSSimon Glass        lines = run_test(3)
6220faa27cSSimon Glass        check_log_entries(lines, 2)
6320faa27cSSimon Glass
6420faa27cSSimon Glass    def test4():
6520faa27cSSimon Glass        lines = run_test(4)
6620faa27cSSimon Glass        assert next(lines, None) == None
6720faa27cSSimon Glass
6820faa27cSSimon Glass    def test5():
6920faa27cSSimon Glass        lines = run_test(5)
7020faa27cSSimon Glass        check_log_entries(lines, 2)
7120faa27cSSimon Glass
7220faa27cSSimon Glass    def test6():
7320faa27cSSimon Glass        lines = run_test(6)
7420faa27cSSimon Glass        check_log_entries(lines, 3)
7520faa27cSSimon Glass
7620faa27cSSimon Glass    def test7():
7720faa27cSSimon Glass        lines = run_test(7)
7820faa27cSSimon Glass        check_log_entries(lines, 3, LOGL_WARNING)
7920faa27cSSimon Glass
8020faa27cSSimon Glass    def test8():
8120faa27cSSimon Glass        lines = run_test(8)
8220faa27cSSimon Glass        check_log_entries(lines, 3)
8320faa27cSSimon Glass
8420faa27cSSimon Glass    def test9():
8520faa27cSSimon Glass        lines = run_test(9)
8620faa27cSSimon Glass        check_log_entries(lines, 3)
8720faa27cSSimon Glass
88*cdd140afSSimon Glass    def test10():
89*cdd140afSSimon Glass        lines = run_test(10)
90*cdd140afSSimon Glass        for i in range(7):
91*cdd140afSSimon Glass            assert 'log_test() level %d' % i == lines.next()
92*cdd140afSSimon Glass
9320faa27cSSimon Glass    # TODO(sjg@chromium.org): Consider structuring this as separate tests
9420faa27cSSimon Glass    cons = u_boot_console
9520faa27cSSimon Glass    test0()
9620faa27cSSimon Glass    test1()
9720faa27cSSimon Glass    test2()
9820faa27cSSimon Glass    test3()
9920faa27cSSimon Glass    test4()
10020faa27cSSimon Glass    test5()
10120faa27cSSimon Glass    test6()
10220faa27cSSimon Glass    test7()
10320faa27cSSimon Glass    test8()
10420faa27cSSimon Glass    test9()
105*cdd140afSSimon Glass    test10()
106aa4e0e00SSimon Glass
107680a52c3STom Rini@pytest.mark.buildconfigspec('cmd_log')
108aa4e0e00SSimon Glassdef test_log_format(u_boot_console):
109aa4e0e00SSimon Glass    """Test the 'log format' and 'log rec' commands"""
110aa4e0e00SSimon Glass    def run_with_format(fmt, expected_output):
111aa4e0e00SSimon Glass        """Set up the log format and then write a log record
112aa4e0e00SSimon Glass
113aa4e0e00SSimon Glass        Args:
114aa4e0e00SSimon Glass            fmt: Format to use for 'log format'
115aa4e0e00SSimon Glass            expected_output: Expected output from the 'log rec' command
116aa4e0e00SSimon Glass        """
117aa4e0e00SSimon Glass        output = cons.run_command('log format %s' % fmt)
118aa4e0e00SSimon Glass        assert output == ''
119aa4e0e00SSimon Glass        output = cons.run_command('log rec arch notice file.c 123 func msg')
120aa4e0e00SSimon Glass        assert output == expected_output
121aa4e0e00SSimon Glass
122aa4e0e00SSimon Glass    cons = u_boot_console
123aa4e0e00SSimon Glass    with cons.log.section('format'):
124aa4e0e00SSimon Glass        run_with_format('all', 'NOTICE.arch,file.c:123-func() msg')
125aa4e0e00SSimon Glass        output = cons.run_command('log format')
126aa4e0e00SSimon Glass        assert output == 'Log format: clFLfm'
127aa4e0e00SSimon Glass
128aa4e0e00SSimon Glass        run_with_format('fm', 'func() msg')
129aa4e0e00SSimon Glass        run_with_format('clfm', 'NOTICE.arch,func() msg')
130aa4e0e00SSimon Glass        run_with_format('FLfm', 'file.c:123-func() msg')
131aa4e0e00SSimon Glass        run_with_format('lm', 'NOTICE. msg')
132aa4e0e00SSimon Glass        run_with_format('m', 'msg')
133