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