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