xref: /freebsd/usr.bin/tftp/tests/tftp_test.sh (revision 64c2a712d661db9be31f02fe97c3b59710290ae3)
1*64c2a712SDag-Erling Smørgrav#
2*64c2a712SDag-Erling Smørgrav# Copyright (c) 2023 Klara, Inc.
3*64c2a712SDag-Erling Smørgrav#
4*64c2a712SDag-Erling Smørgrav# SPDX-License-Identifier: BSD-2-Clause
5*64c2a712SDag-Erling Smørgrav#
6*64c2a712SDag-Erling Smørgrav
7*64c2a712SDag-Erling Smørgravtftp_dir="${TMPDIR:-/tmp}/tftp.dir"
8*64c2a712SDag-Erling Smørgravinetd_conf="${TMPDIR:-/tmp}/inetd.conf"
9*64c2a712SDag-Erling Smørgravinetd_pid="${TMPDIR:-/tmp}/inetd.pid"
10*64c2a712SDag-Erling Smørgrav
11*64c2a712SDag-Erling Smørgravstart_tftpd() {
12*64c2a712SDag-Erling Smørgrav	if ! [ -z "$(sockstat -PUDP -p69 -q)" ] ; then
13*64c2a712SDag-Erling Smørgrav		atf_skip "the tftp port is in use"
14*64c2a712SDag-Erling Smørgrav	fi
15*64c2a712SDag-Erling Smørgrav	echo "starting inetd for $(atf_get ident)" >&2
16*64c2a712SDag-Erling Smørgrav	rm -rf "${tftp_dir}"
17*64c2a712SDag-Erling Smørgrav	mkdir "${tftp_dir}"
18*64c2a712SDag-Erling Smørgrav	cat >"${inetd_conf}" <<EOF
19*64c2a712SDag-Erling Smørgravtftp	dgram	udp	wait	root	/usr/libexec/tftpd	tftpd -d15 -l ${tftp_dir}
20*64c2a712SDag-Erling Smørgravtftp	dgram	udp6	wait	root	/usr/libexec/tftpd	tftpd -d15 -l ${tftp_dir}
21*64c2a712SDag-Erling SmørgravEOF
22*64c2a712SDag-Erling Smørgrav	/usr/sbin/inetd -a localhost -p "${inetd_pid}" "${inetd_conf}"
23*64c2a712SDag-Erling Smørgrav}
24*64c2a712SDag-Erling Smørgrav
25*64c2a712SDag-Erling Smørgravstop_tftpd() {
26*64c2a712SDag-Erling Smørgrav	echo "stopping inetd for $(atf_get ident)" >&2
27*64c2a712SDag-Erling Smørgrav	# Send SIGTERM to inetd, then SIGKILL until it's gone
28*64c2a712SDag-Erling Smørgrav	local sig=TERM
29*64c2a712SDag-Erling Smørgrav	while pkill -$sig -LF "${inetd_pid}" inetd ; do
30*64c2a712SDag-Erling Smørgrav		echo "waiting for inetd to stop" >&2
31*64c2a712SDag-Erling Smørgrav		sleep 1
32*64c2a712SDag-Erling Smørgrav		sig=KILL
33*64c2a712SDag-Erling Smørgrav	done
34*64c2a712SDag-Erling Smørgrav	rm -rf "${tftp_dir}" "${inetd_conf}" "${inetd_pid}"
35*64c2a712SDag-Erling Smørgrav}
36*64c2a712SDag-Erling Smørgrav
37*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_big cleanup
38*64c2a712SDag-Erling Smørgravtftp_get_big_head() {
39*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with big file"
40*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
41*64c2a712SDag-Erling Smørgrav}
42*64c2a712SDag-Erling Smørgravtftp_get_big_body() {
43*64c2a712SDag-Erling Smørgrav	start_tftpd
44*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/remote.bin"
45*64c2a712SDag-Erling Smørgrav	dd if=/dev/urandom of="${remote_file}" bs=1m count=16 status=none
46*64c2a712SDag-Erling Smørgrav	local local_file="local.bin"
47*64c2a712SDag-Erling Smørgrav	echo "get ${remote_file##*/} ${local_file}" >client-script
48*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Received [0-9]+ bytes" \
49*64c2a712SDag-Erling Smørgrav	    tftp localhost <client-script
50*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${local_file}" "${remote_file}"
51*64c2a712SDag-Erling Smørgrav}
52*64c2a712SDag-Erling Smørgravtftp_get_big_cleanup() {
53*64c2a712SDag-Erling Smørgrav	stop_tftpd
54*64c2a712SDag-Erling Smørgrav}
55*64c2a712SDag-Erling Smørgrav
56*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_host cleanup
57*64c2a712SDag-Erling Smørgravtftp_get_host_head() {
58*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with host name"
59*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
60*64c2a712SDag-Erling Smørgrav}
61*64c2a712SDag-Erling Smørgravtftp_get_host_body() {
62*64c2a712SDag-Erling Smørgrav	start_tftpd
63*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/hello.txt"
64*64c2a712SDag-Erling Smørgrav	echo "Hello, $$!" >"${remote_file}"
65*64c2a712SDag-Erling Smørgrav	local local_file="${remote_file##*/}"
66*64c2a712SDag-Erling Smørgrav	echo "get localhost:${remote_file##*/}" >client-script
67*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Received [0-9]+ bytes" \
68*64c2a712SDag-Erling Smørgrav	    tftp <client-script
69*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${local_file}" "${remote_file}"
70*64c2a712SDag-Erling Smørgrav}
71*64c2a712SDag-Erling Smørgravtftp_get_host_cleanup() {
72*64c2a712SDag-Erling Smørgrav	stop_tftpd
73*64c2a712SDag-Erling Smørgrav}
74*64c2a712SDag-Erling Smørgrav
75*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_ipv4 cleanup
76*64c2a712SDag-Erling Smørgravtftp_get_ipv4_head() {
77*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with ipv4 address"
78*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
79*64c2a712SDag-Erling Smørgrav}
80*64c2a712SDag-Erling Smørgravtftp_get_ipv4_body() {
81*64c2a712SDag-Erling Smørgrav	start_tftpd
82*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/hello.txt"
83*64c2a712SDag-Erling Smørgrav	echo "Hello, $$!" >"${remote_file}"
84*64c2a712SDag-Erling Smørgrav	local local_file="${remote_file##*/}"
85*64c2a712SDag-Erling Smørgrav	echo "get 127.0.0.1:${remote_file##*/}" >client-script
86*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Received [0-9]+ bytes" \
87*64c2a712SDag-Erling Smørgrav	    tftp <client-script
88*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${local_file}" "${remote_file}"
89*64c2a712SDag-Erling Smørgrav}
90*64c2a712SDag-Erling Smørgravtftp_get_ipv4_cleanup() {
91*64c2a712SDag-Erling Smørgrav	stop_tftpd
92*64c2a712SDag-Erling Smørgrav}
93*64c2a712SDag-Erling Smørgrav
94*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_ipv6 cleanup
95*64c2a712SDag-Erling Smørgravtftp_get_ipv6_head() {
96*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with ipv6 address"
97*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
98*64c2a712SDag-Erling Smørgrav}
99*64c2a712SDag-Erling Smørgravtftp_get_ipv6_body() {
100*64c2a712SDag-Erling Smørgrav	sysctl -q kern.features.inet6 || atf_skip "This test requires IPv6 support"
101*64c2a712SDag-Erling Smørgrav	start_tftpd
102*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/hello.txt"
103*64c2a712SDag-Erling Smørgrav	echo "Hello, $$!" >"${remote_file}"
104*64c2a712SDag-Erling Smørgrav	local local_file="${remote_file##*/}"
105*64c2a712SDag-Erling Smørgrav	echo "get [::1]:${remote_file##*/}" >client-script
106*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Received [0-9]+ bytes" \
107*64c2a712SDag-Erling Smørgrav	    tftp <client-script
108*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${local_file}" "${remote_file}"
109*64c2a712SDag-Erling Smørgrav}
110*64c2a712SDag-Erling Smørgravtftp_get_ipv6_cleanup() {
111*64c2a712SDag-Erling Smørgrav	stop_tftpd
112*64c2a712SDag-Erling Smørgrav}
113*64c2a712SDag-Erling Smørgrav
114*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_one cleanup
115*64c2a712SDag-Erling Smørgravtftp_get_one_head() {
116*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with one argument"
117*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
118*64c2a712SDag-Erling Smørgrav}
119*64c2a712SDag-Erling Smørgravtftp_get_one_body() {
120*64c2a712SDag-Erling Smørgrav	start_tftpd
121*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/hello.txt"
122*64c2a712SDag-Erling Smørgrav	echo "Hello, $$!" >"${remote_file}"
123*64c2a712SDag-Erling Smørgrav	local local_file="${remote_file##*/}"
124*64c2a712SDag-Erling Smørgrav	echo "get ${remote_file##*/}" >client-script
125*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Received [0-9]+ bytes" \
126*64c2a712SDag-Erling Smørgrav	    tftp localhost <client-script
127*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${local_file}" "${remote_file}"
128*64c2a712SDag-Erling Smørgrav}
129*64c2a712SDag-Erling Smørgravtftp_get_one_cleanup() {
130*64c2a712SDag-Erling Smørgrav	stop_tftpd
131*64c2a712SDag-Erling Smørgrav}
132*64c2a712SDag-Erling Smørgrav
133*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_two cleanup
134*64c2a712SDag-Erling Smørgravtftp_get_two_head() {
135*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with two arguments"
136*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
137*64c2a712SDag-Erling Smørgrav}
138*64c2a712SDag-Erling Smørgravtftp_get_two_body() {
139*64c2a712SDag-Erling Smørgrav	start_tftpd
140*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/hello.txt"
141*64c2a712SDag-Erling Smørgrav	echo "Hello, $$!" >"${remote_file}"
142*64c2a712SDag-Erling Smørgrav	local local_file="world.txt"
143*64c2a712SDag-Erling Smørgrav	echo "get ${remote_file##*/} ${local_file}" >client-script
144*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Received [0-9]+ bytes" \
145*64c2a712SDag-Erling Smørgrav	    tftp localhost <client-script
146*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${local_file}" "${remote_file}"
147*64c2a712SDag-Erling Smørgrav}
148*64c2a712SDag-Erling Smørgravtftp_get_two_cleanup() {
149*64c2a712SDag-Erling Smørgrav	stop_tftpd
150*64c2a712SDag-Erling Smørgrav}
151*64c2a712SDag-Erling Smørgrav
152*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_more cleanup
153*64c2a712SDag-Erling Smørgravtftp_get_more_head() {
154*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with three or more arguments"
155*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
156*64c2a712SDag-Erling Smørgrav}
157*64c2a712SDag-Erling Smørgravtftp_get_more_body() {
158*64c2a712SDag-Erling Smørgrav	start_tftpd
159*64c2a712SDag-Erling Smørgrav	for n in 3 4 5 6 7 ; do
160*64c2a712SDag-Erling Smørgrav		echo -n "get" >client-script
161*64c2a712SDag-Erling Smørgrav		for f in $(jot -c $n 97) ; do
162*64c2a712SDag-Erling Smørgrav			echo "test file $$/$f/$n" >"${tftp_dir}/${f}.txt"
163*64c2a712SDag-Erling Smørgrav			echo -n " ${f}.txt" >>client-script
164*64c2a712SDag-Erling Smørgrav			rm -f "${f}.txt"
165*64c2a712SDag-Erling Smørgrav		done
166*64c2a712SDag-Erling Smørgrav		echo >>client-script
167*64c2a712SDag-Erling Smørgrav		atf_check -o match:"Received [0-9]+ bytes" \
168*64c2a712SDag-Erling Smørgrav		    tftp localhost <client-script
169*64c2a712SDag-Erling Smørgrav		for f in $(jot -c $n 97) ; do
170*64c2a712SDag-Erling Smørgrav			atf_check cmp -s "${f}.txt" "${tftp_dir}/${f}.txt"
171*64c2a712SDag-Erling Smørgrav		done
172*64c2a712SDag-Erling Smørgrav	done
173*64c2a712SDag-Erling Smørgrav}
174*64c2a712SDag-Erling Smørgravtftp_get_more_cleanup() {
175*64c2a712SDag-Erling Smørgrav	stop_tftpd
176*64c2a712SDag-Erling Smørgrav}
177*64c2a712SDag-Erling Smørgrav
178*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_multi_host cleanup
179*64c2a712SDag-Erling Smørgravtftp_get_multi_host_head() {
180*64c2a712SDag-Erling Smørgrav	atf_set "descr" "get command with multiple files and host name"
181*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
182*64c2a712SDag-Erling Smørgrav}
183*64c2a712SDag-Erling Smørgravtftp_get_multi_host_body() {
184*64c2a712SDag-Erling Smørgrav	start_tftpd
185*64c2a712SDag-Erling Smørgrav	for f in a b c ; do
186*64c2a712SDag-Erling Smørgrav		echo "test file $$/$f/$n" >"${tftp_dir}/${f}.txt"
187*64c2a712SDag-Erling Smørgrav		rm -f "${f}.txt"
188*64c2a712SDag-Erling Smørgrav	done
189*64c2a712SDag-Erling Smørgrav	echo "get localhost:a.txt b.txt c.txt" >client-script
190*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Received [0-9]+ bytes" \
191*64c2a712SDag-Erling Smørgrav	    tftp localhost <client-script
192*64c2a712SDag-Erling Smørgrav	for f in a b c ; do
193*64c2a712SDag-Erling Smørgrav		atf_check cmp -s "${f}.txt" "${tftp_dir}/${f}.txt"
194*64c2a712SDag-Erling Smørgrav	done
195*64c2a712SDag-Erling Smørgrav}
196*64c2a712SDag-Erling Smørgravtftp_get_multi_host_cleanup() {
197*64c2a712SDag-Erling Smørgrav	stop_tftpd
198*64c2a712SDag-Erling Smørgrav}
199*64c2a712SDag-Erling Smørgrav
200*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_big cleanup
201*64c2a712SDag-Erling Smørgravtftp_put_big_head() {
202*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with big file"
203*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
204*64c2a712SDag-Erling Smørgrav}
205*64c2a712SDag-Erling Smørgravtftp_put_big_body() {
206*64c2a712SDag-Erling Smørgrav	start_tftpd
207*64c2a712SDag-Erling Smørgrav	local local_file="local.bin"
208*64c2a712SDag-Erling Smørgrav	dd if=/dev/urandom of="${local_file}" bs=1m count=16 status=none
209*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/random.bin"
210*64c2a712SDag-Erling Smørgrav	truncate -s 0 "${remote_file}"
211*64c2a712SDag-Erling Smørgrav	chown nobody:nogroup "${remote_file}"
212*64c2a712SDag-Erling Smørgrav	chmod 0666 "${remote_file}"
213*64c2a712SDag-Erling Smørgrav	echo "put ${local_file} ${remote_file##*/}" >client-script
214*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Sent [0-9]+ bytes" \
215*64c2a712SDag-Erling Smørgrav	    tftp localhost <client-script
216*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${remote_file}" "${local_file}"
217*64c2a712SDag-Erling Smørgrav}
218*64c2a712SDag-Erling Smørgravtftp_put_big_cleanup() {
219*64c2a712SDag-Erling Smørgrav	stop_tftpd
220*64c2a712SDag-Erling Smørgrav}
221*64c2a712SDag-Erling Smørgrav
222*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_host cleanup
223*64c2a712SDag-Erling Smørgravtftp_put_host_head() {
224*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with host name"
225*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
226*64c2a712SDag-Erling Smørgrav}
227*64c2a712SDag-Erling Smørgravtftp_put_host_body() {
228*64c2a712SDag-Erling Smørgrav	start_tftpd
229*64c2a712SDag-Erling Smørgrav	local local_file="local.txt"
230*64c2a712SDag-Erling Smørgrav	echo "test file $$" >"${local_file}"
231*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/remote.txt"
232*64c2a712SDag-Erling Smørgrav	truncate -s 0 "${remote_file}"
233*64c2a712SDag-Erling Smørgrav	chown nobody:nogroup "${remote_file}"
234*64c2a712SDag-Erling Smørgrav	chmod 0666 "${remote_file}"
235*64c2a712SDag-Erling Smørgrav	echo "put ${local_file} localhost:${remote_file##*/}" >client-script
236*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Sent [0-9]+ bytes" \
237*64c2a712SDag-Erling Smørgrav	    tftp <client-script
238*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${remote_file}" "${local_file}"
239*64c2a712SDag-Erling Smørgrav}
240*64c2a712SDag-Erling Smørgravtftp_put_host_cleanup() {
241*64c2a712SDag-Erling Smørgrav	stop_tftpd
242*64c2a712SDag-Erling Smørgrav}
243*64c2a712SDag-Erling Smørgrav
244*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_ipv4 cleanup
245*64c2a712SDag-Erling Smørgravtftp_put_ipv4_head() {
246*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with ipv4 address"
247*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
248*64c2a712SDag-Erling Smørgrav}
249*64c2a712SDag-Erling Smørgravtftp_put_ipv4_body() {
250*64c2a712SDag-Erling Smørgrav	start_tftpd
251*64c2a712SDag-Erling Smørgrav	local local_file="local.txt"
252*64c2a712SDag-Erling Smørgrav	echo "test file $$" >"${local_file}"
253*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/remote.txt"
254*64c2a712SDag-Erling Smørgrav	truncate -s 0 "${remote_file}"
255*64c2a712SDag-Erling Smørgrav	chown nobody:nogroup "${remote_file}"
256*64c2a712SDag-Erling Smørgrav	chmod 0666 "${remote_file}"
257*64c2a712SDag-Erling Smørgrav	echo "put ${local_file} 127.0.0.1:${remote_file##*/}" >client-script
258*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Sent [0-9]+ bytes" \
259*64c2a712SDag-Erling Smørgrav	    tftp <client-script
260*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${remote_file}" "${local_file}"
261*64c2a712SDag-Erling Smørgrav}
262*64c2a712SDag-Erling Smørgravtftp_put_ipv4_cleanup() {
263*64c2a712SDag-Erling Smørgrav	stop_tftpd
264*64c2a712SDag-Erling Smørgrav}
265*64c2a712SDag-Erling Smørgrav
266*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_ipv6 cleanup
267*64c2a712SDag-Erling Smørgravtftp_put_ipv6_head() {
268*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with ipv6 address"
269*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
270*64c2a712SDag-Erling Smørgrav}
271*64c2a712SDag-Erling Smørgravtftp_put_ipv6_body() {
272*64c2a712SDag-Erling Smørgrav	sysctl -q kern.features.inet6 || atf_skip "This test requires IPv6 support"
273*64c2a712SDag-Erling Smørgrav	start_tftpd
274*64c2a712SDag-Erling Smørgrav	local local_file="local.txt"
275*64c2a712SDag-Erling Smørgrav	echo "test file $$" >"${local_file}"
276*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/remote.txt"
277*64c2a712SDag-Erling Smørgrav	truncate -s 0 "${remote_file}"
278*64c2a712SDag-Erling Smørgrav	chown nobody:nogroup "${remote_file}"
279*64c2a712SDag-Erling Smørgrav	chmod 0666 "${remote_file}"
280*64c2a712SDag-Erling Smørgrav	echo "put ${local_file} [::1]:${remote_file##*/}" >client-script
281*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Sent [0-9]+ bytes" \
282*64c2a712SDag-Erling Smørgrav	    tftp <client-script
283*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${remote_file}" "${local_file}"
284*64c2a712SDag-Erling Smørgrav}
285*64c2a712SDag-Erling Smørgravtftp_put_ipv6_cleanup() {
286*64c2a712SDag-Erling Smørgrav	stop_tftpd
287*64c2a712SDag-Erling Smørgrav}
288*64c2a712SDag-Erling Smørgrav
289*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_one cleanup
290*64c2a712SDag-Erling Smørgravtftp_put_one_head() {
291*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with one argument"
292*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
293*64c2a712SDag-Erling Smørgrav}
294*64c2a712SDag-Erling Smørgravtftp_put_one_body() {
295*64c2a712SDag-Erling Smørgrav	start_tftpd
296*64c2a712SDag-Erling Smørgrav	local local_file="file.txt"
297*64c2a712SDag-Erling Smørgrav	echo "test file $$" >"${local_file}"
298*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/${local_file}"
299*64c2a712SDag-Erling Smørgrav	truncate -s 0 "${remote_file}"
300*64c2a712SDag-Erling Smørgrav	chown nobody:nogroup "${remote_file}"
301*64c2a712SDag-Erling Smørgrav	chmod 0666 "${remote_file}"
302*64c2a712SDag-Erling Smørgrav	echo "put ${local_file}" >client-script
303*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Sent [0-9]+ bytes" \
304*64c2a712SDag-Erling Smørgrav	    tftp localhost <client-script
305*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${remote_file}" "${local_file}"
306*64c2a712SDag-Erling Smørgrav}
307*64c2a712SDag-Erling Smørgravtftp_put_one_cleanup() {
308*64c2a712SDag-Erling Smørgrav	stop_tftpd
309*64c2a712SDag-Erling Smørgrav}
310*64c2a712SDag-Erling Smørgrav
311*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_two cleanup
312*64c2a712SDag-Erling Smørgravtftp_put_two_head() {
313*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with two arguments"
314*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
315*64c2a712SDag-Erling Smørgrav}
316*64c2a712SDag-Erling Smørgravtftp_put_two_body() {
317*64c2a712SDag-Erling Smørgrav	start_tftpd
318*64c2a712SDag-Erling Smørgrav	local local_file="local.txt"
319*64c2a712SDag-Erling Smørgrav	echo "test file $$" >"${local_file}"
320*64c2a712SDag-Erling Smørgrav	local remote_file="${tftp_dir}/remote.txt"
321*64c2a712SDag-Erling Smørgrav	truncate -s 0 "${remote_file}"
322*64c2a712SDag-Erling Smørgrav	chown nobody:nogroup "${remote_file}"
323*64c2a712SDag-Erling Smørgrav	chmod 0666 "${remote_file}"
324*64c2a712SDag-Erling Smørgrav	echo "put ${local_file} ${remote_file##*/}" >client-script
325*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Sent [0-9]+ bytes" \
326*64c2a712SDag-Erling Smørgrav	    tftp localhost <client-script
327*64c2a712SDag-Erling Smørgrav	atf_check cmp -s "${remote_file}" "${local_file}"
328*64c2a712SDag-Erling Smørgrav}
329*64c2a712SDag-Erling Smørgravtftp_put_two_cleanup() {
330*64c2a712SDag-Erling Smørgrav	stop_tftpd
331*64c2a712SDag-Erling Smørgrav}
332*64c2a712SDag-Erling Smørgrav
333*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_more cleanup
334*64c2a712SDag-Erling Smørgravtftp_put_more_head() {
335*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with three or more arguments"
336*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
337*64c2a712SDag-Erling Smørgrav}
338*64c2a712SDag-Erling Smørgravtftp_put_more_body() {
339*64c2a712SDag-Erling Smørgrav	start_tftpd
340*64c2a712SDag-Erling Smørgrav	mkdir "${tftp_dir}/subdir"
341*64c2a712SDag-Erling Smørgrav	for n in 2 3 4 5 6 ; do
342*64c2a712SDag-Erling Smørgrav		echo -n "put" >client-script
343*64c2a712SDag-Erling Smørgrav		for f in $(jot -c $n 97) ; do
344*64c2a712SDag-Erling Smørgrav			echo "test file $$/$f/$n" >"${f}.txt"
345*64c2a712SDag-Erling Smørgrav			truncate -s 0 "${tftp_dir}/subdir/${f}.txt"
346*64c2a712SDag-Erling Smørgrav			chown nobody:nogroup "${tftp_dir}/subdir/${f}.txt"
347*64c2a712SDag-Erling Smørgrav			chmod 0666 "${tftp_dir}/subdir/${f}.txt"
348*64c2a712SDag-Erling Smørgrav			echo -n " ${f}.txt" >>client-script
349*64c2a712SDag-Erling Smørgrav		done
350*64c2a712SDag-Erling Smørgrav		echo " subdir" >>client-script
351*64c2a712SDag-Erling Smørgrav		atf_check -o match:"Sent [0-9]+ bytes" \
352*64c2a712SDag-Erling Smørgrav		    tftp localhost <client-script
353*64c2a712SDag-Erling Smørgrav		for f in $(jot -c $n 97) ; do
354*64c2a712SDag-Erling Smørgrav			atf_check cmp -s "${tftp_dir}/subdir/${f}.txt" "${f}.txt"
355*64c2a712SDag-Erling Smørgrav		done
356*64c2a712SDag-Erling Smørgrav	done
357*64c2a712SDag-Erling Smørgrav}
358*64c2a712SDag-Erling Smørgravtftp_put_more_cleanup() {
359*64c2a712SDag-Erling Smørgrav	stop_tftpd
360*64c2a712SDag-Erling Smørgrav}
361*64c2a712SDag-Erling Smørgrav
362*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_multi_host cleanup
363*64c2a712SDag-Erling Smørgravtftp_put_multi_host_head() {
364*64c2a712SDag-Erling Smørgrav	atf_set "descr" "put command with multiple files and host name"
365*64c2a712SDag-Erling Smørgrav	atf_set "require.user" "root"
366*64c2a712SDag-Erling Smørgrav}
367*64c2a712SDag-Erling Smørgravtftp_put_multi_host_body() {
368*64c2a712SDag-Erling Smørgrav	start_tftpd
369*64c2a712SDag-Erling Smørgrav	mkdir "${tftp_dir}/subdir"
370*64c2a712SDag-Erling Smørgrav	echo -n "put" >client-script
371*64c2a712SDag-Erling Smørgrav	for f in a b c ; do
372*64c2a712SDag-Erling Smørgrav		echo "test file $$/$f" >"${f}.txt"
373*64c2a712SDag-Erling Smørgrav		truncate -s 0 "${tftp_dir}/subdir/${f}.txt"
374*64c2a712SDag-Erling Smørgrav		chown nobody:nogroup "${tftp_dir}/subdir/${f}.txt"
375*64c2a712SDag-Erling Smørgrav		chmod 0666 "${tftp_dir}/subdir/${f}.txt"
376*64c2a712SDag-Erling Smørgrav		echo -n " ${f}.txt" >>client-script
377*64c2a712SDag-Erling Smørgrav	done
378*64c2a712SDag-Erling Smørgrav	echo " localhost:subdir" >>client-script
379*64c2a712SDag-Erling Smørgrav	atf_check -o match:"Sent [0-9]+ bytes" \
380*64c2a712SDag-Erling Smørgrav	    tftp <client-script
381*64c2a712SDag-Erling Smørgrav	for f in a b c ; do
382*64c2a712SDag-Erling Smørgrav		atf_check cmp -s "${tftp_dir}/subdir/${f}.txt" "${f}.txt"
383*64c2a712SDag-Erling Smørgrav	done
384*64c2a712SDag-Erling Smørgrav}
385*64c2a712SDag-Erling Smørgravtftp_put_multi_host_cleanup() {
386*64c2a712SDag-Erling Smørgrav	stop_tftpd
387*64c2a712SDag-Erling Smørgrav}
388*64c2a712SDag-Erling Smørgrav
389*64c2a712SDag-Erling Smørgravatf_init_test_cases() {
390*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_big
391*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_host
392*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_ipv4
393*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_ipv6
394*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_one
395*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_two
396*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_more
397*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_get_multi_host
398*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_big
399*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_host
400*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_ipv4
401*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_ipv6
402*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_one
403*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_two
404*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_more
405*64c2a712SDag-Erling Smørgrav	atf_add_test_case tftp_put_multi_host
406*64c2a712SDag-Erling Smørgrav}
407