4329b69b7adda59f8c1d0bf495e096d6d026e24d
[oweals/u-boot.git] / test / py / tests / test_gpt.py
1 # Copyright (c) 2017 Alison Chaiken
2 # Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
3 #
4 # SPDX-License-Identifier: GPL-2.0
5
6 # Test GPT manipulation commands.
7
8 import os
9 import pytest
10 import u_boot_utils
11
12 """
13 These tests rely on a 4 MB disk image, which is automatically created by
14 the test.
15 """
16
17 class 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'
31
32         persistent = u_boot_console.config.persistent_data_dir + '/' + filename
33         self.path = u_boot_console.config.result_dir  + '/' + filename
34
35         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)
47                 cmd = ('sgdisk', '--new=1:2048:2560', '-c 1:part1', persistent)
48                 u_boot_utils.run_and_log(u_boot_console, cmd)
49                 cmd = ('sgdisk', '--new=2:4096:4608', '-c 2:part2', persistent)
50                 u_boot_utils.run_and_log(u_boot_console, cmd)
51                 cmd = ('sgdisk', '-l', persistent)
52                 u_boot_utils.run_and_log(u_boot_console, cmd)
53
54         cmd = ('cp', persistent, self.path)
55         u_boot_utils.run_and_log(u_boot_console, cmd)
56
57 gtdi = None
58 @pytest.fixture(scope='function')
59 def state_disk_image(u_boot_console):
60     """pytest fixture to provide a GptTestDiskImage object to tests.
61     This is function-scoped because it uses u_boot_console, which is also
62     function-scoped. However, we don't need to actually do any function-scope
63     work, so this simply returns the same object over and over each time."""
64
65     global gtdi
66     if not gtdi:
67         gtdi = GptTestDiskImage(u_boot_console)
68     return gtdi
69
70 @pytest.mark.boardspec('sandbox')
71 @pytest.mark.buildconfigspec('cmd_gpt')
72 @pytest.mark.buildconfigspec('cmd_part')
73 @pytest.mark.requiredtool('sgdisk')
74 def test_gpt_read(state_disk_image, u_boot_console):
75     """Test the gpt read command."""
76
77     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
78     output = u_boot_console.run_command('gpt read host 0')
79     assert 'Start 1MiB, size 0MiB' in output
80     assert 'Block size 512, name part1' in output
81     assert 'Start 2MiB, size 0MiB' in output
82     assert 'Block size 512, name part2' in output
83     output = u_boot_console.run_command('part list host 0')
84     assert '0x00000800  0x00000a00      "part1"' in output
85     assert '0x00001000  0x00001200      "part2"' in output
86
87 @pytest.mark.boardspec('sandbox')
88 @pytest.mark.buildconfigspec('cmd_gpt')
89 @pytest.mark.requiredtool('sgdisk')
90 def test_gpt_verify(state_disk_image, u_boot_console):
91     """Test the gpt verify command."""
92
93     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
94     output = u_boot_console.run_command('gpt verify host 0')
95     assert 'Verify GPT: success!' in output
96
97 @pytest.mark.boardspec('sandbox')
98 @pytest.mark.buildconfigspec('cmd_gpt')
99 @pytest.mark.requiredtool('sgdisk')
100 def test_gpt_guid(state_disk_image, u_boot_console):
101     """Test the gpt guid command."""
102
103     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
104     output = u_boot_console.run_command('gpt guid host 0')
105     assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
106
107 @pytest.mark.boardspec('sandbox')
108 @pytest.mark.buildconfigspec('cmd_gpt')
109 @pytest.mark.requiredtool('sgdisk')
110 def test_gpt_save_guid(state_disk_image, u_boot_console):
111     """Test the gpt guid command to save GUID into a string."""
112
113     if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y':
114         pytest.skip('gpt command not supported')
115     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
116     output = u_boot_console.run_command('gpt guid host 0 newguid')
117     output = u_boot_console.run_command('printenv newguid')
118     assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
119
120 @pytest.mark.boardspec('sandbox')
121 @pytest.mark.buildconfigspec('cmd_gpt')
122 @pytest.mark.buildconfigspec('cmd_gpt_rename')
123 @pytest.mark.buildconfigspec('cmd_part')
124 @pytest.mark.requiredtool('sgdisk')
125 def test_gpt_rename_partition(state_disk_image, u_boot_console):
126     """Test the gpt rename command to write partition names."""
127
128     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
129     u_boot_console.run_command('gpt rename host 0 1 first')
130     output = u_boot_console.run_command('gpt read host 0')
131     assert 'name first' in output
132     u_boot_console.run_command('gpt rename host 0 2 second')
133     output = u_boot_console.run_command('gpt read host 0')
134     assert 'name second' in output
135     output = u_boot_console.run_command('part list host 0')
136     assert '0x00000800  0x00000a00      "first"' in output
137     assert '0x00001000  0x00001200      "second"' in output
138
139 @pytest.mark.boardspec('sandbox')
140 @pytest.mark.buildconfigspec('cmd_gpt')
141 @pytest.mark.buildconfigspec('cmd_gpt_rename')
142 @pytest.mark.buildconfigspec('cmd_part')
143 @pytest.mark.requiredtool('sgdisk')
144 def test_gpt_swap_partitions(state_disk_image, u_boot_console):
145     """Test the gpt swap command to exchange two partition names."""
146
147     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
148     output = u_boot_console.run_command('part list host 0')
149     assert '0x00000800  0x00000a00      "first"' in output
150     assert '0x00001000  0x00001200      "second"' in output
151     u_boot_console.run_command('gpt swap host 0 first second')
152     output = u_boot_console.run_command('part list host 0')
153     assert '0x00000800  0x00000a00      "second"' in output
154     assert '0x00001000  0x00001200      "first"' in output
155
156 @pytest.mark.boardspec('sandbox')
157 @pytest.mark.buildconfigspec('cmd_gpt')
158 @pytest.mark.buildconfigspec('cmd_part')
159 @pytest.mark.requiredtool('sgdisk')
160 def test_gpt_write(state_disk_image, u_boot_console):
161     """Test the gpt write command."""
162
163     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
164     output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"')
165     assert 'Writing GPT: success!' in output
166     output = u_boot_console.run_command('part list host 0')
167     assert '0x00000022  0x00001fde      "all"' in output
168     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;"')
169     assert 'Writing GPT: success!' in output
170     output = u_boot_console.run_command('part list host 0')
171     assert '0x00000800  0x00000a00      "first"' in output
172     assert '0x00001000  0x00001200      "second"' in output
173     output = u_boot_console.run_command('gpt guid host 0')
174     assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output