1# SPDX-License-Identifier: GPL-2.0 2# Copyright (c) 2017 Alison Chaiken 3# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. 4 5# Test GPT manipulation commands. 6 7import os 8import pytest 9import u_boot_utils 10 11""" 12These tests rely on a 4 MB disk image, which is automatically created by 13the test. 14""" 15 16class GptTestDiskImage(object): 17 """Disk Image used by the GPT tests.""" 18 19 def __init__(self, u_boot_console): 20 """Initialize a new GptTestDiskImage object. 21 22 Args: 23 u_boot_console: A U-Boot console. 24 25 Returns: 26 Nothing. 27 """ 28 29 filename = 'test_gpt_disk_image.bin' 30 31 persistent = u_boot_console.config.persistent_data_dir + '/' + filename 32 self.path = u_boot_console.config.result_dir + '/' + filename 33 34 with u_boot_utils.persistent_file_helper(u_boot_console.log, persistent): 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 # part1 offset 1MB size 1MB 47 cmd = ('sgdisk', '--new=1:2048:4095', '-c 1:part1', persistent) 48 # part2 offset 2MB size 1.5MB 49 u_boot_utils.run_and_log(u_boot_console, cmd) 50 cmd = ('sgdisk', '--new=2:4096:7167', '-c 2:part2', persistent) 51 u_boot_utils.run_and_log(u_boot_console, cmd) 52 cmd = ('sgdisk', '-l', persistent) 53 u_boot_utils.run_and_log(u_boot_console, cmd) 54 55 cmd = ('cp', persistent, self.path) 56 u_boot_utils.run_and_log(u_boot_console, cmd) 57 58gtdi = None 59@pytest.fixture(scope='function') 60def state_disk_image(u_boot_console): 61 """pytest fixture to provide a GptTestDiskImage object to tests. 62 This is function-scoped because it uses u_boot_console, which is also 63 function-scoped. However, we don't need to actually do any function-scope 64 work, so this simply returns the same object over and over each time.""" 65 66 global gtdi 67 if not gtdi: 68 gtdi = GptTestDiskImage(u_boot_console) 69 return gtdi 70 71@pytest.mark.boardspec('sandbox') 72@pytest.mark.buildconfigspec('cmd_gpt') 73@pytest.mark.buildconfigspec('cmd_part') 74@pytest.mark.requiredtool('sgdisk') 75def test_gpt_read(state_disk_image, u_boot_console): 76 """Test the gpt read command.""" 77 78 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 79 output = u_boot_console.run_command('gpt read host 0') 80 assert 'Start 1MiB, size 1MiB' in output 81 assert 'Block size 512, name part1' in output 82 assert 'Start 2MiB, size 1MiB' in output 83 assert 'Block size 512, name part2' in output 84 output = u_boot_console.run_command('part list host 0') 85 assert '0x00000800 0x00000fff "part1"' in output 86 assert '0x00001000 0x00001bff "part2"' in output 87 88@pytest.mark.boardspec('sandbox') 89@pytest.mark.buildconfigspec('cmd_gpt') 90@pytest.mark.requiredtool('sgdisk') 91def test_gpt_verify(state_disk_image, u_boot_console): 92 """Test the gpt verify command.""" 93 94 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 95 output = u_boot_console.run_command('gpt verify host 0') 96 assert 'Verify GPT: success!' in output 97 98@pytest.mark.boardspec('sandbox') 99@pytest.mark.buildconfigspec('cmd_gpt') 100@pytest.mark.requiredtool('sgdisk') 101def test_gpt_guid(state_disk_image, u_boot_console): 102 """Test the gpt guid command.""" 103 104 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 105 output = u_boot_console.run_command('gpt guid host 0') 106 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output 107 108@pytest.mark.boardspec('sandbox') 109@pytest.mark.buildconfigspec('cmd_gpt') 110@pytest.mark.requiredtool('sgdisk') 111def test_gpt_save_guid(state_disk_image, u_boot_console): 112 """Test the gpt guid command to save GUID into a string.""" 113 114 if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y': 115 pytest.skip('gpt command not supported') 116 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 117 output = u_boot_console.run_command('gpt guid host 0 newguid') 118 output = u_boot_console.run_command('printenv newguid') 119 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output 120 121@pytest.mark.boardspec('sandbox') 122@pytest.mark.buildconfigspec('cmd_gpt') 123@pytest.mark.buildconfigspec('cmd_gpt_rename') 124@pytest.mark.buildconfigspec('cmd_part') 125@pytest.mark.requiredtool('sgdisk') 126def test_gpt_rename_partition(state_disk_image, u_boot_console): 127 """Test the gpt rename command to write partition names.""" 128 129 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 130 u_boot_console.run_command('gpt rename host 0 1 first') 131 output = u_boot_console.run_command('gpt read host 0') 132 assert 'name first' in output 133 u_boot_console.run_command('gpt rename host 0 2 second') 134 output = u_boot_console.run_command('gpt read host 0') 135 assert 'name second' in output 136 output = u_boot_console.run_command('part list host 0') 137 assert '0x00000800 0x00000fff "first"' in output 138 assert '0x00001000 0x00001bff "second"' in output 139 140@pytest.mark.boardspec('sandbox') 141@pytest.mark.buildconfigspec('cmd_gpt') 142@pytest.mark.buildconfigspec('cmd_gpt_rename') 143@pytest.mark.buildconfigspec('cmd_part') 144@pytest.mark.requiredtool('sgdisk') 145def test_gpt_swap_partitions(state_disk_image, u_boot_console): 146 """Test the gpt swap command to exchange two partition names.""" 147 148 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 149 output = u_boot_console.run_command('part list host 0') 150 assert '0x00000800 0x00000fff "first"' in output 151 assert '0x00001000 0x00001bff "second"' in output 152 u_boot_console.run_command('gpt swap host 0 first second') 153 output = u_boot_console.run_command('part list host 0') 154 assert '0x00000800 0x00000fff "second"' in output 155 assert '0x00001000 0x00001bff "first"' in output 156 157@pytest.mark.boardspec('sandbox') 158@pytest.mark.buildconfigspec('cmd_gpt') 159@pytest.mark.buildconfigspec('cmd_part') 160@pytest.mark.requiredtool('sgdisk') 161def test_gpt_write(state_disk_image, u_boot_console): 162 """Test the gpt write command.""" 163 164 u_boot_console.run_command('host bind 0 ' + state_disk_image.path) 165 output = u_boot_console.run_command('gpt write host 0 "name=all,size=0"') 166 assert 'Writing GPT: success!' in output 167 output = u_boot_console.run_command('part list host 0') 168 assert '0x00000022 0x00001fde "all"' in output 169 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;"') 170 assert 'Writing GPT: success!' in output 171 output = u_boot_console.run_command('part list host 0') 172 assert '0x00000800 0x00000fff "first"' in output 173 assert '0x00001000 0x00001bff "second"' in output 174 output = u_boot_console.run_command('gpt guid host 0') 175 assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output 176