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 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 cmd = ('sgdisk', '--new=1:2048:2560', '-c 1:part1', persistent) 48 u_boot_utils.run_and_log(u_boot_console, cmd) 49 cmd = ('sgdisk', '--new=2:4096:4608', '-c 2:part2', persistent) 50 u_boot_utils.run_and_log(u_boot_console, cmd) 51 cmd = ('sgdisk', '-l', persistent) 52 u_boot_utils.run_and_log(u_boot_console, cmd) 53 54 cmd = ('cp', persistent, self.path) 55 u_boot_utils.run_and_log(u_boot_console, cmd) 56 57gtdi = None 58@pytest.fixture(scope='function') 59def state_disk_image(u_boot_console): 60 """pytest fixture to provide a GptTestDiskImage object to tests. 61 This is function-scoped because it uses u_boot_console, which is also 62 function-scoped. However, we don't need to actually do any function-scope 63 work, so this simply returns the same object over and over each time.""" 64 65 global gtdi 66 if not gtdi: 67 gtdi = GptTestDiskImage(u_boot_console) 68 return gtdi 69 70@pytest.mark.boardspec('sandbox') 71@pytest.mark.buildconfigspec('cmd_gpt') 72@pytest.mark.buildconfigspec('cmd_part') 73@pytest.mark.requiredtool('sgdisk') 74def test_gpt_read(state_disk_image, u_boot_console): 75 """Test the gpt read command.""" 76 77 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 78 output = u_boot_console.run_command('gpt read host 0') 79 assert 'Start 1MiB, size 0MiB' in output 80 assert 'Block size 512, name part1' in output 81 assert 'Start 2MiB, size 0MiB' in output 82 assert 'Block size 512, name part2' in output 83 output = u_boot_console.run_command('part list host 0') 84 assert '0x00000800 0x00000a00 "part1"' in output 85 assert '0x00001000 0x00001200 "part2"' in output 86 87@pytest.mark.boardspec('sandbox') 88@pytest.mark.buildconfigspec('cmd_gpt') 89@pytest.mark.requiredtool('sgdisk') 90def test_gpt_verify(state_disk_image, u_boot_console): 91 """Test the gpt verify command.""" 92 93 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 94 output = u_boot_console.run_command('gpt verify host 0') 95 assert 'Verify GPT: success!' in output 96 97@pytest.mark.boardspec('sandbox') 98@pytest.mark.buildconfigspec('cmd_gpt') 99@pytest.mark.requiredtool('sgdisk') 100def test_gpt_guid(state_disk_image, u_boot_console): 101 """Test the gpt guid command.""" 102 103 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 104 output = u_boot_console.run_command('gpt guid host 0') 105 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output 106 107@pytest.mark.boardspec('sandbox') 108@pytest.mark.buildconfigspec('cmd_gpt') 109@pytest.mark.requiredtool('sgdisk') 110def test_gpt_save_guid(state_disk_image, u_boot_console): 111 """Test the gpt guid command to save GUID into a string.""" 112 113 if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y': 114 pytest.skip('gpt command not supported') 115 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 116 output = u_boot_console.run_command('gpt guid host 0 newguid') 117 output = u_boot_console.run_command('printenv newguid') 118 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output 119 120@pytest.mark.boardspec('sandbox') 121@pytest.mark.buildconfigspec('cmd_gpt') 122@pytest.mark.buildconfigspec('cmd_gpt_rename') 123@pytest.mark.buildconfigspec('cmd_part') 124@pytest.mark.requiredtool('sgdisk') 125def test_gpt_rename_partition(state_disk_image, u_boot_console): 126 """Test the gpt rename command to write partition names.""" 127 128 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 129 u_boot_console.run_command('gpt rename host 0 1 first') 130 output = u_boot_console.run_command('gpt read host 0') 131 assert 'name first' in output 132 u_boot_console.run_command('gpt rename host 0 2 second') 133 output = u_boot_console.run_command('gpt read host 0') 134 assert 'name second' in output 135 output = u_boot_console.run_command('part list host 0') 136 assert '0x00000800 0x00000a00 "first"' in output 137 assert '0x00001000 0x00001200 "second"' in output 138 139@pytest.mark.boardspec('sandbox') 140@pytest.mark.buildconfigspec('cmd_gpt') 141@pytest.mark.buildconfigspec('cmd_gpt_rename') 142@pytest.mark.buildconfigspec('cmd_part') 143@pytest.mark.requiredtool('sgdisk') 144def test_gpt_swap_partitions(state_disk_image, u_boot_console): 145 """Test the gpt swap command to exchange two partition names.""" 146 147 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 148 output = u_boot_console.run_command('part list host 0') 149 assert '0x00000800 0x00000a00 "first"' in output 150 assert '0x00001000 0x00001200 "second"' in output 151 u_boot_console.run_command('gpt swap host 0 first second') 152 output = u_boot_console.run_command('part list host 0') 153 assert '0x00000800 0x00000a00 "second"' in output 154 assert '0x00001000 0x00001200 "first"' in output 155 156@pytest.mark.boardspec('sandbox') 157@pytest.mark.buildconfigspec('cmd_gpt') 158@pytest.mark.buildconfigspec('cmd_part') 159@pytest.mark.requiredtool('sgdisk') 160def test_gpt_write(state_disk_image, u_boot_console): 161 """Test the gpt write command.""" 162 163 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 164 output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"') 165 assert 'Writing GPT: success!' in output 166 output = u_boot_console.run_command('part list host 0') 167 assert '0x00000022 0x00001fde "all"' in output 168 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;"') 169 assert 'Writing GPT: success!' in output 170 output = u_boot_console.run_command('part list host 0') 171 assert '0x00000800 0x00000a00 "first"' in output 172 assert '0x00001000 0x00001200 "second"' in output 173 output = u_boot_console.run_command('gpt guid host 0') 174 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output 175