1# SPDX-License-Identifier: GPL-2.0 2# Copyright (c) 2017, Heinrich Schuchardt <xypron.glpk@gmx.de> 3 4# Test efi API implementation 5 6import pytest 7import u_boot_utils 8 9@pytest.mark.buildconfigspec('cmd_bootefi_selftest') 10def test_efi_selftest(u_boot_console): 11 """Test the UEFI implementation 12 13 :param u_boot_console: U-Boot console 14 15 This function executes all selftests that are not marked as on request. 16 """ 17 u_boot_console.run_command(cmd='setenv efi_selftest') 18 u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False) 19 m = u_boot_console.p.expect(['Summary: 0 failures', 'Press any key']) 20 if m != 0: 21 raise Exception('Failures occurred during the EFI selftest') 22 u_boot_console.restart_uboot(); 23 24@pytest.mark.buildconfigspec('cmd_bootefi_selftest') 25@pytest.mark.buildconfigspec('of_control') 26@pytest.mark.notbuildconfigspec('generate_acpi_table') 27def test_efi_selftest_device_tree(u_boot_console): 28 u_boot_console.run_command(cmd='setenv efi_selftest list') 29 output = u_boot_console.run_command('bootefi selftest') 30 assert '\'device tree\'' in output 31 u_boot_console.run_command(cmd='setenv efi_selftest device tree') 32 u_boot_console.run_command(cmd='setenv -f serial# Testing DT') 33 u_boot_console.run_command(cmd='bootefi selftest ${fdtcontroladdr}', wait_for_prompt=False) 34 m = u_boot_console.p.expect(['serial-number: Testing DT', 'U-Boot']) 35 if m != 0: 36 raise Exception('serial-number missing in device tree') 37 u_boot_console.restart_uboot(); 38 39@pytest.mark.buildconfigspec('cmd_bootefi_selftest') 40def test_efi_selftest_watchdog_reboot(u_boot_console): 41 u_boot_console.run_command(cmd='setenv efi_selftest list') 42 output = u_boot_console.run_command('bootefi selftest') 43 assert '\'watchdog reboot\'' in output 44 u_boot_console.run_command(cmd='setenv efi_selftest watchdog reboot') 45 u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False) 46 m = u_boot_console.p.expect(['resetting', 'U-Boot']) 47 if m != 0: 48 raise Exception('Reset failed in \'watchdog reboot\' test') 49 u_boot_console.restart_uboot(); 50 51@pytest.mark.buildconfigspec('cmd_bootefi_selftest') 52def test_efi_selftest_text_input(u_boot_console): 53 """Test the EFI_SIMPLE_TEXT_INPUT_PROTOCOL 54 55 :param u_boot_console: U-Boot console 56 57 This function calls the text input EFI selftest. 58 """ 59 u_boot_console.run_command(cmd='setenv efi_selftest text input') 60 output = u_boot_console.run_command(cmd='bootefi selftest', 61 wait_for_prompt=False) 62 m = u_boot_console.p.expect([r'To terminate type \'x\'']) 63 if m != 0: 64 raise Exception('No prompt for \'text input\' test') 65 u_boot_console.drain_console() 66 u_boot_console.p.timeout = 500 67 # EOT 68 u_boot_console.run_command(cmd=chr(4), wait_for_echo=False, 69 send_nl=False, wait_for_prompt=False) 70 m = u_boot_console.p.expect( 71 [r'Unicode char 4 \(unknown\), scan code 0 \(Null\)']) 72 if m != 0: 73 raise Exception('EOT failed in \'text input\' test') 74 u_boot_console.drain_console() 75 # BS 76 u_boot_console.run_command(cmd=chr(8), wait_for_echo=False, 77 send_nl=False, wait_for_prompt=False) 78 m = u_boot_console.p.expect( 79 [r'Unicode char 8 \(BS\), scan code 0 \(Null\)']) 80 if m != 0: 81 raise Exception('BS failed in \'text input\' test') 82 u_boot_console.drain_console() 83 # TAB 84 u_boot_console.run_command(cmd=chr(9), wait_for_echo=False, 85 send_nl=False, wait_for_prompt=False) 86 m = u_boot_console.p.expect( 87 [r'Unicode char 9 \(TAB\), scan code 0 \(Null\)']) 88 if m != 0: 89 raise Exception('BS failed in \'text input\' test') 90 u_boot_console.drain_console() 91 # a 92 u_boot_console.run_command(cmd='a', wait_for_echo=False, send_nl=False, 93 wait_for_prompt=False) 94 m = u_boot_console.p.expect( 95 [r'Unicode char 97 \(\'a\'\), scan code 0 \(Null\)']) 96 if m != 0: 97 raise Exception('\'a\' failed in \'text input\' test') 98 u_boot_console.drain_console() 99 # UP escape sequence 100 u_boot_console.run_command(cmd=chr(27) + '[A', wait_for_echo=False, 101 send_nl=False, wait_for_prompt=False) 102 m = u_boot_console.p.expect( 103 [r'Unicode char 0 \(Null\), scan code 1 \(Up\)']) 104 if m != 0: 105 raise Exception('UP failed in \'text input\' test') 106 u_boot_console.drain_console() 107 # Euro sign 108 u_boot_console.run_command(cmd=b'\xe2\x82\xac'.decode(), wait_for_echo=False, 109 send_nl=False, wait_for_prompt=False) 110 m = u_boot_console.p.expect([r'Unicode char 8364 \(\'']) 111 if m != 0: 112 raise Exception('Euro sign failed in \'text input\' test') 113 u_boot_console.drain_console() 114 u_boot_console.run_command(cmd='x', wait_for_echo=False, send_nl=False, 115 wait_for_prompt=False) 116 m = u_boot_console.p.expect(['Summary: 0 failures', 'Press any key']) 117 if m != 0: 118 raise Exception('Failures occurred during the EFI selftest') 119 u_boot_console.restart_uboot(); 120 121@pytest.mark.buildconfigspec('cmd_bootefi_selftest') 122def test_efi_selftest_text_input_ex(u_boot_console): 123 """Test the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL 124 125 :param u_boot_console: U-Boot console 126 127 This function calls the extended text input EFI selftest. 128 """ 129 u_boot_console.run_command(cmd='setenv efi_selftest extended text input') 130 output = u_boot_console.run_command(cmd='bootefi selftest', 131 wait_for_prompt=False) 132 m = u_boot_console.p.expect([r'To terminate type \'CTRL\+x\'']) 133 if m != 0: 134 raise Exception('No prompt for \'text input\' test') 135 u_boot_console.drain_console() 136 u_boot_console.p.timeout = 500 137 # EOT 138 u_boot_console.run_command(cmd=chr(4), wait_for_echo=False, 139 send_nl=False, wait_for_prompt=False) 140 m = u_boot_console.p.expect( 141 [r'Unicode char 100 \(\'d\'\), scan code 0 \(CTRL\+Null\)']) 142 if m != 0: 143 raise Exception('EOT failed in \'text input\' test') 144 u_boot_console.drain_console() 145 # BS 146 u_boot_console.run_command(cmd=chr(8), wait_for_echo=False, 147 send_nl=False, wait_for_prompt=False) 148 m = u_boot_console.p.expect( 149 [r'Unicode char 8 \(BS\), scan code 0 \(\+Null\)']) 150 if m != 0: 151 raise Exception('BS failed in \'text input\' test') 152 u_boot_console.drain_console() 153 # TAB 154 u_boot_console.run_command(cmd=chr(9), wait_for_echo=False, 155 send_nl=False, wait_for_prompt=False) 156 m = u_boot_console.p.expect( 157 [r'Unicode char 9 \(TAB\), scan code 0 \(\+Null\)']) 158 if m != 0: 159 raise Exception('TAB failed in \'text input\' test') 160 u_boot_console.drain_console() 161 # a 162 u_boot_console.run_command(cmd='a', wait_for_echo=False, send_nl=False, 163 wait_for_prompt=False) 164 m = u_boot_console.p.expect( 165 [r'Unicode char 97 \(\'a\'\), scan code 0 \(Null\)']) 166 if m != 0: 167 raise Exception('\'a\' failed in \'text input\' test') 168 u_boot_console.drain_console() 169 # UP escape sequence 170 u_boot_console.run_command(cmd=chr(27) + '[A', wait_for_echo=False, 171 send_nl=False, wait_for_prompt=False) 172 m = u_boot_console.p.expect( 173 [r'Unicode char 0 \(Null\), scan code 1 \(\+Up\)']) 174 if m != 0: 175 raise Exception('UP failed in \'text input\' test') 176 u_boot_console.drain_console() 177 # Euro sign 178 u_boot_console.run_command(cmd=b'\xe2\x82\xac'.decode(), wait_for_echo=False, 179 send_nl=False, wait_for_prompt=False) 180 m = u_boot_console.p.expect([r'Unicode char 8364 \(\'']) 181 if m != 0: 182 raise Exception('Euro sign failed in \'text input\' test') 183 u_boot_console.drain_console() 184 # SHIFT+ALT+FN 5 185 u_boot_console.run_command(cmd=b'\x1b\x5b\x31\x35\x3b\x34\x7e'.decode(), 186 wait_for_echo=False, send_nl=False, 187 wait_for_prompt=False) 188 m = u_boot_console.p.expect( 189 [r'Unicode char 0 \(Null\), scan code 15 \(SHIFT\+ALT\+FN 5\)']) 190 if m != 0: 191 raise Exception('SHIFT+ALT+FN 5 failed in \'text input\' test') 192 u_boot_console.drain_console() 193 u_boot_console.run_command(cmd=chr(24), wait_for_echo=False, send_nl=False, 194 wait_for_prompt=False) 195 m = u_boot_console.p.expect(['Summary: 0 failures', 'Press any key']) 196 if m != 0: 197 raise Exception('Failures occurred during the EFI selftest') 198 u_boot_console.restart_uboot(); 199