blob: 275f9382d2f9ca0ad5eb38bdc2f500e128b26aae [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001# SPDX-License-Identifier: GPL-2.0+
Simon Glass5f0e0c82017-12-04 13:48:30 -07002# Copyright (c) 2016, Google Inc.
3#
Simon Glass5f0e0c82017-12-04 13:48:30 -07004# 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
Tom Rini686dc7e2018-05-25 08:28:45 -040015@pytest.mark.buildconfigspec('cmd_log')
Simon Glass5f0e0c82017-12-04 13:48:30 -070016def 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:
Tom Rini7f24c192019-10-24 11:59:20 -040030 assert 'log_run() log %d' % i == next(lines)
Simon Glass5f0e0c82017-12-04 13:48:30 -070031 if mask & 3:
Tom Rini7f24c192019-10-24 11:59:20 -040032 assert 'func() _log %d' % i == next(lines)
Simon Glass5f0e0c82017-12-04 13:48:30 -070033
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 """
Heinrich Schuchardt2d349c72020-06-17 21:52:44 +020042 output = u_boot_console.run_command('log format fm')
43 assert output == ''
Simon Glass5f0e0c82017-12-04 13:48:30 -070044 with cons.log.section('basic'):
45 output = u_boot_console.run_command('log test %d' % testnum)
46 split = output.replace('\r', '').splitlines()
47 lines = iter(split)
Tom Rini7f24c192019-10-24 11:59:20 -040048 assert 'test %d' % testnum == next(lines)
Simon Glass5f0e0c82017-12-04 13:48:30 -070049 return lines
50
51 def test0():
52 lines = run_test(0)
53 check_log_entries(lines, 3)
54
55 def test1():
56 lines = run_test(1)
57 check_log_entries(lines, 3)
58
59 def test2():
60 lines = run_test(2)
61
62 def test3():
63 lines = run_test(3)
64 check_log_entries(lines, 2)
65
66 def test4():
67 lines = run_test(4)
68 assert next(lines, None) == None
69
70 def test5():
71 lines = run_test(5)
72 check_log_entries(lines, 2)
73
74 def test6():
75 lines = run_test(6)
76 check_log_entries(lines, 3)
77
78 def test7():
79 lines = run_test(7)
80 check_log_entries(lines, 3, LOGL_WARNING)
81
82 def test8():
83 lines = run_test(8)
84 check_log_entries(lines, 3)
85
86 def test9():
87 lines = run_test(9)
88 check_log_entries(lines, 3)
89
Simon Glass1b69a992018-10-01 11:55:06 -060090 def test10():
91 lines = run_test(10)
92 for i in range(7):
Tom Rini7f24c192019-10-24 11:59:20 -040093 assert 'log_test() level %d' % i == next(lines)
Simon Glass1b69a992018-10-01 11:55:06 -060094
Simon Glass133350a2020-09-12 12:28:49 -060095 def test11():
96 """Test use of log_device_set_enable()"""
97 lines = run_test(11)
98 assert 'log_test() default'
99 # disabled should not be displayed
100 assert 'log_test() enabled'
101
Simon Glass5f0e0c82017-12-04 13:48:30 -0700102 # TODO(sjg@chromium.org): Consider structuring this as separate tests
103 cons = u_boot_console
104 test0()
105 test1()
106 test2()
107 test3()
108 test4()
109 test5()
110 test6()
111 test7()
112 test8()
113 test9()
Simon Glass1b69a992018-10-01 11:55:06 -0600114 test10()
Simon Glass133350a2020-09-12 12:28:49 -0600115 test11()
Simon Glass32e9b162017-12-28 13:14:21 -0700116
Tom Rini686dc7e2018-05-25 08:28:45 -0400117@pytest.mark.buildconfigspec('cmd_log')
Simon Glass32e9b162017-12-28 13:14:21 -0700118def test_log_format(u_boot_console):
119 """Test the 'log format' and 'log rec' commands"""
120 def run_with_format(fmt, expected_output):
121 """Set up the log format and then write a log record
122
123 Args:
124 fmt: Format to use for 'log format'
125 expected_output: Expected output from the 'log rec' command
126 """
127 output = cons.run_command('log format %s' % fmt)
128 assert output == ''
129 output = cons.run_command('log rec arch notice file.c 123 func msg')
130 assert output == expected_output
131
132 cons = u_boot_console
133 with cons.log.section('format'):
134 run_with_format('all', 'NOTICE.arch,file.c:123-func() msg')
135 output = cons.run_command('log format')
136 assert output == 'Log format: clFLfm'
137
138 run_with_format('fm', 'func() msg')
139 run_with_format('clfm', 'NOTICE.arch,func() msg')
140 run_with_format('FLfm', 'file.c:123-func() msg')
141 run_with_format('lm', 'NOTICE. msg')
142 run_with_format('m', 'msg')