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