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