xref: /freebsd/tests/sys/geom/class/nop/nop_test.sh (revision 396c556d77189a5c474d35cec6f44a762e310b7d)
1# Copyright (c) 2016 Alan Somers
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions
6# are met:
7# 1. Redistributions of source code must retain the above copyright
8#    notice, this list of conditions and the following disclaimer.
9# 2. Redistributions in binary form must reproduce the above copyright
10#    notice, this list of conditions and the following disclaimer in the
11#    documentation and/or other materials provided with the distribution.
12#
13# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23# SUCH DAMAGE.
24#
25# $FreeBSD$
26
27MD_DEVS="md.devs"
28PLAINFILES=plainfiles
29
30atf_test_case diskinfo cleanup
31diskinfo_head()
32{
33	atf_set "descr" "gnop should preserve diskinfo's basic properties"
34	atf_set "require.user" "root"
35	atf_set "timeout" 15
36}
37diskinfo_body()
38{
39	us=$(alloc_md)
40	atf_check gnop create /dev/${us}
41	md_secsize=$(diskinfo ${us} | cut -wf 2)
42	md_mediasize=$(diskinfo ${us} | cut -wf 3)
43	md_stripesize=$(diskinfo ${us} | cut -wf 5)
44	nop_secsize=$(diskinfo ${us}.nop | cut -wf 2)
45	nop_mediasize=$(diskinfo ${us}.nop | cut -wf 3)
46	nop_stripesize=$(diskinfo ${us}.nop | cut -wf 5)
47	atf_check_equal "$md_secsize" "$nop_secsize"
48	atf_check_equal "$md_mediasize" "$nop_mediasize"
49	atf_check_equal "$md_stripesize" "$nop_stripesize"
50}
51diskinfo_cleanup()
52{
53	common_cleanup
54}
55
56atf_test_case io cleanup
57io_head()
58{
59	atf_set "descr" "I/O works on gnop devices"
60	atf_set "require.user" "root"
61	atf_set "timeout" 15
62}
63io_body()
64{
65	us=$(alloc_md)
66	atf_check gnop create /dev/${us}
67
68	echo src >> $PLAINFILES
69	echo dst >> $PLAINFILES
70	dd if=/dev/random of=src bs=1m count=1 >/dev/null 2>&1
71	dd if=src of=/dev/${us}.nop bs=1m count=1 > /dev/null 2>&1
72	dd if=/dev/${us}.nop of=dst bs=1m count=1 > /dev/null 2>&1
73
74	atf_check_equal `md5 -q src` `md5 -q dst`
75}
76io_cleanup()
77{
78	common_cleanup
79}
80
81atf_test_case size cleanup
82size_head()
83{
84	atf_set "descr" "Test gnop's -s option"
85	atf_set "require.user" "root"
86	atf_set "timeout" 15
87}
88size_body()
89{
90	us=$(alloc_md)
91	for mediasize in 65536 524288 1048576; do
92		atf_check gnop create -s ${mediasize} /dev/${us}
93		gnop_mediasize=`diskinfo /dev/${us}.nop | cut -wf 3`
94		atf_check_equal "${mediasize}" "${gnop_mediasize}"
95		atf_check gnop destroy /dev/${us}.nop
96	done
97	# We shouldn't be able to extend the provider's size
98	atf_check -s not-exit:0 -e ignore gnop create -s 2097152 /dev/${us}
99}
100size_cleanup()
101{
102	common_cleanup
103}
104
105atf_test_case stripesize cleanup
106stripesize_head()
107{
108	atf_set "descr" "Test gnop's -p and -P options"
109	atf_set "require.user" "root"
110	atf_set "timeout" 15
111}
112stripesize_body()
113{
114	us=$(alloc_md)
115	for ss in 512 1024 2048 4096 8192; do
116		for sofs in `seq 0 512 ${ss}`; do
117			[ "$sofs" -eq "$ss" ] && continue
118			atf_check gnop create -p ${ss} -P ${sofs} /dev/${us}
119			gnop_ss=`diskinfo /dev/${us}.nop | cut -wf 5`
120			gnop_sofs=`diskinfo /dev/${us}.nop | cut -wf 6`
121			atf_check_equal "${ss}" "${gnop_ss}"
122			atf_check_equal "${sofs}" "${gnop_sofs}"
123			atf_check gnop destroy /dev/${us}.nop
124		done
125	done
126}
127stripesize_cleanup()
128{
129	common_cleanup
130}
131
132atf_init_test_cases()
133{
134	atf_add_test_case io
135	atf_add_test_case diskinfo
136	atf_add_test_case stripesize
137	atf_add_test_case size
138}
139
140alloc_md()
141{
142	local md
143
144	md=$(mdconfig -a -t swap -s 1M) || atf_fail "mdconfig -a failed"
145	echo ${md} >> $MD_DEVS
146	echo ${md}
147}
148
149common_cleanup()
150{
151	if [ -f "$MD_DEVS" ]; then
152		while read test_md; do
153			gnop destroy -f ${test_md}.nop 2>/dev/null
154			mdconfig -d -u $test_md 2>/dev/null
155		done < $MD_DEVS
156		rm $MD_DEVS
157	fi
158
159	if [ -f "$PLAINFILES" ]; then
160		while read f; do
161			rm -f ${f}
162		done < ${PLAINFILES}
163		rm ${PLAINFILES}
164	fi
165	true
166}
167