xref: /openbmc/u-boot/test/py/tests/test_gpt.py (revision 3a856473)
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
8import os
9import pytest
10import u_boot_utils
11
12"""
13These tests rely on a 4 MB disk image, which is automatically created by
14the test.
15"""
16
17class 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
56gtdi = None
57@pytest.fixture(scope='function')
58def 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')
73def 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')
89def 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')
99def 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')
109def 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.buildconfigspec('cmd_part')
123@pytest.mark.requiredtool('sgdisk')
124def test_gpt_rename_partition(state_disk_image, u_boot_console):
125    """Test the gpt rename command to write partition names."""
126
127    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
128    u_boot_console.run_command('gpt rename host 0 1 first')
129    output = u_boot_console.run_command('gpt read host 0')
130    assert 'name first' in output
131    u_boot_console.run_command('gpt rename host 0 2 second')
132    output = u_boot_console.run_command('gpt read host 0')
133    assert 'name second' in output
134    output = u_boot_console.run_command('part list host 0')
135    assert '0x00000800	0x00000a00	"first"' in output
136    assert '0x00001000	0x00001200	"second"' in output
137
138@pytest.mark.boardspec('sandbox')
139@pytest.mark.buildconfigspec('cmd_gpt')
140@pytest.mark.buildconfigspec('cmd_gpt_rename')
141@pytest.mark.buildconfigspec('cmd_part')
142@pytest.mark.requiredtool('sgdisk')
143def test_gpt_swap_partitions(state_disk_image, u_boot_console):
144    """Test the gpt swap command to exchange two partition names."""
145
146    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
147    output = u_boot_console.run_command('part list host 0')
148    assert '0x00000800	0x00000a00	"first"' in output
149    assert '0x00001000	0x00001200	"second"' in output
150    u_boot_console.run_command('gpt swap host 0 first second')
151    output = u_boot_console.run_command('part list host 0')
152    assert '0x00000800	0x00000a00	"second"' in output
153    assert '0x00001000	0x00001200	"first"' in output
154
155@pytest.mark.boardspec('sandbox')
156@pytest.mark.buildconfigspec('cmd_gpt')
157@pytest.mark.buildconfigspec('cmd_part')
158@pytest.mark.requiredtool('sgdisk')
159def test_gpt_write(state_disk_image, u_boot_console):
160    """Test the gpt write command."""
161
162    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
163    output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"')
164    assert 'Writing GPT: success!' in output
165    output = u_boot_console.run_command('part list host 0')
166    assert '0x00000022	0x00001fde	"all"' in output
167    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;"')
168    assert 'Writing GPT: success!' in output
169    output = u_boot_console.run_command('part list host 0')
170    assert '0x00000800	0x00000a00	"first"' in output
171    assert '0x00001000	0x00001200	"second"' in output
172    output = u_boot_console.run_command('gpt guid host 0')
173    assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
174