1 # Copyright (c) 2017 Alison Chaiken
2 # Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
4 # SPDX-License-Identifier: GPL-2.0
6 # Test GPT manipulation commands.
13 These tests rely on a 4 MB disk image, which is automatically created by
17 class GptTestDiskImage(object):
18 """Disk Image used by the GPT tests."""
20 def __init__(self, u_boot_console):
21 """Initialize a new GptTestDiskImage object.
24 u_boot_console: A U-Boot console.
30 filename = 'test_gpt_disk_image.bin'
32 persistent = u_boot_console.config.persistent_data_dir + '/' + filename
33 self.path = u_boot_console.config.result_dir + '/' + filename
35 if os.path.exists(persistent):
36 u_boot_console.log.action('Disk image file ' + persistent +
39 u_boot_console.log.action('Generating ' + persistent)
40 fd = os.open(persistent, os.O_RDWR | os.O_CREAT)
41 os.ftruncate(fd, 4194304)
43 cmd = ('sgdisk', '-U', '375a56f7-d6c9-4e81-b5f0-09d41ca89efe',
45 u_boot_utils.run_and_log(u_boot_console, cmd)
46 cmd = ('sgdisk', '--new=1:2048:2560', '-c 1:part1', persistent)
47 u_boot_utils.run_and_log(u_boot_console, cmd)
48 cmd = ('sgdisk', '--new=2:4096:4608', '-c 2:part2', persistent)
49 u_boot_utils.run_and_log(u_boot_console, cmd)
50 cmd = ('sgdisk', '-l', persistent)
51 u_boot_utils.run_and_log(u_boot_console, cmd)
53 cmd = ('cp', persistent, self.path)
54 u_boot_utils.run_and_log(u_boot_console, cmd)
57 @pytest.fixture(scope='function')
58 def 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."""
66 gtdi = GptTestDiskImage(u_boot_console)
69 @pytest.mark.boardspec('sandbox')
70 @pytest.mark.buildconfigspec('cmd_gpt')
71 @pytest.mark.buildconfigspec('cmd_part')
72 @pytest.mark.requiredtool('sgdisk')
73 def test_gpt_read(state_disk_image, u_boot_console):
74 """Test the gpt read command."""
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
86 @pytest.mark.boardspec('sandbox')
87 @pytest.mark.buildconfigspec('cmd_gpt')
88 @pytest.mark.requiredtool('sgdisk')
89 def test_gpt_verify(state_disk_image, u_boot_console):
90 """Test the gpt verify command."""
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
96 @pytest.mark.boardspec('sandbox')
97 @pytest.mark.buildconfigspec('cmd_gpt')
98 @pytest.mark.requiredtool('sgdisk')
99 def test_gpt_guid(state_disk_image, u_boot_console):
100 """Test the gpt guid command."""
102 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
103 output = u_boot_console.run_command('gpt guid host 0')
104 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
106 @pytest.mark.boardspec('sandbox')
107 @pytest.mark.buildconfigspec('cmd_gpt')
108 @pytest.mark.requiredtool('sgdisk')
109 def test_gpt_save_guid(state_disk_image, u_boot_console):
110 """Test the gpt guid command to save GUID into a string."""
112 if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y':
113 pytest.skip('gpt command not supported')
114 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
115 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
119 @pytest.mark.boardspec('sandbox')
120 @pytest.mark.buildconfigspec('cmd_gpt')
121 @pytest.mark.buildconfigspec('cmd_gpt_rename')
122 @pytest.mark.requiredtool('sgdisk')
123 def test_gpt_rename_partition(state_disk_image, u_boot_console):
124 """Test the gpt rename command to write partition names."""
126 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
127 u_boot_console.run_command('gpt rename host 0 1 first')
128 output = u_boot_console.run_command('gpt read host 0')
129 assert 'name first' in output
130 u_boot_console.run_command('gpt rename host 0 2 second')
131 output = u_boot_console.run_command('gpt read host 0')
132 assert 'name second' in output
134 @pytest.mark.boardspec('sandbox')
135 @pytest.mark.buildconfigspec('cmd_gpt')
136 @pytest.mark.buildconfigspec('cmd_gpt_rename')
137 @pytest.mark.buildconfigspec('cmd_part')
138 @pytest.mark.requiredtool('sgdisk')
139 def test_gpt_swap_partitions(state_disk_image, u_boot_console):
140 """Test the gpt swap command to exchange two partition names."""
142 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
143 output = u_boot_console.run_command('part list host 0')
144 assert '0x000007ff "first"' in output
145 assert '0x000017ff "second"' in output
146 u_boot_console.run_command('gpt swap host 0 first second')
147 output = u_boot_console.run_command('part list host 0')
148 assert '0x000007ff "second"' in output
149 assert '0x000017ff "first"' in output
151 @pytest.mark.boardspec('sandbox')
152 @pytest.mark.buildconfigspec('cmd_gpt')
153 @pytest.mark.buildconfigspec('cmd_part')
154 @pytest.mark.requiredtool('sgdisk')
155 def test_gpt_write(state_disk_image, u_boot_console):
156 """Test the gpt write command."""
158 u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
159 output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"')
160 assert 'Writing GPT: success!' in output
161 output = u_boot_console.run_command('part list host 0')
162 assert '0x00000022 0x00001fde "all"' in output
163 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;"')
164 assert 'Writing GPT: success!' in output
165 output = u_boot_console.run_command('part list host 0')
166 assert '0x00000800 0x00000a00 "first"' in output
167 assert '0x00001000 0x00001200 "second"' in output
168 output = u_boot_console.run_command('gpt guid host 0')
169 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output