1303980Sngie# $NetBSD: t_gpt.sh,v 1.15 2016/03/08 08:04:48 joerg Exp $ 2303980Sngie# 3303980Sngie# Copyright (c) 2015 The NetBSD Foundation, Inc. 4303980Sngie# All rights reserved. 5303980Sngie# 6303980Sngie# This code is derived from software contributed to The NetBSD Foundation 7303980Sngie# by Christos Zoulas 8303980Sngie# 9303980Sngie# Redistribution and use in source and binary forms, with or without 10303980Sngie# modification, are permitted provided that the following conditions 11303980Sngie# are met: 12303980Sngie# 1. Redistributions of source code must retain the above copyright 13303980Sngie# notice, this list of conditions and the following disclaimer. 14303980Sngie# 2. Redistributions in binary form must reproduce the above copyright 15303980Sngie# notice, this list of conditions and the following disclaimer in the 16303980Sngie# documentation and/or other materials provided with the distribution. 17303980Sngie# 18303980Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19303980Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20303980Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21303980Sngie# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22303980Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23303980Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24303980Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25303980Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26303980Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27303980Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28303980Sngie# POSSIBILITY OF SUCH DAMAGE. 29303980Sngie# 30303980Sngie 31303980Sngiebootblk=/usr/mdec/gptmbr.bin 32303980Sngiesize=10240 33303980Sngienewsize=20480 34303980Sngieshdr=34 35303980Sngiedisk=gpt.disk 36303980Sngieuuid="........-....-....-....-............" 37303980Sngiezero="00000000-0000-0000-0000-000000000000" 38303980Sngiesrc=$(atf_get_srcdir) 39303980Sngie 40303980Sngiesilence() { 41303980Sngie atf_check -s exit:0 -o empty -e empty "$@" 42303980Sngie} 43303980Sngie 44303980Sngieinline() { 45303980Sngie local inline="$1" 46303980Sngie shift 47303980Sngie atf_check -s exit:0 -e empty -o inline:"$inline" "$@" 48303980Sngie} 49303980Sngie 50303980Sngiematch() { 51303980Sngie local match="$1" 52303980Sngie shift 53303980Sngie atf_check -s exit:0 -e empty -o match:"$match" "$@" 54303980Sngie} 55303980Sngie 56303980Sngiematcherr() { 57303980Sngie local match="$1" 58303980Sngie shift 59303980Sngie atf_check -s exit:0 -o empty -e match:"$match" "$@" 60303980Sngie} 61303980Sngie 62303980Sngiefile() { 63303980Sngie local file="$1" 64303980Sngie shift 65303980Sngie atf_check -s exit:0 -e empty -o file:"$file" "$@" 66303980Sngie} 67303980Sngie 68303980Sngiesave() { 69303980Sngie local save="$1" 70303980Sngie shift 71303980Sngie atf_check -s exit:0 -e empty -o save:"$save" "$@" 72303980Sngie} 73303980Sngie 74303980Sngiezerodd() { 75303980Sngie silence dd conv=notrunc msgfmt=quiet if=/dev/zero of="$disk" "$@" 76303980Sngie} 77303980Sngie 78303980Sngieprepare() { 79303980Sngie rm -f "$disk" 80303980Sngie zerodd seek="$size" count=1 81303980Sngie} 82303980Sngie 83303980Sngieprepare_2part() { 84303980Sngie prepare 85303980Sngie silence gpt create "$disk" 86303980Sngie match "$(partaddmsg 1 34 1024)" gpt add -t efi -s 1024 "$disk" 87303980Sngie match "$(partaddmsg 2 1058 9150)" gpt add "$disk" 88303980Sngie} 89303980Sngie 90303980Sngie# Calling this from tests does not work. BUG! 91303980Sngiecheck_2part() { 92303980Sngie file "$src/gpt.2part.show.normal" gpt show "$disk" 93303980Sngie file "$src/gpt.2part.show.uuid" gpt show -u "$disk" 94303980Sngie} 95303980Sngie 96303980Sngiepartaddmsg() { 97303980Sngie echo "^$disk: Partition $1 added: $uuid $2 $3\$" 98303980Sngie} 99303980Sngie 100303980Sngiepartresmsg() { 101303980Sngie echo "^$disk: Partition $1 resized: $2 $3\$" 102303980Sngie} 103303980Sngie 104303980Sngiepartremmsg() { 105303980Sngie echo "^$disk: Partition $1 removed\$" 106303980Sngie} 107303980Sngie 108303980Sngiepartlblmsg() { 109303980Sngie echo "^$disk: Partition $1 label changed\$" 110303980Sngie} 111303980Sngie 112303980Sngiepartbootmsg() { 113303980Sngie echo "^$disk: Partition $1 marked as bootable\$" 114303980Sngie} 115303980Sngie 116303980Sngierecovermsg() { 117303980Sngie echo "^$disk: Recovered $1 GPT [a-z]* from $2\$" 118303980Sngie} 119303980Sngie 120303980Sngiemigratemsg() { 121303980Sngie echo -n "^gpt: $disk: Partition $1 unknown type MSDOS, " 122303980Sngie echo 'using "Microsoft Basic Data"$' 123303980Sngie} 124303980Sngie 125303980Sngieattrmsg() { 126303980Sngie echo "^$disk: Partition $1 attributes updated\$" 127303980Sngie} 128303980Sngie 129303980Sngietypemsg() { 130303980Sngie echo "^$disk: Partition $1 type changed\$" 131303980Sngie} 132303980Sngie 133303980Sngieatf_test_case create_empty 134303980Sngiecreate_empty_head() { 135303980Sngie atf_set "descr" "Create empty disk" 136303980Sngie} 137303980Sngie 138303980Sngiecreate_empty_body() { 139303980Sngie prepare 140303980Sngie silence gpt create "$disk" 141303980Sngie file "$src/gpt.empty.show.normal" gpt show "$disk" 142303980Sngie} 143303980Sngie 144303980Sngieatf_test_case create_2part 145303980Sngiecreate_2part_head() { 146303980Sngie atf_set "descr" "Create 2 partition disk" 147303980Sngie} 148303980Sngie 149303980Sngiecreate_2part_body() { 150303980Sngie prepare_2part 151303980Sngie check_2part 152303980Sngie} 153303980Sngie 154303980Sngieatf_test_case change_attr_2part 155303980Sngiechange_attr_2part_head() { 156303980Sngie atf_set "descr" "Change the attribute of 2 partition disk" 157303980Sngie} 158303980Sngie 159303980Sngiechange_attr_2part_body() { 160303980Sngie prepare_2part 161303980Sngie match "$(attrmsg 1)" gpt set -i 1 -a biosboot,bootme "$disk" 162303980Sngie save attr gpt show -i 1 "$disk" 163303980Sngie match "^Attributes: biosboot, bootme\$" tail -1 attr 164303980Sngie match "$(attrmsg 1)" gpt unset -i 1 -a biosboot,bootme "$disk" 165303980Sngie save attr gpt show -i 1 "$disk" 166303980Sngie match "^Attributes: None\$" tail -1 attr 167303980Sngie} 168303980Sngie 169303980Sngieatf_test_case change_type_2part 170303980Sngiechange_type_2part_head() { 171303980Sngie atf_set "descr" "Change the partition type type of 2 partition disk" 172303980Sngie} 173303980Sngie 174303980Sngiechange_type_2part_body() { 175303980Sngie prepare_2part 176303980Sngie match "$(typemsg 1)" gpt type -i 1 -T apple "$disk" 177303980Sngie save type gpt show -i 1 "$disk" 178303980Sngie inline "Type: apple (48465300-0000-11aa-aa11-00306543ecac)\n" \ 179303980Sngie grep "^Type:" type 180303980Sngie match "$(typemsg 1)" gpt type -i 1 -T efi "$disk" 181303980Sngie save type gpt show -i 1 "$disk" 182303980Sngie inline "Type: efi (c12a7328-f81f-11d2-ba4b-00a0c93ec93b)\n" \ 183303980Sngie grep "^Type:" type 184303980Sngie} 185303980Sngie 186303980Sngieatf_test_case backup_2part 187303980Sngiebackup_2part_head() { 188303980Sngie atf_set "descr" "Backup 2 partition disk" 189303980Sngie} 190303980Sngie 191303980Sngiebackup_2part_body() { 192303980Sngie prepare_2part 193303980Sngie save test.backup gpt backup "$disk" 194303980Sngie file "$src/gpt.backup" sed -e "s/$uuid/$zero/g" "test.backup" 195303980Sngie} 196303980Sngie 197303980Sngieatf_test_case restore_2part 198303980Sngierestore_2part_head() { 199303980Sngie atf_set "descr" "Restore 2 partition disk" 200303980Sngie} 201303980Sngie 202303980Sngierestore_2part_body() { 203303980Sngie prepare_2part 204303980Sngie save test.backup gpt backup "$disk" 205303980Sngie prepare 206303980Sngie silence gpt restore -i test.backup "$disk" 207303980Sngie check_2part 208303980Sngie} 209303980Sngie 210303980Sngieatf_test_case recover_backup 211303980Sngierecover_backup_head() { 212303980Sngie atf_set "descr" "Recover the backup GPT header and table" 213303980Sngie} 214303980Sngie 215303980Sngierecover_backup_body() { 216303980Sngie prepare_2part 217303980Sngie zerodd seek="$((size - shdr))" count="$shdr" 218303980Sngie match "$(recovermsg secondary primary)" gpt recover "$disk" 219303980Sngie check_2part 220303980Sngie} 221303980Sngie 222303980Sngieatf_test_case recover_primary 223303980Sngierecover_primary_head() { 224303980Sngie atf_set "descr" "Recover the primary GPT header and table" 225303980Sngie} 226303980Sngie 227303980Sngierecover_primary_body() { 228303980Sngie prepare_2part 229303980Sngie zerodd seek=1 count="$shdr" 230303980Sngie match "$(recovermsg primary secondary)" gpt recover "$disk" 231303980Sngie check_2part 232303980Sngie} 233303980Sngie 234303980Sngieatf_test_case resize_2part 235303980Sngieresize_2part_head() { 236303980Sngie atf_set "descr" "Resize a 2 partition disk and partition" 237303980Sngie} 238303980Sngie 239303980Sngieresize_2part_body() { 240303980Sngie prepare_2part 241303980Sngie zerodd seek="$newsize" count=1 242303980Sngie silence gpt resizedisk "$disk" 243303980Sngie file "$src/gpt.resizedisk.show.normal" gpt show "$disk" 244303980Sngie match "$(partresmsg 2 1058 19390)" gpt resize -i 2 "$disk" 245303980Sngie file "$src/gpt.resizepart.show.normal" gpt show "$disk" 246303980Sngie} 247303980Sngie 248303980Sngieatf_test_case remove_2part 249303980Sngieremove_2part_head() { 250303980Sngie atf_set "descr" "Remove a partition from a 2 partition disk" 251303980Sngie} 252303980Sngie 253303980Sngieremove_2part_body() { 254303980Sngie prepare_2part 255303980Sngie match "$(partremmsg 1)" -e empty gpt remove \ 256303980Sngie -i 1 "$disk" 257303980Sngie file "$src/gpt.removepart.show.normal" \ 258303980Sngie gpt show "$disk" 259303980Sngie} 260303980Sngie 261303980Sngieatf_test_case label_2part 262303980Sngielabel_2part_head() { 263303980Sngie atf_set "descr" "Label partitions in a 2 partition disk" 264303980Sngie} 265303980Sngie 266303980Sngielabel_2part_body() { 267303980Sngie prepare_2part 268303980Sngie match "$(partlblmsg 1)" gpt label -i 1 -l potato "$disk" 269303980Sngie match "$(partlblmsg 2)" gpt label -i 2 -l tomato "$disk" 270303980Sngie file "$src/gpt.2part.show.label" \ 271303980Sngie gpt show -l "$disk" 272303980Sngie} 273303980Sngie 274303980Sngieatf_test_case bootable_2part 275303980Sngiebootable_2part_head() { 276303980Sngie atf_set "descr" "Make partition 2 bootable in a 2 partition disk" 277303980Sngie atf_set "require.files" "$bootblk" 278303980Sngie} 279303980Sngie 280303980Sngiebootable_2part_body() { 281303980Sngie prepare_2part 282303980Sngie match "$(partbootmsg 2)" gpt biosboot -i 2 "$disk" 283303980Sngie local bootsz="$(ls -l "$bootblk" | awk '{ print $5 }')" 284303980Sngie silence dd msgfmt=quiet if="$disk" of=bootblk bs=1 count="$bootsz" 285303980Sngie silence cmp "$bootblk" bootblk 286303980Sngie save bootattr gpt show -i 2 "$disk" 287303980Sngie match "^Attributes: biosboot\$" tail -1 bootattr 288303980Sngie} 289303980Sngie 290303980Sngieatf_test_case migrate_disklabel 291303980Sngiemigrate_disklabel_head() { 292303980Sngie atf_set "descr" "Migrate an MBR+disklabel disk to GPT" 293303980Sngie} 294303980Sngie 295303980Sngiemigrate_disklabel_body() { 296303980Sngie prepare 297303980Sngie silence fdisk -fi "$disk" 298303980Sngie silence fdisk -fu0s "169/63/$((size / 10))" "$disk" 299303980Sngie silence disklabel -R "$disk" "$src/gpt.disklabel" 300303980Sngie matcherr "$(migratemsg 5)" gpt migrate "$disk" 301303980Sngie file "$src/gpt.disklabel.show.normal" gpt show "$disk" 302303980Sngie} 303303980Sngie 304303980Sngieatf_init_test_cases() { 305303980Sngie atf_add_test_case create_empty 306303980Sngie atf_add_test_case create_2part 307303980Sngie atf_add_test_case change_attr_2part 308303980Sngie atf_add_test_case change_type_2part 309303980Sngie atf_add_test_case backup_2part 310303980Sngie atf_add_test_case remove_2part 311303980Sngie atf_add_test_case restore_2part 312303980Sngie atf_add_test_case recover_backup 313303980Sngie atf_add_test_case recover_primary 314303980Sngie atf_add_test_case resize_2part 315303980Sngie atf_add_test_case label_2part 316303980Sngie atf_add_test_case bootable_2part 317303980Sngie atf_add_test_case migrate_disklabel 318303980Sngie} 319