blob: d1c2a36d8f2541dc01e4c18e7271d9213b8fba5c [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001# SPDX-License-Identifier: GPL-2.0+
Simon Glass20faa272017-12-04 13:48:30 -07002# Copyright (c) 2016, Google Inc.
3#
Simon Glass20faa272017-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
15@pytest.mark.buildconfigspec('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:
Simon Glassdeca50f2017-12-28 13:14:18 -070030 assert 'log_run() log %d' % i == lines.next()
Simon Glass20faa272017-12-04 13:48:30 -070031 if mask & 3:
Simon Glassdeca50f2017-12-28 13:14:18 -070032 assert 'func() _log %d' % i == lines.next()
Simon Glass20faa272017-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 """
Simon Glass20faa272017-12-04 13:48:30 -070042 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 # TODO(sjg@chromium.org): Consider structuring this as separate tests
89 cons = u_boot_console
90 test0()
91 test1()
92 test2()
93 test3()
94 test4()
95 test5()
96 test6()
97 test7()
98 test8()
99 test9()
Simon Glassaa4e0e02017-12-28 13:14:21 -0700100
101@pytest.mark.buildconfigspec('log')
102def test_log_format(u_boot_console):
103 """Test the 'log format' and 'log rec' commands"""
104 def run_with_format(fmt, expected_output):
105 """Set up the log format and then write a log record
106
107 Args:
108 fmt: Format to use for 'log format'
109 expected_output: Expected output from the 'log rec' command
110 """
111 output = cons.run_command('log format %s' % fmt)
112 assert output == ''
113 output = cons.run_command('log rec arch notice file.c 123 func msg')
114 assert output == expected_output
115
116 cons = u_boot_console
117 with cons.log.section('format'):
118 run_with_format('all', 'NOTICE.arch,file.c:123-func() msg')
119 output = cons.run_command('log format')
120 assert output == 'Log format: clFLfm'
121
122 run_with_format('fm', 'func() msg')
123 run_with_format('clfm', 'NOTICE.arch,func() msg')
124 run_with_format('FLfm', 'file.c:123-func() msg')
125 run_with_format('lm', 'NOTICE. msg')
126 run_with_format('m', 'msg')