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