1311893Sasomers# $FreeBSD: stable/11/tests/sys/geom/class/gate/ggate_test.sh 361128 2020-05-17 02:40:49Z asomers $
2311893Sasomers
3311893SasomersPIDFILE=ggated.pid
4311893SasomersPLAINFILES=plainfiles
5311893SasomersPORT=33080
6311893SasomersCONF=gg.exports
7311893Sasomers
8311893Sasomersatf_test_case ggated cleanup
9311893Sasomersggated_head()
10311893Sasomers{
11311893Sasomers	atf_set "descr" "ggated can proxy geoms"
12311893Sasomers	atf_set "require.progs" "ggatec ggated"
13311893Sasomers	atf_set "require.user" "root"
14311893Sasomers	atf_set "timeout" 60
15311893Sasomers}
16311893Sasomers
17311893Sasomersggated_body()
18311893Sasomers{
19323300Sngie	load_ggate
20323300Sngie
21311893Sasomers	us=$(alloc_ggate_dev)
22311893Sasomers	work=$(alloc_md)
23311893Sasomers	src=$(alloc_md)
24311893Sasomers
25313753Sasomers	atf_check -e ignore -o ignore \
26313753Sasomers	    dd if=/dev/random of=/dev/$work bs=1m count=1 conv=notrunc
27313753Sasomers	atf_check -e ignore -o ignore \
28313753Sasomers	    dd if=/dev/random of=/dev/$src bs=1m count=1 conv=notrunc
29311893Sasomers
30311893Sasomers	echo $CONF >> $PLAINFILES
31311893Sasomers	echo "127.0.0.1 RW /dev/$work" > $CONF
32311893Sasomers
33311893Sasomers	atf_check ggated -p $PORT -F $PIDFILE $CONF
34313753Sasomers	atf_check ggatec create -p $PORT -u $us 127.0.0.1 /dev/$work
35311893Sasomers
36313753Sasomers	ggate_dev=/dev/ggate${us}
37311893Sasomers
38313753Sasomers	wait_for_ggate_device ${ggate_dev}
39313753Sasomers
40313753Sasomers	atf_check -e ignore -o ignore \
41313753Sasomers	    dd if=/dev/${src} of=${ggate_dev} bs=1m count=1 conv=notrunc
42313753Sasomers
43311893Sasomers	checksum /dev/$src /dev/$work
44311893Sasomers}
45311893Sasomers
46311893Sasomersggated_cleanup()
47311893Sasomers{
48311893Sasomers	common_cleanup
49311893Sasomers}
50311893Sasomers
51311893Sasomersatf_test_case ggatel_file cleanup
52311893Sasomersggatel_file_head()
53311893Sasomers{
54311893Sasomers	atf_set "descr" "ggatel can proxy files"
55311893Sasomers	atf_set "require.progs" "ggatel"
56311893Sasomers	atf_set "require.user" "root"
57311893Sasomers	atf_set "timeout" 15
58311893Sasomers}
59311893Sasomers
60311893Sasomersggatel_file_body()
61311893Sasomers{
62323300Sngie	load_ggate
63323300Sngie
64311893Sasomers	us=$(alloc_ggate_dev)
65311893Sasomers
66311893Sasomers	echo src work >> ${PLAINFILES}
67311893Sasomers	dd if=/dev/random of=work bs=1m count=1
68311893Sasomers	dd if=/dev/random of=src bs=1m count=1
69311893Sasomers
70311893Sasomers	atf_check ggatel create -u $us work
71311893Sasomers
72313753Sasomers	ggate_dev=/dev/ggate${us}
73311893Sasomers
74313753Sasomers	wait_for_ggate_device ${ggate_dev}
75313753Sasomers
76313753Sasomers	atf_check -e ignore -o ignore \
77313753Sasomers	    dd if=src of=${ggate_dev} bs=1m count=1 conv=notrunc
78313753Sasomers
79311893Sasomers	checksum src work
80311893Sasomers}
81311893Sasomers
82311893Sasomersggatel_file_cleanup()
83311893Sasomers{
84311893Sasomers	common_cleanup
85311893Sasomers}
86311893Sasomers
87311893Sasomersatf_test_case ggatel_md cleanup
88311893Sasomersggatel_md_head()
89311893Sasomers{
90311893Sasomers	atf_set "descr" "ggatel can proxy files"
91311893Sasomers	atf_set "require.progs" "ggatel"
92311893Sasomers	atf_set "require.user" "root"
93311893Sasomers	atf_set "timeout" 15
94311893Sasomers}
95311893Sasomers
96311893Sasomersggatel_md_body()
97311893Sasomers{
98323300Sngie	load_ggate
99323300Sngie
100311893Sasomers	us=$(alloc_ggate_dev)
101311893Sasomers	work=$(alloc_md)
102311893Sasomers	src=$(alloc_md)
103311893Sasomers
104313753Sasomers	atf_check -e ignore -o ignore \
105313753Sasomers	    dd if=/dev/random of=$work bs=1m count=1 conv=notrunc
106313753Sasomers	atf_check -e ignore -o ignore \
107313753Sasomers	    dd if=/dev/random of=$src bs=1m count=1 conv=notrunc
108311893Sasomers
109311893Sasomers	atf_check ggatel create -u $us /dev/$work
110311893Sasomers
111313753Sasomers	ggate_dev=/dev/ggate${us}
112311893Sasomers
113313753Sasomers	wait_for_ggate_device ${ggate_dev}
114313753Sasomers
115313753Sasomers	atf_check -e ignore -o ignore \
116313753Sasomers	    dd if=/dev/$src of=${ggate_dev} bs=1m count=1 conv=notrunc
117313753Sasomers
118311893Sasomers	checksum /dev/$src /dev/$work
119311893Sasomers}
120311893Sasomers
121311893Sasomersggatel_md_cleanup()
122311893Sasomers{
123311893Sasomers	common_cleanup
124311893Sasomers}
125311893Sasomers
126311893Sasomersatf_init_test_cases()
127311893Sasomers{
128311893Sasomers	atf_add_test_case ggated
129311893Sasomers	atf_add_test_case ggatel_file
130311893Sasomers	atf_add_test_case ggatel_md
131311893Sasomers}
132311893Sasomers
133311893Sasomersalloc_ggate_dev()
134311893Sasomers{
135311893Sasomers	local us
136311893Sasomers
137311893Sasomers	us=0
138311893Sasomers	while [ -c /dev/ggate${us} ]; do
139311893Sasomers		: $(( us += 1 ))
140311893Sasomers	done
141311893Sasomers	echo ${us} > ggate.devs
142311893Sasomers	echo ${us}
143311893Sasomers}
144311893Sasomers
145311893Sasomersalloc_md()
146311893Sasomers{
147311893Sasomers	local md
148311893Sasomers
149311893Sasomers	md=$(mdconfig -a -t malloc -s 1M) || \
150311893Sasomers		atf_fail "failed to allocate md device"
151311893Sasomers	echo ${md} >> md.devs
152311893Sasomers	echo ${md}
153311893Sasomers}
154311893Sasomers
155311893Sasomerschecksum()
156311893Sasomers{
157311893Sasomers	local src work
158311893Sasomers	src=$1
159311893Sasomers	work=$2
160311893Sasomers
161311893Sasomers	src_checksum=$(md5 -q $src)
162311893Sasomers	work_checksum=$(md5 -q $work)
163311893Sasomers
164311893Sasomers	if [ "$work_checksum" != "$src_checksum" ]; then
165311893Sasomers		atf_fail "work md5 checksum didn't match"
166311893Sasomers	fi
167311893Sasomers
168311893Sasomers	ggate_checksum=$(md5 -q /dev/ggate${us})
169311893Sasomers	if [ "$ggate_checksum" != "$src_checksum" ]; then
170311893Sasomers		atf_fail "ggate md5 checksum didn't match"
171311893Sasomers	fi
172311893Sasomers}
173311893Sasomers
174311893Sasomerscommon_cleanup()
175311893Sasomers{
176311893Sasomers	if [ -f "ggate.devs" ]; then
177311893Sasomers		while read test_ggate; do
178311893Sasomers			ggatec destroy -f -u $test_ggate >/dev/null
179311893Sasomers		done < ggate.devs
180311893Sasomers		rm ggate.devs
181311893Sasomers	fi
182311893Sasomers
183311893Sasomers	if [ -f "$PIDFILE" ]; then
184311893Sasomers		pkill -F "$PIDFILE"
185311893Sasomers		rm $PIDFILE
186311893Sasomers	fi
187311893Sasomers
188311893Sasomers	if [ -f "PLAINFILES" ]; then
189311893Sasomers		while read f; do
190311893Sasomers			rm -f ${f}
191311893Sasomers		done < ${PLAINFILES}
192311893Sasomers		rm ${PLAINFILES}
193311893Sasomers	fi
194311893Sasomers
195311893Sasomers	if [ -f "md.devs" ]; then
196311893Sasomers		while read test_md; do
197361128Sasomers			# ggatec destroy doesn't release the provider
198361128Sasomers			# synchronously, so we may need to retry destroying it.
199361128Sasomers			while ! mdconfig -d -u $test_md; do
200361128Sasomers				sleep 0.1
201361128Sasomers			done
202311893Sasomers		done < md.devs
203311893Sasomers		rm md.devs
204311893Sasomers	fi
205311893Sasomers	true
206311893Sasomers}
207313753Sasomers
208323300Sngieload_ggate()
209323300Sngie{
210323300Sngie	local class=gate
211323300Sngie
212323300Sngie	# If the geom class isn't already loaded, try loading it.
213323300Sngie	if ! kldstat -q -m g_${class}; then
214323300Sngie		if ! geom ${class} load; then
215323300Sngie			atf_skip "could not load module for geom class=${class}"
216323300Sngie		fi
217323300Sngie	fi
218323300Sngie}
219323300Sngie
220313753Sasomers# Bug 204616: ggatel(8) creates /dev/ggate* asynchronously if `ggatel create`
221313753Sasomers#             isn't called with `-v`.
222313753Sasomerswait_for_ggate_device()
223313753Sasomers{
224313753Sasomers	ggate_device=$1
225313753Sasomers
226313753Sasomers	while [ ! -c $ggate_device ]; do
227313753Sasomers		sleep 0.5
228313753Sasomers	done
229313753Sasomers}
230