xref: /freebsd/contrib/netbsd-tests/sbin/gpt/t_gpt.sh (revision c22165b4f1f5d38b681921797a44b3ba8c13b7e0)
1*640235e2SEnji Cooper# $NetBSD: t_gpt.sh,v 1.15 2016/03/08 08:04:48 joerg Exp $
2*640235e2SEnji Cooper#
3*640235e2SEnji Cooper# Copyright (c) 2015 The NetBSD Foundation, Inc.
4*640235e2SEnji Cooper# All rights reserved.
5*640235e2SEnji Cooper#
6*640235e2SEnji Cooper# This code is derived from software contributed to The NetBSD Foundation
7*640235e2SEnji Cooper# by Christos Zoulas
8*640235e2SEnji Cooper#
9*640235e2SEnji Cooper# Redistribution and use in source and binary forms, with or without
10*640235e2SEnji Cooper# modification, are permitted provided that the following conditions
11*640235e2SEnji Cooper# are met:
12*640235e2SEnji Cooper# 1. Redistributions of source code must retain the above copyright
13*640235e2SEnji Cooper#    notice, this list of conditions and the following disclaimer.
14*640235e2SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
15*640235e2SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
16*640235e2SEnji Cooper#    documentation and/or other materials provided with the distribution.
17*640235e2SEnji Cooper#
18*640235e2SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19*640235e2SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20*640235e2SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21*640235e2SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22*640235e2SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*640235e2SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*640235e2SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*640235e2SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*640235e2SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*640235e2SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*640235e2SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
29*640235e2SEnji Cooper#
30*640235e2SEnji Cooper
31*640235e2SEnji Cooperbootblk=/usr/mdec/gptmbr.bin
32*640235e2SEnji Coopersize=10240
33*640235e2SEnji Coopernewsize=20480
34*640235e2SEnji Coopershdr=34
35*640235e2SEnji Cooperdisk=gpt.disk
36*640235e2SEnji Cooperuuid="........-....-....-....-............"
37*640235e2SEnji Cooperzero="00000000-0000-0000-0000-000000000000"
38*640235e2SEnji Coopersrc=$(atf_get_srcdir)
39*640235e2SEnji Cooper
40*640235e2SEnji Coopersilence() {
41*640235e2SEnji Cooper	atf_check -s exit:0 -o empty -e empty "$@"
42*640235e2SEnji Cooper}
43*640235e2SEnji Cooper
44*640235e2SEnji Cooperinline() {
45*640235e2SEnji Cooper	local inline="$1"
46*640235e2SEnji Cooper	shift
47*640235e2SEnji Cooper	atf_check -s exit:0 -e empty -o inline:"$inline" "$@"
48*640235e2SEnji Cooper}
49*640235e2SEnji Cooper
50*640235e2SEnji Coopermatch() {
51*640235e2SEnji Cooper	local match="$1"
52*640235e2SEnji Cooper	shift
53*640235e2SEnji Cooper	atf_check -s exit:0 -e empty -o match:"$match" "$@"
54*640235e2SEnji Cooper}
55*640235e2SEnji Cooper
56*640235e2SEnji Coopermatcherr() {
57*640235e2SEnji Cooper	local match="$1"
58*640235e2SEnji Cooper	shift
59*640235e2SEnji Cooper	atf_check -s exit:0 -o empty -e match:"$match" "$@"
60*640235e2SEnji Cooper}
61*640235e2SEnji Cooper
62*640235e2SEnji Cooperfile() {
63*640235e2SEnji Cooper	local file="$1"
64*640235e2SEnji Cooper	shift
65*640235e2SEnji Cooper	atf_check -s exit:0 -e empty -o file:"$file" "$@"
66*640235e2SEnji Cooper}
67*640235e2SEnji Cooper
68*640235e2SEnji Coopersave() {
69*640235e2SEnji Cooper	local save="$1"
70*640235e2SEnji Cooper	shift
71*640235e2SEnji Cooper	atf_check -s exit:0 -e empty -o save:"$save" "$@"
72*640235e2SEnji Cooper}
73*640235e2SEnji Cooper
74*640235e2SEnji Cooperzerodd() {
75*640235e2SEnji Cooper	silence dd conv=notrunc msgfmt=quiet if=/dev/zero of="$disk" "$@"
76*640235e2SEnji Cooper}
77*640235e2SEnji Cooper
78*640235e2SEnji Cooperprepare() {
79*640235e2SEnji Cooper	rm -f "$disk"
80*640235e2SEnji Cooper	zerodd seek="$size" count=1
81*640235e2SEnji Cooper}
82*640235e2SEnji Cooper
83*640235e2SEnji Cooperprepare_2part() {
84*640235e2SEnji Cooper	prepare
85*640235e2SEnji Cooper	silence gpt create "$disk"
86*640235e2SEnji Cooper	match "$(partaddmsg 1 34 1024)" gpt add -t efi -s 1024 "$disk"
87*640235e2SEnji Cooper	match "$(partaddmsg 2 1058 9150)" gpt add "$disk"
88*640235e2SEnji Cooper}
89*640235e2SEnji Cooper
90*640235e2SEnji Cooper# Calling this from tests does not work. BUG!
91*640235e2SEnji Coopercheck_2part() {
92*640235e2SEnji Cooper	file "$src/gpt.2part.show.normal" gpt show "$disk"
93*640235e2SEnji Cooper	file "$src/gpt.2part.show.uuid" gpt show -u "$disk"
94*640235e2SEnji Cooper}
95*640235e2SEnji Cooper
96*640235e2SEnji Cooperpartaddmsg() {
97*640235e2SEnji Cooper	echo "^$disk: Partition $1 added: $uuid $2 $3\$"
98*640235e2SEnji Cooper}
99*640235e2SEnji Cooper
100*640235e2SEnji Cooperpartresmsg() {
101*640235e2SEnji Cooper	echo "^$disk: Partition $1 resized: $2 $3\$"
102*640235e2SEnji Cooper}
103*640235e2SEnji Cooper
104*640235e2SEnji Cooperpartremmsg() {
105*640235e2SEnji Cooper	echo "^$disk: Partition $1 removed\$"
106*640235e2SEnji Cooper}
107*640235e2SEnji Cooper
108*640235e2SEnji Cooperpartlblmsg() {
109*640235e2SEnji Cooper	echo "^$disk: Partition $1 label changed\$"
110*640235e2SEnji Cooper}
111*640235e2SEnji Cooper
112*640235e2SEnji Cooperpartbootmsg() {
113*640235e2SEnji Cooper	echo "^$disk: Partition $1 marked as bootable\$"
114*640235e2SEnji Cooper}
115*640235e2SEnji Cooper
116*640235e2SEnji Cooperrecovermsg() {
117*640235e2SEnji Cooper	echo "^$disk: Recovered $1 GPT [a-z]* from $2\$"
118*640235e2SEnji Cooper}
119*640235e2SEnji Cooper
120*640235e2SEnji Coopermigratemsg() {
121*640235e2SEnji Cooper	echo -n "^gpt: $disk: Partition $1 unknown type MSDOS, "
122*640235e2SEnji Cooper	echo 'using "Microsoft Basic Data"$'
123*640235e2SEnji Cooper}
124*640235e2SEnji Cooper
125*640235e2SEnji Cooperattrmsg() {
126*640235e2SEnji Cooper	echo "^$disk: Partition $1 attributes updated\$"
127*640235e2SEnji Cooper}
128*640235e2SEnji Cooper
129*640235e2SEnji Coopertypemsg() {
130*640235e2SEnji Cooper	echo "^$disk: Partition $1 type changed\$"
131*640235e2SEnji Cooper}
132*640235e2SEnji Cooper
133*640235e2SEnji Cooperatf_test_case create_empty
134*640235e2SEnji Coopercreate_empty_head() {
135*640235e2SEnji Cooper	atf_set "descr" "Create empty disk"
136*640235e2SEnji Cooper}
137*640235e2SEnji Cooper
138*640235e2SEnji Coopercreate_empty_body() {
139*640235e2SEnji Cooper	prepare
140*640235e2SEnji Cooper	silence gpt create "$disk"
141*640235e2SEnji Cooper	file "$src/gpt.empty.show.normal" gpt show "$disk"
142*640235e2SEnji Cooper}
143*640235e2SEnji Cooper
144*640235e2SEnji Cooperatf_test_case create_2part
145*640235e2SEnji Coopercreate_2part_head() {
146*640235e2SEnji Cooper	atf_set "descr" "Create 2 partition disk"
147*640235e2SEnji Cooper}
148*640235e2SEnji Cooper
149*640235e2SEnji Coopercreate_2part_body() {
150*640235e2SEnji Cooper	prepare_2part
151*640235e2SEnji Cooper	check_2part
152*640235e2SEnji Cooper}
153*640235e2SEnji Cooper
154*640235e2SEnji Cooperatf_test_case change_attr_2part
155*640235e2SEnji Cooperchange_attr_2part_head() {
156*640235e2SEnji Cooper	atf_set "descr" "Change the attribute of 2 partition disk"
157*640235e2SEnji Cooper}
158*640235e2SEnji Cooper
159*640235e2SEnji Cooperchange_attr_2part_body() {
160*640235e2SEnji Cooper	prepare_2part
161*640235e2SEnji Cooper	match "$(attrmsg 1)" gpt set -i 1 -a biosboot,bootme "$disk"
162*640235e2SEnji Cooper	save attr gpt show -i 1 "$disk"
163*640235e2SEnji Cooper	match "^Attributes: biosboot, bootme\$" tail -1 attr
164*640235e2SEnji Cooper	match "$(attrmsg 1)" gpt unset -i 1 -a biosboot,bootme "$disk"
165*640235e2SEnji Cooper	save attr gpt show -i 1 "$disk"
166*640235e2SEnji Cooper	match "^Attributes: None\$" tail -1 attr
167*640235e2SEnji Cooper}
168*640235e2SEnji Cooper
169*640235e2SEnji Cooperatf_test_case change_type_2part
170*640235e2SEnji Cooperchange_type_2part_head() {
171*640235e2SEnji Cooper	atf_set "descr" "Change the partition type type of 2 partition disk"
172*640235e2SEnji Cooper}
173*640235e2SEnji Cooper
174*640235e2SEnji Cooperchange_type_2part_body() {
175*640235e2SEnji Cooper	prepare_2part
176*640235e2SEnji Cooper	match "$(typemsg 1)" gpt type -i 1 -T apple "$disk"
177*640235e2SEnji Cooper	save type gpt show -i 1 "$disk"
178*640235e2SEnji Cooper	inline "Type: apple (48465300-0000-11aa-aa11-00306543ecac)\n" \
179*640235e2SEnji Cooper	    grep "^Type:" type
180*640235e2SEnji Cooper	match "$(typemsg 1)" gpt type -i 1 -T efi "$disk"
181*640235e2SEnji Cooper	save type gpt show -i 1 "$disk"
182*640235e2SEnji Cooper	inline "Type: efi (c12a7328-f81f-11d2-ba4b-00a0c93ec93b)\n" \
183*640235e2SEnji Cooper	    grep "^Type:" type
184*640235e2SEnji Cooper}
185*640235e2SEnji Cooper
186*640235e2SEnji Cooperatf_test_case backup_2part
187*640235e2SEnji Cooperbackup_2part_head() {
188*640235e2SEnji Cooper	atf_set "descr" "Backup 2 partition disk"
189*640235e2SEnji Cooper}
190*640235e2SEnji Cooper
191*640235e2SEnji Cooperbackup_2part_body() {
192*640235e2SEnji Cooper	prepare_2part
193*640235e2SEnji Cooper	save test.backup gpt backup "$disk"
194*640235e2SEnji Cooper	file "$src/gpt.backup" sed -e "s/$uuid/$zero/g" "test.backup"
195*640235e2SEnji Cooper}
196*640235e2SEnji Cooper
197*640235e2SEnji Cooperatf_test_case restore_2part
198*640235e2SEnji Cooperrestore_2part_head() {
199*640235e2SEnji Cooper	atf_set "descr" "Restore 2 partition disk"
200*640235e2SEnji Cooper}
201*640235e2SEnji Cooper
202*640235e2SEnji Cooperrestore_2part_body() {
203*640235e2SEnji Cooper	prepare_2part
204*640235e2SEnji Cooper	save test.backup gpt backup "$disk"
205*640235e2SEnji Cooper	prepare
206*640235e2SEnji Cooper	silence gpt restore -i test.backup "$disk"
207*640235e2SEnji Cooper	check_2part
208*640235e2SEnji Cooper}
209*640235e2SEnji Cooper
210*640235e2SEnji Cooperatf_test_case recover_backup
211*640235e2SEnji Cooperrecover_backup_head() {
212*640235e2SEnji Cooper	atf_set "descr" "Recover the backup GPT header and table"
213*640235e2SEnji Cooper}
214*640235e2SEnji Cooper
215*640235e2SEnji Cooperrecover_backup_body() {
216*640235e2SEnji Cooper	prepare_2part
217*640235e2SEnji Cooper	zerodd seek="$((size - shdr))" count="$shdr"
218*640235e2SEnji Cooper	match "$(recovermsg secondary primary)" gpt recover "$disk"
219*640235e2SEnji Cooper	check_2part
220*640235e2SEnji Cooper}
221*640235e2SEnji Cooper
222*640235e2SEnji Cooperatf_test_case recover_primary
223*640235e2SEnji Cooperrecover_primary_head() {
224*640235e2SEnji Cooper	atf_set "descr" "Recover the primary GPT header and table"
225*640235e2SEnji Cooper}
226*640235e2SEnji Cooper
227*640235e2SEnji Cooperrecover_primary_body() {
228*640235e2SEnji Cooper	prepare_2part
229*640235e2SEnji Cooper	zerodd seek=1 count="$shdr"
230*640235e2SEnji Cooper	match "$(recovermsg primary secondary)" gpt recover "$disk"
231*640235e2SEnji Cooper	check_2part
232*640235e2SEnji Cooper}
233*640235e2SEnji Cooper
234*640235e2SEnji Cooperatf_test_case resize_2part
235*640235e2SEnji Cooperresize_2part_head() {
236*640235e2SEnji Cooper	atf_set "descr" "Resize a 2 partition disk and partition"
237*640235e2SEnji Cooper}
238*640235e2SEnji Cooper
239*640235e2SEnji Cooperresize_2part_body() {
240*640235e2SEnji Cooper	prepare_2part
241*640235e2SEnji Cooper	zerodd seek="$newsize" count=1
242*640235e2SEnji Cooper	silence gpt resizedisk "$disk"
243*640235e2SEnji Cooper	file "$src/gpt.resizedisk.show.normal" gpt show "$disk"
244*640235e2SEnji Cooper	match "$(partresmsg 2 1058 19390)" gpt resize -i 2 "$disk"
245*640235e2SEnji Cooper	file "$src/gpt.resizepart.show.normal" gpt show "$disk"
246*640235e2SEnji Cooper}
247*640235e2SEnji Cooper
248*640235e2SEnji Cooperatf_test_case remove_2part
249*640235e2SEnji Cooperremove_2part_head() {
250*640235e2SEnji Cooper	atf_set "descr" "Remove a partition from a 2 partition disk"
251*640235e2SEnji Cooper}
252*640235e2SEnji Cooper
253*640235e2SEnji Cooperremove_2part_body() {
254*640235e2SEnji Cooper	prepare_2part
255*640235e2SEnji Cooper	match "$(partremmsg 1)" -e empty gpt remove \
256*640235e2SEnji Cooper	    -i 1 "$disk"
257*640235e2SEnji Cooper	file "$src/gpt.removepart.show.normal" \
258*640235e2SEnji Cooper	    gpt show "$disk"
259*640235e2SEnji Cooper}
260*640235e2SEnji Cooper
261*640235e2SEnji Cooperatf_test_case label_2part
262*640235e2SEnji Cooperlabel_2part_head() {
263*640235e2SEnji Cooper	atf_set "descr" "Label partitions in a 2 partition disk"
264*640235e2SEnji Cooper}
265*640235e2SEnji Cooper
266*640235e2SEnji Cooperlabel_2part_body() {
267*640235e2SEnji Cooper	prepare_2part
268*640235e2SEnji Cooper	match "$(partlblmsg 1)" gpt label -i 1 -l potato "$disk"
269*640235e2SEnji Cooper	match "$(partlblmsg 2)" gpt label -i 2 -l tomato "$disk"
270*640235e2SEnji Cooper	file "$src/gpt.2part.show.label" \
271*640235e2SEnji Cooper	    gpt show -l "$disk"
272*640235e2SEnji Cooper}
273*640235e2SEnji Cooper
274*640235e2SEnji Cooperatf_test_case bootable_2part
275*640235e2SEnji Cooperbootable_2part_head() {
276*640235e2SEnji Cooper	atf_set "descr" "Make partition 2 bootable in a 2 partition disk"
277*640235e2SEnji Cooper	atf_set "require.files" "$bootblk"
278*640235e2SEnji Cooper}
279*640235e2SEnji Cooper
280*640235e2SEnji Cooperbootable_2part_body() {
281*640235e2SEnji Cooper	prepare_2part
282*640235e2SEnji Cooper	match "$(partbootmsg 2)" gpt biosboot -i 2 "$disk"
283*640235e2SEnji Cooper	local bootsz="$(ls -l "$bootblk" | awk '{ print $5 }')"
284*640235e2SEnji Cooper	silence dd msgfmt=quiet if="$disk" of=bootblk bs=1 count="$bootsz"
285*640235e2SEnji Cooper	silence cmp "$bootblk" bootblk
286*640235e2SEnji Cooper	save bootattr gpt show -i 2 "$disk"
287*640235e2SEnji Cooper	match "^Attributes: biosboot\$" tail -1 bootattr
288*640235e2SEnji Cooper}
289*640235e2SEnji Cooper
290*640235e2SEnji Cooperatf_test_case migrate_disklabel
291*640235e2SEnji Coopermigrate_disklabel_head() {
292*640235e2SEnji Cooper	atf_set "descr" "Migrate an MBR+disklabel disk to GPT"
293*640235e2SEnji Cooper}
294*640235e2SEnji Cooper
295*640235e2SEnji Coopermigrate_disklabel_body() {
296*640235e2SEnji Cooper	prepare
297*640235e2SEnji Cooper	silence fdisk -fi "$disk"
298*640235e2SEnji Cooper	silence fdisk -fu0s "169/63/$((size / 10))" "$disk"
299*640235e2SEnji Cooper	silence disklabel -R "$disk" "$src/gpt.disklabel"
300*640235e2SEnji Cooper	matcherr "$(migratemsg 5)" gpt migrate "$disk"
301*640235e2SEnji Cooper	file "$src/gpt.disklabel.show.normal" gpt show "$disk"
302*640235e2SEnji Cooper}
303*640235e2SEnji Cooper
304*640235e2SEnji Cooperatf_init_test_cases() {
305*640235e2SEnji Cooper	atf_add_test_case create_empty
306*640235e2SEnji Cooper	atf_add_test_case create_2part
307*640235e2SEnji Cooper	atf_add_test_case change_attr_2part
308*640235e2SEnji Cooper	atf_add_test_case change_type_2part
309*640235e2SEnji Cooper	atf_add_test_case backup_2part
310*640235e2SEnji Cooper	atf_add_test_case remove_2part
311*640235e2SEnji Cooper	atf_add_test_case restore_2part
312*640235e2SEnji Cooper	atf_add_test_case recover_backup
313*640235e2SEnji Cooper	atf_add_test_case recover_primary
314*640235e2SEnji Cooper	atf_add_test_case resize_2part
315*640235e2SEnji Cooper	atf_add_test_case label_2part
316*640235e2SEnji Cooper	atf_add_test_case bootable_2part
317*640235e2SEnji Cooper	atf_add_test_case migrate_disklabel
318*640235e2SEnji Cooper}
319