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