blob: 886df43f8bf86e2061b10a44080940584778034d [file] [log] [blame]
Alison Chaikena2f42252017-09-09 23:47:13 -07001# Copyright (c) 2017 Alison Chaiken
Stephen Warren110ba622017-09-15 12:19:38 -06002# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
Alison Chaikena2f42252017-09-09 23:47:13 -07003#
4# SPDX-License-Identifier: GPL-2.0
5
6# Test GPT manipulation commands.
7
8import os
9import pytest
10import u_boot_utils
Alison Chaikena2f42252017-09-09 23:47:13 -070011
12"""
Stephen Warren110ba622017-09-15 12:19:38 -060013These tests rely on a 4 MB disk image, which is automatically created by
14the test.
Alison Chaikena2f42252017-09-09 23:47:13 -070015"""
16
Stephen Warren110ba622017-09-15 12:19:38 -060017class GptTestDiskImage(object):
18 """Disk Image used by the GPT tests."""
19
20 def __init__(self, u_boot_console):
21 """Initialize a new GptTestDiskImage object.
22
23 Args:
24 u_boot_console: A U-Boot console.
25
26 Returns:
27 Nothing.
28 """
29
30 filename = 'test_gpt_disk_image.bin'
Stephen Warren110ba622017-09-15 12:19:38 -060031
Patrick Delaunayda4c4bb2017-10-18 15:11:03 +020032 persistent = u_boot_console.config.persistent_data_dir + '/' + filename
33 self.path = u_boot_console.config.result_dir + '/' + filename
34
Stephen Warrenac122ef2017-10-26 18:23:35 -060035 with u_boot_utils.persistent_file_helper(u_boot_console.log, persistent):
36 if os.path.exists(persistent):
37 u_boot_console.log.action('Disk image file ' + persistent +
38 ' already exists')
39 else:
40 u_boot_console.log.action('Generating ' + persistent)
41 fd = os.open(persistent, os.O_RDWR | os.O_CREAT)
42 os.ftruncate(fd, 4194304)
43 os.close(fd)
44 cmd = ('sgdisk', '-U', '375a56f7-d6c9-4e81-b5f0-09d41ca89efe',
45 persistent)
46 u_boot_utils.run_and_log(u_boot_console, cmd)
Patrick Delaunayf0314642017-12-06 18:08:20 +010047 # part1 offset 1MB size 1MB
48 cmd = ('sgdisk', '--new=1:2048:4095', '-c 1:part1', persistent)
49 # part2 offset 2MB size 1.5MB
Stephen Warrenac122ef2017-10-26 18:23:35 -060050 u_boot_utils.run_and_log(u_boot_console, cmd)
Patrick Delaunayf0314642017-12-06 18:08:20 +010051 cmd = ('sgdisk', '--new=2:4096:7167', '-c 2:part2', persistent)
Stephen Warrenac122ef2017-10-26 18:23:35 -060052 u_boot_utils.run_and_log(u_boot_console, cmd)
53 cmd = ('sgdisk', '-l', persistent)
54 u_boot_utils.run_and_log(u_boot_console, cmd)
Stephen Warren110ba622017-09-15 12:19:38 -060055
Patrick Delaunayda4c4bb2017-10-18 15:11:03 +020056 cmd = ('cp', persistent, self.path)
57 u_boot_utils.run_and_log(u_boot_console, cmd)
58
Stephen Warren110ba622017-09-15 12:19:38 -060059gtdi = None
60@pytest.fixture(scope='function')
61def state_disk_image(u_boot_console):
62 """pytest fixture to provide a GptTestDiskImage object to tests.
63 This is function-scoped because it uses u_boot_console, which is also
64 function-scoped. However, we don't need to actually do any function-scope
65 work, so this simply returns the same object over and over each time."""
66
67 global gtdi
68 if not gtdi:
69 gtdi = GptTestDiskImage(u_boot_console)
70 return gtdi
71
72@pytest.mark.boardspec('sandbox')
Alison Chaikena2f42252017-09-09 23:47:13 -070073@pytest.mark.buildconfigspec('cmd_gpt')
Patrick Delaunay30ef7cb2017-10-18 15:11:04 +020074@pytest.mark.buildconfigspec('cmd_part')
75@pytest.mark.requiredtool('sgdisk')
76def test_gpt_read(state_disk_image, u_boot_console):
77 """Test the gpt read command."""
78
79 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
80 output = u_boot_console.run_command('gpt read host 0')
Patrick Delaunayf0314642017-12-06 18:08:20 +010081 assert 'Start 1MiB, size 1MiB' in output
Patrick Delaunay30ef7cb2017-10-18 15:11:04 +020082 assert 'Block size 512, name part1' in output
Patrick Delaunayf0314642017-12-06 18:08:20 +010083 assert 'Start 2MiB, size 1MiB' in output
Patrick Delaunay30ef7cb2017-10-18 15:11:04 +020084 assert 'Block size 512, name part2' in output
85 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayf0314642017-12-06 18:08:20 +010086 assert '0x00000800 0x00000fff "part1"' in output
87 assert '0x00001000 0x00001bff "part2"' in output
Patrick Delaunay30ef7cb2017-10-18 15:11:04 +020088
89@pytest.mark.boardspec('sandbox')
90@pytest.mark.buildconfigspec('cmd_gpt')
91@pytest.mark.requiredtool('sgdisk')
92def test_gpt_verify(state_disk_image, u_boot_console):
93 """Test the gpt verify command."""
94
95 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
96 output = u_boot_console.run_command('gpt verify host 0')
97 assert 'Verify GPT: success!' in output
98
99@pytest.mark.boardspec('sandbox')
100@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren2d26bf62017-09-18 11:11:49 -0600101@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -0600102def test_gpt_guid(state_disk_image, u_boot_console):
Alison Chaikena2f42252017-09-09 23:47:13 -0700103 """Test the gpt guid command."""
104
Stephen Warren110ba622017-09-15 12:19:38 -0600105 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikena2f42252017-09-09 23:47:13 -0700106 output = u_boot_console.run_command('gpt guid host 0')
107 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
108
Stephen Warren110ba622017-09-15 12:19:38 -0600109@pytest.mark.boardspec('sandbox')
Alison Chaikena2f42252017-09-09 23:47:13 -0700110@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren2d26bf62017-09-18 11:11:49 -0600111@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -0600112def test_gpt_save_guid(state_disk_image, u_boot_console):
Alison Chaikena2f42252017-09-09 23:47:13 -0700113 """Test the gpt guid command to save GUID into a string."""
114
115 if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y':
116 pytest.skip('gpt command not supported')
Stephen Warren110ba622017-09-15 12:19:38 -0600117 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikena2f42252017-09-09 23:47:13 -0700118 output = u_boot_console.run_command('gpt guid host 0 newguid')
119 output = u_boot_console.run_command('printenv newguid')
120 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
Alison Chaikenc5772182017-09-09 23:54:51 -0700121
Stephen Warren110ba622017-09-15 12:19:38 -0600122@pytest.mark.boardspec('sandbox')
Alison Chaikenc5772182017-09-09 23:54:51 -0700123@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren110ba622017-09-15 12:19:38 -0600124@pytest.mark.buildconfigspec('cmd_gpt_rename')
Patrick Delaunay0cf02ff2017-10-18 15:11:07 +0200125@pytest.mark.buildconfigspec('cmd_part')
Stephen Warren2d26bf62017-09-18 11:11:49 -0600126@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -0600127def test_gpt_rename_partition(state_disk_image, u_boot_console):
Alison Chaikenc5772182017-09-09 23:54:51 -0700128 """Test the gpt rename command to write partition names."""
129
Stephen Warren110ba622017-09-15 12:19:38 -0600130 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikenc5772182017-09-09 23:54:51 -0700131 u_boot_console.run_command('gpt rename host 0 1 first')
132 output = u_boot_console.run_command('gpt read host 0')
133 assert 'name first' in output
134 u_boot_console.run_command('gpt rename host 0 2 second')
135 output = u_boot_console.run_command('gpt read host 0')
136 assert 'name second' in output
Patrick Delaunay0cf02ff2017-10-18 15:11:07 +0200137 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayf0314642017-12-06 18:08:20 +0100138 assert '0x00000800 0x00000fff "first"' in output
139 assert '0x00001000 0x00001bff "second"' in output
Alison Chaikenc5772182017-09-09 23:54:51 -0700140
Stephen Warren110ba622017-09-15 12:19:38 -0600141@pytest.mark.boardspec('sandbox')
Alison Chaikenc5772182017-09-09 23:54:51 -0700142@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren110ba622017-09-15 12:19:38 -0600143@pytest.mark.buildconfigspec('cmd_gpt_rename')
144@pytest.mark.buildconfigspec('cmd_part')
Stephen Warren2d26bf62017-09-18 11:11:49 -0600145@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -0600146def test_gpt_swap_partitions(state_disk_image, u_boot_console):
Alison Chaikenc5772182017-09-09 23:54:51 -0700147 """Test the gpt swap command to exchange two partition names."""
148
Stephen Warren110ba622017-09-15 12:19:38 -0600149 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikenc5772182017-09-09 23:54:51 -0700150 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayf0314642017-12-06 18:08:20 +0100151 assert '0x00000800 0x00000fff "first"' in output
152 assert '0x00001000 0x00001bff "second"' in output
Alison Chaikenc5772182017-09-09 23:54:51 -0700153 u_boot_console.run_command('gpt swap host 0 first second')
154 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayf0314642017-12-06 18:08:20 +0100155 assert '0x00000800 0x00000fff "second"' in output
156 assert '0x00001000 0x00001bff "first"' in output
Patrick Delaunayb61a3b52017-10-18 15:11:06 +0200157
158@pytest.mark.boardspec('sandbox')
159@pytest.mark.buildconfigspec('cmd_gpt')
160@pytest.mark.buildconfigspec('cmd_part')
161@pytest.mark.requiredtool('sgdisk')
162def test_gpt_write(state_disk_image, u_boot_console):
163 """Test the gpt write command."""
164
165 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
166 output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"')
167 assert 'Writing GPT: success!' in output
168 output = u_boot_console.run_command('part list host 0')
169 assert '0x00000022 0x00001fde "all"' in output
Patrick Delaunayf0314642017-12-06 18:08:20 +0100170 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 Delaunayb61a3b52017-10-18 15:11:06 +0200171 assert 'Writing GPT: success!' in output
172 output = u_boot_console.run_command('part list host 0')
Patrick Delaunayf0314642017-12-06 18:08:20 +0100173 assert '0x00000800 0x00000fff "first"' in output
174 assert '0x00001000 0x00001bff "second"' in output
Patrick Delaunayb61a3b52017-10-18 15:11:06 +0200175 output = u_boot_console.run_command('gpt guid host 0')
176 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output