]> git.sur5r.net Git - u-boot/blob - test/py/tests/test_gpt.py
2eb07a1d2b0e1effde9a3910bd665ad61d0740d7
[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         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             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)
52
53         cmd = ('cp', persistent, self.path)
54         u_boot_utils.run_and_log(u_boot_console, cmd)
55
56 gtdi = None
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."""
63
64     global gtdi
65     if not gtdi:
66         gtdi = GptTestDiskImage(u_boot_console)
67     return gtdi
68
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."""
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')
89 def 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')
98 @pytest.mark.requiredtool('sgdisk')
99 def test_gpt_guid(state_disk_image, u_boot_console):
100     """Test the gpt guid command."""
101
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
105
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."""
111
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
118
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."""
125
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
133
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."""
141
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
150
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."""
157
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