1310803Sasomers# Copyright (c) 2016 Alan Somers
2310803Sasomers# All rights reserved.
3310803Sasomers#
4310803Sasomers# Redistribution and use in source and binary forms, with or without
5310803Sasomers# modification, are permitted provided that the following conditions
6310803Sasomers# are met:
7310803Sasomers# 1. Redistributions of source code must retain the above copyright
8310803Sasomers#    notice, this list of conditions and the following disclaimer.
9310803Sasomers# 2. Redistributions in binary form must reproduce the above copyright
10310803Sasomers#    notice, this list of conditions and the following disclaimer in the
11310803Sasomers#    documentation and/or other materials provided with the distribution.
12310803Sasomers#
13310803Sasomers# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14310803Sasomers# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15310803Sasomers# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16310803Sasomers# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17310803Sasomers# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18310803Sasomers# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19310803Sasomers# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20310803Sasomers# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21310803Sasomers# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22310803Sasomers# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23310803Sasomers# SUCH DAMAGE.
24310803Sasomers#
25310803Sasomers# $FreeBSD: stable/11/tests/sys/geom/class/nop/nop_test.sh 329789 2018-02-22 02:12:47Z asomers $
26310803Sasomers
27310803SasomersMD_DEVS="md.devs"
28310803SasomersPLAINFILES=plainfiles
29310803Sasomers
30329789Sasomersatf_test_case preserve_props cleanup
31329789Sasomerspreserve_props_head()
32310803Sasomers{
33329789Sasomers	atf_set "descr" "gnop should preserve basic GEOM properties"
34310803Sasomers	atf_set "require.user" "root"
35310803Sasomers	atf_set "timeout" 15
36310803Sasomers}
37329789Sasomerspreserve_props_body()
38310803Sasomers{
39327081Smarkj	load_gnop
40310803Sasomers	us=$(alloc_md)
41310803Sasomers	atf_check gnop create /dev/${us}
42310803Sasomers	md_secsize=$(diskinfo ${us} | cut -wf 2)
43310803Sasomers	md_mediasize=$(diskinfo ${us} | cut -wf 3)
44310803Sasomers	md_stripesize=$(diskinfo ${us} | cut -wf 5)
45310803Sasomers	nop_secsize=$(diskinfo ${us}.nop | cut -wf 2)
46310803Sasomers	nop_mediasize=$(diskinfo ${us}.nop | cut -wf 3)
47310803Sasomers	nop_stripesize=$(diskinfo ${us}.nop | cut -wf 5)
48310803Sasomers	atf_check_equal "$md_secsize" "$nop_secsize"
49310803Sasomers	atf_check_equal "$md_mediasize" "$nop_mediasize"
50310803Sasomers	atf_check_equal "$md_stripesize" "$nop_stripesize"
51310803Sasomers}
52329789Sasomerspreserve_props_cleanup()
53310803Sasomers{
54310803Sasomers	common_cleanup
55310803Sasomers}
56310803Sasomers
57329789Sasomersatf_test_case preserve_disk_props cleanup
58329789Sasomerspreserve_disk_props_head()
59329789Sasomers{
60329789Sasomers	atf_set "descr" "gnop should preserve properties for disks"
61329789Sasomers	atf_set "require.user" "root"
62329789Sasomers	atf_set "require.config" "disks"
63329789Sasomers	atf_set "timeout" 15
64329789Sasomers}
65329789Sasomerspreserve_disk_props_body()
66329789Sasomers{
67329789Sasomers	load_gnop
68329789Sasomers	disks=`atf_config_get disks`
69329789Sasomers	disk=${disks%% *}
70329789Sasomers	if [ -z "$disk" ]; then
71329789Sasomers		atf_skip "Must define disks (see tests(7))"
72329789Sasomers	fi
73329789Sasomers	atf_check gnop create ${disk}
74329789Sasomers
75329789Sasomers	disk_ident=$(diskinfo -s ${disk})
76329789Sasomers	disk_physpath=$(diskinfo -p ${disk})
77329789Sasomers	disk_descr=$(diskinfo -v ${disk} | awk '/Disk descr/ {print $1}')
78329789Sasomers	disk_trim=$(diskinfo -v ${disk} | awk '/TRIM.UNMAP/ {print $1}')
79329789Sasomers	disk_rotrate=$(diskinfo -v ${disk} | awk '/Rotation rate/ {print $1}')
80329789Sasomers	disk_zonemode=$(diskinfo -v ${disk} | awk '/Zone Mode/ {print $1}')
81329789Sasomers	nop_ident=$(diskinfo -s ${disk}.nop)
82329789Sasomers	nop_physpath=$(diskinfo -p ${disk}.nop)
83329789Sasomers	nop_descr=$(diskinfo -v ${disk}.nop | awk '/Disk descr/ {print $1}')
84329789Sasomers	nop_trim=$(diskinfo -v ${disk}.nop | awk '/TRIM.UNMAP/ {print $1}')
85329789Sasomers	nop_rotrate=$(diskinfo -v ${disk}.nop | awk '/Rotation/ {print $1}')
86329789Sasomers	nop_zonemode=$(diskinfo -v ${disk}.nop | awk '/Zone Mode/ {print $1}')
87329789Sasomers	atf_check_equal "$disk_ident" "$nop_ident"
88329789Sasomers	atf_check_equal "$disk_physpath" "$nop_physpath"
89329789Sasomers	atf_check_equal "$disk_descr" "$nop_descr"
90329789Sasomers	atf_check_equal "$disk_trim" "$nop_trim"
91329789Sasomers	atf_check_equal "$disk_rotrate" "$nop_rotrate"
92329789Sasomers	atf_check_equal "$disk_zonemode" "$nop_zonemode"
93329789Sasomers}
94329789Sasomerspreserve_disk_props_cleanup()
95329789Sasomers{
96329789Sasomers	disk_cleanup
97329789Sasomers	common_cleanup
98329789Sasomers}
99329789Sasomers
100310803Sasomersatf_test_case io cleanup
101310803Sasomersio_head()
102310803Sasomers{
103310803Sasomers	atf_set "descr" "I/O works on gnop devices"
104310803Sasomers	atf_set "require.user" "root"
105310803Sasomers	atf_set "timeout" 15
106310803Sasomers}
107310803Sasomersio_body()
108310803Sasomers{
109327081Smarkj	load_gnop
110310803Sasomers	us=$(alloc_md)
111310803Sasomers	atf_check gnop create /dev/${us}
112310803Sasomers
113310803Sasomers	echo src >> $PLAINFILES
114310803Sasomers	echo dst >> $PLAINFILES
115310803Sasomers	dd if=/dev/random of=src bs=1m count=1 >/dev/null 2>&1
116310803Sasomers	dd if=src of=/dev/${us}.nop bs=1m count=1 > /dev/null 2>&1
117310803Sasomers	dd if=/dev/${us}.nop of=dst bs=1m count=1 > /dev/null 2>&1
118310803Sasomers
119310803Sasomers	atf_check_equal `md5 -q src` `md5 -q dst`
120310803Sasomers}
121310803Sasomersio_cleanup()
122310803Sasomers{
123310803Sasomers	common_cleanup
124310803Sasomers}
125310803Sasomers
126329789Sasomersatf_test_case physpath cleanup
127329789Sasomersphyspath_head()
128329789Sasomers{
129329789Sasomers	atf_set "descr" "Test gnop's -z option"
130329789Sasomers	atf_set "require.user" "root"
131329789Sasomers	atf_set "timeout" 15
132329789Sasomers}
133329789Sasomersphyspath_body()
134329789Sasomers{
135329789Sasomers	load_gnop
136329789Sasomers	us=$(alloc_md)
137329789Sasomers	physpath="some/physical/path"
138329789Sasomers	atf_check gnop create -z $physpath /dev/${us}
139329789Sasomers	gnop_physpath=$(diskinfo -p ${us}.nop)
140329789Sasomers	atf_check_equal "$physpath" "$gnop_physpath"
141329789Sasomers}
142329789Sasomersphyspath_cleanup()
143329789Sasomers{
144329789Sasomers	common_cleanup
145329789Sasomers}
146329789Sasomers
147329789Sasomersatf_test_case physpath_blank cleanup
148329789Sasomersphyspath_blank_head()
149329789Sasomers{
150329789Sasomers	atf_set "descr" "gnop can set physical path to the empty string"
151329789Sasomers	atf_set "require.user" "root"
152329789Sasomers	atf_set "require.config" "disks"
153329789Sasomers	atf_set "timeout" 15
154329789Sasomers}
155329789Sasomersphyspath_blank_body()
156329789Sasomers{
157329789Sasomers	load_gnop
158329789Sasomers	disks=`atf_config_get disks`
159329789Sasomers	disk=${disks%% *}
160329789Sasomers	if [ -z "$disk" ]; then
161329789Sasomers		atf_skip "Must define disks (see tests(7))"
162329789Sasomers	fi
163329789Sasomers
164329789Sasomers	atf_check gnop create -z "" ${disk}
165329789Sasomers	gnop_physpath=$(diskinfo -p ${disk}.nop)
166329789Sasomers	atf_check_equal "" "$gnop_physpath"
167329789Sasomers}
168329789Sasomersphyspath_blank_cleanup()
169329789Sasomers{
170329789Sasomers	disk_cleanup
171329789Sasomers	common_cleanup
172329789Sasomers}
173329789Sasomers
174310803Sasomersatf_test_case size cleanup
175310803Sasomerssize_head()
176310803Sasomers{
177310803Sasomers	atf_set "descr" "Test gnop's -s option"
178310803Sasomers	atf_set "require.user" "root"
179310803Sasomers	atf_set "timeout" 15
180310803Sasomers}
181310803Sasomerssize_body()
182310803Sasomers{
183327081Smarkj	load_gnop
184310803Sasomers	us=$(alloc_md)
185310803Sasomers	for mediasize in 65536 524288 1048576; do
186310803Sasomers		atf_check gnop create -s ${mediasize} /dev/${us}
187310803Sasomers		gnop_mediasize=`diskinfo /dev/${us}.nop | cut -wf 3`
188310803Sasomers		atf_check_equal "${mediasize}" "${gnop_mediasize}"
189310803Sasomers		atf_check gnop destroy /dev/${us}.nop
190310803Sasomers	done
191310803Sasomers	# We shouldn't be able to extend the provider's size
192310803Sasomers	atf_check -s not-exit:0 -e ignore gnop create -s 2097152 /dev/${us}
193310803Sasomers}
194310803Sasomerssize_cleanup()
195310803Sasomers{
196310803Sasomers	common_cleanup
197310803Sasomers}
198310803Sasomers
199310803Sasomersatf_test_case stripesize cleanup
200310803Sasomersstripesize_head()
201310803Sasomers{
202310803Sasomers	atf_set "descr" "Test gnop's -p and -P options"
203310803Sasomers	atf_set "require.user" "root"
204310803Sasomers	atf_set "timeout" 15
205310803Sasomers}
206310803Sasomersstripesize_body()
207310803Sasomers{
208327081Smarkj	load_gnop
209310803Sasomers	us=$(alloc_md)
210310803Sasomers	for ss in 512 1024 2048 4096 8192; do
211310803Sasomers		for sofs in `seq 0 512 ${ss}`; do
212310803Sasomers			[ "$sofs" -eq "$ss" ] && continue
213310803Sasomers			atf_check gnop create -p ${ss} -P ${sofs} /dev/${us}
214310803Sasomers			gnop_ss=`diskinfo /dev/${us}.nop | cut -wf 5`
215310803Sasomers			gnop_sofs=`diskinfo /dev/${us}.nop | cut -wf 6`
216310803Sasomers			atf_check_equal "${ss}" "${gnop_ss}"
217310803Sasomers			atf_check_equal "${sofs}" "${gnop_sofs}"
218310803Sasomers			atf_check gnop destroy /dev/${us}.nop
219310803Sasomers		done
220310803Sasomers	done
221310803Sasomers}
222310803Sasomersstripesize_cleanup()
223310803Sasomers{
224310803Sasomers	common_cleanup
225310803Sasomers}
226310803Sasomers
227310803Sasomersatf_init_test_cases()
228310803Sasomers{
229310803Sasomers	atf_add_test_case io
230329789Sasomers	atf_add_test_case physpath
231329789Sasomers	atf_add_test_case physpath_blank
232329789Sasomers	atf_add_test_case preserve_props
233329789Sasomers	atf_add_test_case preserve_disk_props
234310803Sasomers	atf_add_test_case stripesize
235310803Sasomers	atf_add_test_case size
236310803Sasomers}
237310803Sasomers
238310803Sasomersalloc_md()
239310803Sasomers{
240310803Sasomers	local md
241310803Sasomers
242310803Sasomers	md=$(mdconfig -a -t swap -s 1M) || atf_fail "mdconfig -a failed"
243310803Sasomers	echo ${md} >> $MD_DEVS
244310803Sasomers	echo ${md}
245310803Sasomers}
246310803Sasomers
247310803Sasomerscommon_cleanup()
248310803Sasomers{
249310803Sasomers	if [ -f "$MD_DEVS" ]; then
250310803Sasomers		while read test_md; do
251310803Sasomers			gnop destroy -f ${test_md}.nop 2>/dev/null
252310803Sasomers			mdconfig -d -u $test_md 2>/dev/null
253310803Sasomers		done < $MD_DEVS
254310803Sasomers		rm $MD_DEVS
255310803Sasomers	fi
256310803Sasomers
257310803Sasomers	if [ -f "$PLAINFILES" ]; then
258310803Sasomers		while read f; do
259310803Sasomers			rm -f ${f}
260310803Sasomers		done < ${PLAINFILES}
261310803Sasomers		rm ${PLAINFILES}
262310803Sasomers	fi
263310803Sasomers	true
264310803Sasomers}
265327081Smarkj
266329789Sasomersdisk_cleanup()
267329789Sasomers{
268329789Sasomers	disks=`atf_config_get disks`
269329789Sasomers	disk=${disks%% *}
270329789Sasomers	if [ -n "$disk" ]; then
271329789Sasomers		gnop destroy -f ${disk}.nop 2>/dev/null
272329789Sasomers	fi
273329789Sasomers}
274329789Sasomers
275327081Smarkjload_gnop()
276327081Smarkj{
277327081Smarkj	if ! kldstat -q -m g_nop; then
278327081Smarkj		geom nop load || atf_skip "could not load module for geom nop"
279327081Smarkj	fi
280327081Smarkj}
281