blob: 946858800d6cb1cc3920a8771ea260f1a8db452d [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001# SPDX-License-Identifier: GPL-2.0
Alison Chaiken1b11fb02017-09-09 23:47:13 -07002# Copyright (c) 2017 Alison Chaiken
Stephen Warren97dcbde2017-09-15 12:19:38 -06003# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
Alison Chaiken1b11fb02017-09-09 23:47:13 -07004
5# Test GPT manipulation commands.
6
7import os
8import pytest
9import u_boot_utils
Alison Chaiken1b11fb02017-09-09 23:47:13 -070010
11"""
Stephen Warren97dcbde2017-09-15 12:19:38 -060012These tests rely on a 4 MB disk image, which is automatically created by
13the test.
Alison Chaiken1b11fb02017-09-09 23:47:13 -070014"""
15
Simon Glassdddd0772022-08-06 17:51:53 -060016# Mark all tests here as slow
17pytestmark = pytest.mark.slow
18
Stephen Warren97dcbde2017-09-15 12:19:38 -060019class GptTestDiskImage(object):
20 """Disk Image used by the GPT tests."""
21
22 def __init__(self, u_boot_console):
23 """Initialize a new GptTestDiskImage object.
24
25 Args:
26 u_boot_console: A U-Boot console.
27
28 Returns:
29 Nothing.
30 """
31
32 filename = 'test_gpt_disk_image.bin'
Stephen Warren97dcbde2017-09-15 12:19:38 -060033
Patrick Delaunaye9e3a3e2017-10-18 15:11:03 +020034 persistent = u_boot_console.config.persistent_data_dir + '/' + filename
35 self.path = u_boot_console.config.result_dir + '/' + filename
36
Stephen Warrena3b8f992017-10-26 18:23:35 -060037 with u_boot_utils.persistent_file_helper(u_boot_console.log, persistent):
38 if os.path.exists(persistent):
39 u_boot_console.log.action('Disk image file ' + persistent +
40 ' already exists')
41 else:
42 u_boot_console.log.action('Generating ' + persistent)
43 fd = os.open(persistent, os.O_RDWR | os.O_CREAT)
44 os.ftruncate(fd, 4194304)
45 os.close(fd)
Sam Protsenko13616a92019-07-02 21:20:32 +030046 cmd = ('sgdisk',
47 '--disk-guid=375a56f7-d6c9-4e81-b5f0-09d41ca89efe',
Stephen Warrena3b8f992017-10-26 18:23:35 -060048 persistent)
49 u_boot_utils.run_and_log(u_boot_console, cmd)
Patrick Delaunayde7200a2017-12-06 18:08:20 +010050 # part1 offset 1MB size 1MB
Sam Protsenko13616a92019-07-02 21:20:32 +030051 cmd = ('sgdisk', '--new=1:2048:4095', '--change-name=1:part1',
Joshua Wattfd1134e2023-08-31 10:51:37 -060052 '-A 1:set:2',
Sam Protsenko13616a92019-07-02 21:20:32 +030053 persistent)
Patrick Delaunayde7200a2017-12-06 18:08:20 +010054 # part2 offset 2MB size 1.5MB
Stephen Warrena3b8f992017-10-26 18:23:35 -060055 u_boot_utils.run_and_log(u_boot_console, cmd)
Sam Protsenko13616a92019-07-02 21:20:32 +030056 cmd = ('sgdisk', '--new=2:4096:7167', '--change-name=2:part2',
57 persistent)
Stephen Warrena3b8f992017-10-26 18:23:35 -060058 u_boot_utils.run_and_log(u_boot_console, cmd)
Sam Protsenko13616a92019-07-02 21:20:32 +030059 cmd = ('sgdisk', '--load-backup=' + persistent)
Stephen Warrena3b8f992017-10-26 18:23:35 -060060 u_boot_utils.run_and_log(u_boot_console, cmd)
Stephen Warren97dcbde2017-09-15 12:19:38 -060061
Patrick Delaunaye9e3a3e2017-10-18 15:11:03 +020062 cmd = ('cp', persistent, self.path)
63 u_boot_utils.run_and_log(u_boot_console, cmd)
64
Stephen Warren97dcbde2017-09-15 12:19:38 -060065@pytest.fixture(scope='function')
66def state_disk_image(u_boot_console):
67 """pytest fixture to provide a GptTestDiskImage object to tests.
68 This is function-scoped because it uses u_boot_console, which is also
Joshua Wattd64d5792023-08-31 10:51:36 -060069 function-scoped. A new disk is returned each time to prevent tests from
70 interfering with each other."""
Stephen Warren97dcbde2017-09-15 12:19:38 -060071
Joshua Wattd64d5792023-08-31 10:51:36 -060072 return GptTestDiskImage(u_boot_console)
Stephen Warren97dcbde2017-09-15 12:19:38 -060073
74@pytest.mark.boardspec('sandbox')
Alison Chaiken1b11fb02017-09-09 23:47:13 -070075@pytest.mark.buildconfigspec('cmd_gpt')
Patrick Delaunayc06b7842017-10-18 15:11:04 +020076@pytest.mark.buildconfigspec('cmd_part')
77@pytest.mark.requiredtool('sgdisk')
78def test_gpt_read(state_disk_image, u_boot_console):
79 """Test the gpt read command."""
80
81 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
82 output = u_boot_console.run_command('gpt read host 0')
Patrick Delaunayde7200a2017-12-06 18:08:20 +010083 assert 'Start 1MiB, size 1MiB' in output
Patrick Delaunayc06b7842017-10-18 15:11:04 +020084 assert 'Block size 512, name part1' in output
Patrick Delaunayde7200a2017-12-06 18:08:20 +010085 assert 'Start 2MiB, size 1MiB' in output
Patrick Delaunayc06b7842017-10-18 15:11:04 +020086 assert 'Block size 512, name part2' in output
87 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayde7200a2017-12-06 18:08:20 +010088 assert '0x00000800 0x00000fff "part1"' in output
89 assert '0x00001000 0x00001bff "part2"' in output
Patrick Delaunayc06b7842017-10-18 15:11:04 +020090
91@pytest.mark.boardspec('sandbox')
92@pytest.mark.buildconfigspec('cmd_gpt')
93@pytest.mark.requiredtool('sgdisk')
94def test_gpt_verify(state_disk_image, u_boot_console):
95 """Test the gpt verify command."""
96
97 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
98 output = u_boot_console.run_command('gpt verify host 0')
99 assert 'Verify GPT: success!' in output
100
101@pytest.mark.boardspec('sandbox')
102@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren2079db32017-09-18 11:11:49 -0600103@pytest.mark.requiredtool('sgdisk')
Philippe Reynesdbeedc32022-04-22 17:46:50 +0200104def test_gpt_repair(state_disk_image, u_boot_console):
105 """Test the gpt repair command."""
106
107 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
108 output = u_boot_console.run_command('gpt repair host 0')
109 assert 'Repairing GPT: success!' in output
110
111@pytest.mark.boardspec('sandbox')
112@pytest.mark.buildconfigspec('cmd_gpt')
113@pytest.mark.requiredtool('sgdisk')
Stephen Warren97dcbde2017-09-15 12:19:38 -0600114def test_gpt_guid(state_disk_image, u_boot_console):
Alison Chaiken1b11fb02017-09-09 23:47:13 -0700115 """Test the gpt guid command."""
116
Stephen Warren97dcbde2017-09-15 12:19:38 -0600117 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaiken1b11fb02017-09-09 23:47:13 -0700118 output = u_boot_console.run_command('gpt guid host 0')
119 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
120
Stephen Warren97dcbde2017-09-15 12:19:38 -0600121@pytest.mark.boardspec('sandbox')
Alison Chaiken1b11fb02017-09-09 23:47:13 -0700122@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren2079db32017-09-18 11:11:49 -0600123@pytest.mark.requiredtool('sgdisk')
Joshua Wattfd1134e2023-08-31 10:51:37 -0600124def test_gpt_setenv(state_disk_image, u_boot_console):
125 """Test the gpt setenv command."""
126 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
127 output = u_boot_console.run_command('gpt setenv host 0 part1')
128 assert 'success!' in output
129 output = u_boot_console.run_command('echo ${gpt_partition_addr}')
130 assert output.rstrip() == '800'
131 output = u_boot_console.run_command('echo ${gpt_partition_size}')
132 assert output.rstrip() == '800'
133 output = u_boot_console.run_command('echo ${gpt_partition_name}')
134 assert output.rstrip() == 'part1'
135 output = u_boot_console.run_command('echo ${gpt_partition_entry}')
136 assert output.rstrip() == '1'
137 output = u_boot_console.run_command('echo ${gpt_partition_bootable}')
138 assert output.rstrip() == '1'
139
140 output = u_boot_console.run_command('gpt setenv host 0 part2')
141 assert 'success!' in output
142 output = u_boot_console.run_command('echo ${gpt_partition_addr}')
143 assert output.rstrip() == '1000'
144 output = u_boot_console.run_command('echo ${gpt_partition_size}')
145 assert output.rstrip() == 'c00'
146 output = u_boot_console.run_command('echo ${gpt_partition_name}')
147 assert output.rstrip() == 'part2'
148 output = u_boot_console.run_command('echo ${gpt_partition_entry}')
149 assert output.rstrip() == '2'
150 output = u_boot_console.run_command('echo ${gpt_partition_bootable}')
151 assert output.rstrip() == '0'
152
153@pytest.mark.boardspec('sandbox')
154@pytest.mark.buildconfigspec('cmd_gpt')
155@pytest.mark.requiredtool('sgdisk')
Stephen Warren97dcbde2017-09-15 12:19:38 -0600156def test_gpt_save_guid(state_disk_image, u_boot_console):
Alison Chaiken1b11fb02017-09-09 23:47:13 -0700157 """Test the gpt guid command to save GUID into a string."""
158
159 if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y':
160 pytest.skip('gpt command not supported')
Stephen Warren97dcbde2017-09-15 12:19:38 -0600161 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaiken1b11fb02017-09-09 23:47:13 -0700162 output = u_boot_console.run_command('gpt guid host 0 newguid')
163 output = u_boot_console.run_command('printenv newguid')
164 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
Alison Chaikencb392962017-09-09 23:54:51 -0700165
Stephen Warren97dcbde2017-09-15 12:19:38 -0600166@pytest.mark.boardspec('sandbox')
Alison Chaikencb392962017-09-09 23:54:51 -0700167@pytest.mark.buildconfigspec('cmd_gpt')
Enric Balletbo i Serrabfd98c62023-01-10 17:19:35 +0100168@pytest.mark.requiredtool('sgdisk')
169def test_gpt_part_type_uuid(state_disk_image, u_boot_console):
170 """Test the gpt partittion type UUID command."""
171
172 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
173 output = u_boot_console.run_command('part type host 0:1')
174 assert '0fc63daf-8483-4772-8e79-3d69d8477de4' in output
175
176@pytest.mark.boardspec('sandbox')
177@pytest.mark.buildconfigspec('cmd_gpt')
178@pytest.mark.requiredtool('sgdisk')
179def test_gpt_part_type_save_uuid(state_disk_image, u_boot_console):
180 """Test the gpt partittion type to save UUID into a string."""
181
182 if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y':
183 pytest.skip('gpt command not supported')
184 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
185 output = u_boot_console.run_command('part type host 0:1 newguid')
186 output = u_boot_console.run_command('printenv newguid')
187 assert '0fc63daf-8483-4772-8e79-3d69d8477de4' in output
188
189@pytest.mark.boardspec('sandbox')
190@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren97dcbde2017-09-15 12:19:38 -0600191@pytest.mark.buildconfigspec('cmd_gpt_rename')
Patrick Delaunay0ffbb642017-10-18 15:11:07 +0200192@pytest.mark.buildconfigspec('cmd_part')
Stephen Warren2079db32017-09-18 11:11:49 -0600193@pytest.mark.requiredtool('sgdisk')
Stephen Warren97dcbde2017-09-15 12:19:38 -0600194def test_gpt_rename_partition(state_disk_image, u_boot_console):
Alison Chaikencb392962017-09-09 23:54:51 -0700195 """Test the gpt rename command to write partition names."""
196
Stephen Warren97dcbde2017-09-15 12:19:38 -0600197 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikencb392962017-09-09 23:54:51 -0700198 u_boot_console.run_command('gpt rename host 0 1 first')
199 output = u_boot_console.run_command('gpt read host 0')
200 assert 'name first' in output
201 u_boot_console.run_command('gpt rename host 0 2 second')
202 output = u_boot_console.run_command('gpt read host 0')
203 assert 'name second' in output
Patrick Delaunay0ffbb642017-10-18 15:11:07 +0200204 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayde7200a2017-12-06 18:08:20 +0100205 assert '0x00000800 0x00000fff "first"' in output
206 assert '0x00001000 0x00001bff "second"' in output
Alison Chaikencb392962017-09-09 23:54:51 -0700207
Stephen Warren97dcbde2017-09-15 12:19:38 -0600208@pytest.mark.boardspec('sandbox')
Alison Chaikencb392962017-09-09 23:54:51 -0700209@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren97dcbde2017-09-15 12:19:38 -0600210@pytest.mark.buildconfigspec('cmd_gpt_rename')
211@pytest.mark.buildconfigspec('cmd_part')
Stephen Warren2079db32017-09-18 11:11:49 -0600212@pytest.mark.requiredtool('sgdisk')
Stephen Warren97dcbde2017-09-15 12:19:38 -0600213def test_gpt_swap_partitions(state_disk_image, u_boot_console):
Alison Chaikencb392962017-09-09 23:54:51 -0700214 """Test the gpt swap command to exchange two partition names."""
215
Stephen Warren97dcbde2017-09-15 12:19:38 -0600216 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikencb392962017-09-09 23:54:51 -0700217 output = u_boot_console.run_command('part list host 0')
Joshua Wattd64d5792023-08-31 10:51:36 -0600218 assert '0x00000800 0x00000fff "part1"' in output
219 assert '0x00001000 0x00001bff "part2"' in output
220 u_boot_console.run_command('gpt swap host 0 part1 part2')
Alison Chaikencb392962017-09-09 23:54:51 -0700221 output = u_boot_console.run_command('part list host 0')
Joshua Wattd64d5792023-08-31 10:51:36 -0600222 assert '0x00000800 0x00000fff "part2"' in output
223 assert '0x00001000 0x00001bff "part1"' in output
Patrick Delaunay5751c052017-10-18 15:11:06 +0200224
225@pytest.mark.boardspec('sandbox')
226@pytest.mark.buildconfigspec('cmd_gpt')
227@pytest.mark.buildconfigspec('cmd_part')
228@pytest.mark.requiredtool('sgdisk')
229def test_gpt_write(state_disk_image, u_boot_console):
230 """Test the gpt write command."""
231
232 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
233 output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"')
234 assert 'Writing GPT: success!' in output
235 output = u_boot_console.run_command('part list host 0')
236 assert '0x00000022 0x00001fde "all"' in output
Patrick Delaunayde7200a2017-12-06 18:08:20 +0100237 output = u_boot_console.run_command('gpt write host 0 "uuid_disk=375a56f7-d6c9-4e81-b5f0-09d41ca89efe;name=first,start=1M,size=1M;name=second,start=0x200000,size=0x180000;"')
Patrick Delaunay5751c052017-10-18 15:11:06 +0200238 assert 'Writing GPT: success!' in output
239 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayde7200a2017-12-06 18:08:20 +0100240 assert '0x00000800 0x00000fff "first"' in output
241 assert '0x00001000 0x00001bff "second"' in output
Patrick Delaunay5751c052017-10-18 15:11:06 +0200242 output = u_boot_console.run_command('gpt guid host 0')
243 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output