blob: b7adc1096e68815c46ef66c79035ae9c8a90cbcd [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
35 if os.path.exists(persistent):
36 u_boot_console.log.action('Disk image file ' + persistent +
Stephen Warren110ba622017-09-15 12:19:38 -060037 ' already exists')
38 else:
Patrick Delaunayda4c4bb2017-10-18 15:11:03 +020039 u_boot_console.log.action('Generating ' + persistent)
40 fd = os.open(persistent, os.O_RDWR | os.O_CREAT)
Stephen Warren110ba622017-09-15 12:19:38 -060041 os.ftruncate(fd, 4194304)
42 os.close(fd)
Stephen Warren2d26bf62017-09-18 11:11:49 -060043 cmd = ('sgdisk', '-U', '375a56f7-d6c9-4e81-b5f0-09d41ca89efe',
Patrick Delaunayda4c4bb2017-10-18 15:11:03 +020044 persistent)
Stephen Warren110ba622017-09-15 12:19:38 -060045 u_boot_utils.run_and_log(u_boot_console, cmd)
Patrick Delaunay30ef7cb2017-10-18 15:11:04 +020046 cmd = ('sgdisk', '--new=1:2048:2560', '-c 1:part1', persistent)
Stephen Warren110ba622017-09-15 12:19:38 -060047 u_boot_utils.run_and_log(u_boot_console, cmd)
Patrick Delaunay30ef7cb2017-10-18 15:11:04 +020048 cmd = ('sgdisk', '--new=2:4096:4608', '-c 2:part2', persistent)
Stephen Warren110ba622017-09-15 12:19:38 -060049 u_boot_utils.run_and_log(u_boot_console, cmd)
Patrick Delaunayda4c4bb2017-10-18 15:11:03 +020050 cmd = ('sgdisk', '-l', persistent)
Stephen Warren110ba622017-09-15 12:19:38 -060051 u_boot_utils.run_and_log(u_boot_console, cmd)
52
Patrick Delaunayda4c4bb2017-10-18 15:11:03 +020053 cmd = ('cp', persistent, self.path)
54 u_boot_utils.run_and_log(u_boot_console, cmd)
55
Stephen Warren110ba622017-09-15 12:19:38 -060056gtdi = None
57@pytest.fixture(scope='function')
58def state_disk_image(u_boot_console):
59 """pytest fixture to provide a GptTestDiskImage object to tests.
60 This is function-scoped because it uses u_boot_console, which is also
61 function-scoped. However, we don't need to actually do any function-scope
62 work, so this simply returns the same object over and over each time."""
63
64 global gtdi
65 if not gtdi:
66 gtdi = GptTestDiskImage(u_boot_console)
67 return gtdi
68
69@pytest.mark.boardspec('sandbox')
Alison Chaikena2f42252017-09-09 23:47:13 -070070@pytest.mark.buildconfigspec('cmd_gpt')
Patrick Delaunay30ef7cb2017-10-18 15:11:04 +020071@pytest.mark.buildconfigspec('cmd_part')
72@pytest.mark.requiredtool('sgdisk')
73def test_gpt_read(state_disk_image, u_boot_console):
74 """Test the gpt read command."""
75
76 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
77 output = u_boot_console.run_command('gpt read host 0')
78 assert 'Start 1MiB, size 0MiB' in output
79 assert 'Block size 512, name part1' in output
80 assert 'Start 2MiB, size 0MiB' in output
81 assert 'Block size 512, name part2' in output
82 output = u_boot_console.run_command('part list host 0')
83 assert '0x00000800 0x00000a00 "part1"' in output
84 assert '0x00001000 0x00001200 "part2"' in output
85
86@pytest.mark.boardspec('sandbox')
87@pytest.mark.buildconfigspec('cmd_gpt')
88@pytest.mark.requiredtool('sgdisk')
89def test_gpt_verify(state_disk_image, u_boot_console):
90 """Test the gpt verify command."""
91
92 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
93 output = u_boot_console.run_command('gpt verify host 0')
94 assert 'Verify GPT: success!' in output
95
96@pytest.mark.boardspec('sandbox')
97@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren2d26bf62017-09-18 11:11:49 -060098@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -060099def test_gpt_guid(state_disk_image, u_boot_console):
Alison Chaikena2f42252017-09-09 23:47:13 -0700100 """Test the gpt guid command."""
101
Stephen Warren110ba622017-09-15 12:19:38 -0600102 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikena2f42252017-09-09 23:47:13 -0700103 output = u_boot_console.run_command('gpt guid host 0')
104 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
105
Stephen Warren110ba622017-09-15 12:19:38 -0600106@pytest.mark.boardspec('sandbox')
Alison Chaikena2f42252017-09-09 23:47:13 -0700107@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren2d26bf62017-09-18 11:11:49 -0600108@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -0600109def test_gpt_save_guid(state_disk_image, u_boot_console):
Alison Chaikena2f42252017-09-09 23:47:13 -0700110 """Test the gpt guid command to save GUID into a string."""
111
112 if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y':
113 pytest.skip('gpt command not supported')
Stephen Warren110ba622017-09-15 12:19:38 -0600114 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikena2f42252017-09-09 23:47:13 -0700115 output = u_boot_console.run_command('gpt guid host 0 newguid')
116 output = u_boot_console.run_command('printenv newguid')
117 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
Alison Chaikenc5772182017-09-09 23:54:51 -0700118
Stephen Warren110ba622017-09-15 12:19:38 -0600119@pytest.mark.boardspec('sandbox')
Alison Chaikenc5772182017-09-09 23:54:51 -0700120@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren110ba622017-09-15 12:19:38 -0600121@pytest.mark.buildconfigspec('cmd_gpt_rename')
Patrick Delaunay0cf02ff2017-10-18 15:11:07 +0200122@pytest.mark.buildconfigspec('cmd_part')
Stephen Warren2d26bf62017-09-18 11:11:49 -0600123@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -0600124def test_gpt_rename_partition(state_disk_image, u_boot_console):
Alison Chaikenc5772182017-09-09 23:54:51 -0700125 """Test the gpt rename command to write partition names."""
126
Stephen Warren110ba622017-09-15 12:19:38 -0600127 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikenc5772182017-09-09 23:54:51 -0700128 u_boot_console.run_command('gpt rename host 0 1 first')
129 output = u_boot_console.run_command('gpt read host 0')
130 assert 'name first' in output
131 u_boot_console.run_command('gpt rename host 0 2 second')
132 output = u_boot_console.run_command('gpt read host 0')
133 assert 'name second' in output
Patrick Delaunay0cf02ff2017-10-18 15:11:07 +0200134 output = u_boot_console.run_command('part list host 0')
135 assert '0x00000800 0x000007ff "first"' in output
136 assert '0x00001000 0x000017ff "second"' in output
137 # command error here because 'end LBA' (column 2) change after rename
138 # (previous value can be found in test_gpt_read)
139 # "first" 0xa00 => 0x7ff : it is an invalid value < start LBA !
140 # "seconf" 0x1200 => 0x17ff : size is increasing !
Alison Chaikenc5772182017-09-09 23:54:51 -0700141
Stephen Warren110ba622017-09-15 12:19:38 -0600142@pytest.mark.boardspec('sandbox')
Alison Chaikenc5772182017-09-09 23:54:51 -0700143@pytest.mark.buildconfigspec('cmd_gpt')
Stephen Warren110ba622017-09-15 12:19:38 -0600144@pytest.mark.buildconfigspec('cmd_gpt_rename')
145@pytest.mark.buildconfigspec('cmd_part')
Stephen Warren2d26bf62017-09-18 11:11:49 -0600146@pytest.mark.requiredtool('sgdisk')
Stephen Warren110ba622017-09-15 12:19:38 -0600147def test_gpt_swap_partitions(state_disk_image, u_boot_console):
Alison Chaikenc5772182017-09-09 23:54:51 -0700148 """Test the gpt swap command to exchange two partition names."""
149
Stephen Warren110ba622017-09-15 12:19:38 -0600150 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
Alison Chaikenc5772182017-09-09 23:54:51 -0700151 output = u_boot_console.run_command('part list host 0')
Patrick Delaunay0cf02ff2017-10-18 15:11:07 +0200152 assert '0x00000800 0x000007ff "first"' in output
153 assert '0x00001000 0x000017ff "second"' in output
Alison Chaikenc5772182017-09-09 23:54:51 -0700154 u_boot_console.run_command('gpt swap host 0 first second')
155 output = u_boot_console.run_command('part list host 0')
Patrick Delaunay0cf02ff2017-10-18 15:11:07 +0200156 assert '0x00000800 0x000007ff "second"' in output
157 assert '0x00001000 0x000017ff "first"' in output
Patrick Delaunayb61a3b52017-10-18 15:11:06 +0200158
159@pytest.mark.boardspec('sandbox')
160@pytest.mark.buildconfigspec('cmd_gpt')
161@pytest.mark.buildconfigspec('cmd_part')
162@pytest.mark.requiredtool('sgdisk')
163def test_gpt_write(state_disk_image, u_boot_console):
164 """Test the gpt write command."""
165
166 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
167 output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"')
168 assert 'Writing GPT: success!' in output
169 output = u_boot_console.run_command('part list host 0')
170 assert '0x00000022 0x00001fde "all"' in output
171 output = u_boot_console.run_command('gpt write host 0 "uuid_disk=375a56f7-d6c9-4e81-b5f0-09d41ca89efe;name=first,start=0x100000,size=0x40200;name=second,start=0x200000,size=0x40200;"')
172 assert 'Writing GPT: success!' in output
173 output = u_boot_console.run_command('part list host 0')
174 assert '0x00000800 0x00000a00 "first"' in output
175 assert '0x00001000 0x00001200 "second"' in output
176 output = u_boot_console.run_command('gpt guid host 0')
177 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output