]> git.sur5r.net Git - u-boot/blob - test/py/tests/test_gpt.py
am335x, shc: kconfig: Fix misspelled choice default
[u-boot] / 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                 # part1 offset 1MB size 1MB
48                 cmd = ('sgdisk', '--new=1:2048:4095', '-c 1:part1', persistent)
49                 # part2 offset 2MB size 1.5MB
50                 u_boot_utils.run_and_log(u_boot_console, cmd)
51                 cmd = ('sgdisk', '--new=2:4096:7167', '-c 2:part2', persistent)
52                 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)
55
56         cmd = ('cp', persistent, self.path)
57         u_boot_utils.run_and_log(u_boot_console, cmd)
58
59 gtdi = None
60 @pytest.fixture(scope='function')
61 def 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')
73 @pytest.mark.buildconfigspec('cmd_gpt')
74 @pytest.mark.buildconfigspec('cmd_part')
75 @pytest.mark.requiredtool('sgdisk')
76 def 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')
81     assert 'Start 1MiB, size 1MiB' in output
82     assert 'Block size 512, name part1' in output
83     assert 'Start 2MiB, size 1MiB' in output
84     assert 'Block size 512, name part2' in output
85     output = u_boot_console.run_command('part list host 0')
86     assert '0x00000800  0x00000fff      "part1"' in output
87     assert '0x00001000  0x00001bff      "part2"' in output
88
89 @pytest.mark.boardspec('sandbox')
90 @pytest.mark.buildconfigspec('cmd_gpt')
91 @pytest.mark.requiredtool('sgdisk')
92 def 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')
101 @pytest.mark.requiredtool('sgdisk')
102 def test_gpt_guid(state_disk_image, u_boot_console):
103     """Test the gpt guid command."""
104
105     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
106     output = u_boot_console.run_command('gpt guid host 0')
107     assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
108
109 @pytest.mark.boardspec('sandbox')
110 @pytest.mark.buildconfigspec('cmd_gpt')
111 @pytest.mark.requiredtool('sgdisk')
112 def test_gpt_save_guid(state_disk_image, u_boot_console):
113     """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')
117     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
118     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
121
122 @pytest.mark.boardspec('sandbox')
123 @pytest.mark.buildconfigspec('cmd_gpt')
124 @pytest.mark.buildconfigspec('cmd_gpt_rename')
125 @pytest.mark.buildconfigspec('cmd_part')
126 @pytest.mark.requiredtool('sgdisk')
127 def test_gpt_rename_partition(state_disk_image, u_boot_console):
128     """Test the gpt rename command to write partition names."""
129
130     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
131     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
137     output = u_boot_console.run_command('part list host 0')
138     assert '0x00000800  0x00000fff      "first"' in output
139     assert '0x00001000  0x00001bff      "second"' in output
140
141 @pytest.mark.boardspec('sandbox')
142 @pytest.mark.buildconfigspec('cmd_gpt')
143 @pytest.mark.buildconfigspec('cmd_gpt_rename')
144 @pytest.mark.buildconfigspec('cmd_part')
145 @pytest.mark.requiredtool('sgdisk')
146 def test_gpt_swap_partitions(state_disk_image, u_boot_console):
147     """Test the gpt swap command to exchange two partition names."""
148
149     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
150     output = u_boot_console.run_command('part list host 0')
151     assert '0x00000800  0x00000fff      "first"' in output
152     assert '0x00001000  0x00001bff      "second"' in output
153     u_boot_console.run_command('gpt swap host 0 first second')
154     output = u_boot_console.run_command('part list host 0')
155     assert '0x00000800  0x00000fff      "second"' in output
156     assert '0x00001000  0x00001bff      "first"' in output
157
158 @pytest.mark.boardspec('sandbox')
159 @pytest.mark.buildconfigspec('cmd_gpt')
160 @pytest.mark.buildconfigspec('cmd_part')
161 @pytest.mark.requiredtool('sgdisk')
162 def 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
170     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;"')
171     assert 'Writing GPT: success!' in output
172     output = u_boot_console.run_command('part list host 0')
173     assert '0x00000800  0x00000fff      "first"' in output
174     assert '0x00001000  0x00001bff      "second"' in output
175     output = u_boot_console.run_command('gpt guid host 0')
176     assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output