xref: /freebsd/sbin/ping/tests/ping_test.sh (revision fc7143b48341fb16ef5b2262c7cd5b5c47056112)
17cc426fbSAlan Somers#
24d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause
37cc426fbSAlan Somers#
47cc426fbSAlan Somers# Copyright (C) 2019 Jan Sucan <jansucan@FreeBSD.org>
57cc426fbSAlan Somers# All rights reserved.
67cc426fbSAlan Somers#
77cc426fbSAlan Somers# Redistribution and use in source and binary forms, with or without
87cc426fbSAlan Somers# modification, are permitted provided that the following conditions
97cc426fbSAlan Somers# are met:
107cc426fbSAlan Somers# 1. Redistributions of source code must retain the above copyright
117cc426fbSAlan Somers#    notice, this list of conditions and the following disclaimer.
127cc426fbSAlan Somers# 2. Redistributions in binary form must reproduce the above copyright
137cc426fbSAlan Somers#    notice, this list of conditions and the following disclaimer in the
147cc426fbSAlan Somers#    documentation and/or other materials provided with the distribution.
157cc426fbSAlan Somers#
167cc426fbSAlan Somers# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
177cc426fbSAlan Somers# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
187cc426fbSAlan Somers# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197cc426fbSAlan Somers# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
207cc426fbSAlan Somers# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
217cc426fbSAlan Somers# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
227cc426fbSAlan Somers# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
237cc426fbSAlan Somers# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
247cc426fbSAlan Somers# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257cc426fbSAlan Somers# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267cc426fbSAlan Somers# SUCH DAMAGE.
277cc426fbSAlan Somers#
287cc426fbSAlan Somers
29fcae0b54SJose Luis Duranrequire_ipv4()
30fcae0b54SJose Luis Duran{
319ce201f2SAlan Somers	if ! getaddrinfo -f inet localhost 1>/dev/null 2>&1; then
329ce201f2SAlan Somers		atf_skip "IPv4 is not configured"
339ce201f2SAlan Somers	fi
349ce201f2SAlan Somers}
35fcae0b54SJose Luis Duranrequire_ipv6()
36fcae0b54SJose Luis Duran{
379ce201f2SAlan Somers	if ! getaddrinfo -f inet6 localhost 1>/dev/null 2>&1; then
389ce201f2SAlan Somers		atf_skip "IPv6 is not configured"
399ce201f2SAlan Somers	fi
409ce201f2SAlan Somers}
419ce201f2SAlan Somers
427cc426fbSAlan Somersatf_test_case ping_c1_s56_t1
43fcae0b54SJose Luis Duranping_c1_s56_t1_head()
44fcae0b54SJose Luis Duran{
457cc426fbSAlan Somers	atf_set "descr" "Stop after receiving 1 ECHO_RESPONSE packet"
467cc426fbSAlan Somers}
47fcae0b54SJose Luis Duranping_c1_s56_t1_body()
48fcae0b54SJose Luis Duran{
499ce201f2SAlan Somers	require_ipv4
507cc426fbSAlan Somers	atf_check -s exit:0 -o save:std.out -e empty \
513cde9171SAlan Somers	    ping -4 -c 1 -s 56 -t 1 localhost
527cc426fbSAlan Somers	check_ping_statistics std.out $(atf_get_srcdir)/ping_c1_s56_t1.out
537cc426fbSAlan Somers}
547cc426fbSAlan Somers
555af718a5SMike Karelsatf_test_case ping_c1_s56_t1_S127
56fcae0b54SJose Luis Duranping_c1_s56_t1_S127_head()
57fcae0b54SJose Luis Duran{
585af718a5SMike Karels	atf_set "descr" "Check that ping -S 127.0.0.1 localhost succeeds"
595af718a5SMike Karels}
60fcae0b54SJose Luis Duranping_c1_s56_t1_S127_body()
61fcae0b54SJose Luis Duran{
625af718a5SMike Karels	require_ipv4
635af718a5SMike Karels	require_ipv6
645af718a5SMike Karels	atf_check -s exit:0 -o save:std.out -e empty \
655af718a5SMike Karels	    ping -c 1 -s 56 -t 1 -S 127.0.0.1 localhost
665af718a5SMike Karels	check_ping_statistics std.out $(atf_get_srcdir)/ping_c1_s56_t1_S127.out
675af718a5SMike Karels}
685af718a5SMike Karels
693cde9171SAlan Somersatf_test_case ping_6_c1_s8_t1
70fcae0b54SJose Luis Duranping_6_c1_s8_t1_head()
71fcae0b54SJose Luis Duran{
723cde9171SAlan Somers	atf_set "descr" "Stop after receiving 1 ECHO_RESPONSE packet"
733cde9171SAlan Somers}
74fcae0b54SJose Luis Duranping_6_c1_s8_t1_body()
75fcae0b54SJose Luis Duran{
769ce201f2SAlan Somers	require_ipv6
773cde9171SAlan Somers	atf_check -s exit:0 -o save:std.out -e empty \
783cde9171SAlan Somers	    ping -6 -c 1 -s 8 -t 1 localhost
793cde9171SAlan Somers	check_ping_statistics std.out $(atf_get_srcdir)/ping_6_c1_s8_t1.out
803cde9171SAlan Somers}
813cde9171SAlan Somers
825af718a5SMike Karelsatf_test_case ping_c1_s8_t1_S1
83fcae0b54SJose Luis Duranping_c1_s8_t1_S1_head()
84fcae0b54SJose Luis Duran{
855af718a5SMike Karels	atf_set "descr" "Check that ping -S ::1 localhost succeeds"
865af718a5SMike Karels}
87fcae0b54SJose Luis Duranping_c1_s8_t1_S1_body()
88fcae0b54SJose Luis Duran{
895af718a5SMike Karels	require_ipv4
905af718a5SMike Karels	require_ipv6
915af718a5SMike Karels	atf_check -s exit:0 -o save:std.out -e empty \
925af718a5SMike Karels	    ping -c 1 -s 8 -t 1 -S ::1 localhost
935af718a5SMike Karels	check_ping_statistics std.out $(atf_get_srcdir)/ping_c1_s8_t1_S1.out
945af718a5SMike Karels}
955af718a5SMike Karels
96d2624517SAlan Somersatf_test_case ping6_c1_s8_t1
97fcae0b54SJose Luis Duranping6_c1_s8_t1_head()
98fcae0b54SJose Luis Duran{
99d2624517SAlan Somers	atf_set "descr" "Use IPv6 when invoked as ping6"
100d2624517SAlan Somers}
101fcae0b54SJose Luis Duranping6_c1_s8_t1_body()
102fcae0b54SJose Luis Duran{
1039ce201f2SAlan Somers	require_ipv6
104d2624517SAlan Somers	atf_check -s exit:0 -o save:std.out -e empty \
105d2624517SAlan Somers	    ping6 -c 1 -s 8 -t 1 localhost
106d2624517SAlan Somers	check_ping_statistics std.out $(atf_get_srcdir)/ping_6_c1_s8_t1.out
107d2624517SAlan Somers}
108d2624517SAlan Somers
109*fc7143b4SDag-Erling Smørgravatf_test_case ping_c1t6
110fcae0b54SJose Luis Duranping_c1t6_head()
111fcae0b54SJose Luis Duran{
1129ce201f2SAlan Somers	atf_set "descr" "-t6 is not interpreted as -t -6 by ping"
1139ce201f2SAlan Somers}
114fcae0b54SJose Luis Duranping_c1t6_body()
115fcae0b54SJose Luis Duran{
1169ce201f2SAlan Somers	require_ipv4
1179ce201f2SAlan Somers	atf_check -s exit:0 -o ignore -e empty ping -c1 -t6 127.0.0.1
1189ce201f2SAlan Somers}
1199ce201f2SAlan Somers
120*fc7143b4SDag-Erling Smørgravatf_test_case ping_c1t4
121fcae0b54SJose Luis Duranping6_c1t4_head()
122fcae0b54SJose Luis Duran{
1239ce201f2SAlan Somers	atf_set "descr" "-t4 is not interpreted as -t -4 by ping6"
1249ce201f2SAlan Somers}
125fcae0b54SJose Luis Duranping6_c1t4_body()
126fcae0b54SJose Luis Duran{
1279ce201f2SAlan Somers	require_ipv6
1289ce201f2SAlan Somers	atf_check -s exit:0 -o ignore -e empty ping6 -c1 -t4 ::1
1299ce201f2SAlan Somers}
1309ce201f2SAlan Somers
131*fc7143b4SDag-Erling Smørgravatf_test_case ping_46
132fcae0b54SJose Luis Duranping_46_head()
133fcae0b54SJose Luis Duran{
134d481443aSJose Luis Duran	atf_set "descr" "-4 and -6 cannot be used simultaneously"
1359ce201f2SAlan Somers}
136fcae0b54SJose Luis Duranping_46_body()
137fcae0b54SJose Luis Duran{
138d481443aSJose Luis Duran	require_ipv4
139d481443aSJose Luis Duran	require_ipv6
140d481443aSJose Luis Duran	atf_check -s exit:1 \
1417fd2c91aSDag-Erling Smørgrav	    -e match:"illegal option -- 6" \
142d481443aSJose Luis Duran	    ping -4 -6 localhost
1439ce201f2SAlan Somers}
1449ce201f2SAlan Somers
145*fc7143b4SDag-Erling Smørgravatf_test_case ping_64
1467fd2c91aSDag-Erling Smørgravping_64_head()
147fcae0b54SJose Luis Duran{
148d481443aSJose Luis Duran	atf_set "descr" "-4 and -6 cannot be used simultaneously"
1499ce201f2SAlan Somers}
1507fd2c91aSDag-Erling Smørgravping_64_body()
151fcae0b54SJose Luis Duran{
152d481443aSJose Luis Duran	require_ipv4
153d481443aSJose Luis Duran	require_ipv6
154d481443aSJose Luis Duran	atf_check -s exit:1 \
1557fd2c91aSDag-Erling Smørgrav	    -e match:"illegal option -- 4" \
1567fd2c91aSDag-Erling Smørgrav	    ping -6 -4 localhost
1577fd2c91aSDag-Erling Smørgrav}
1587fd2c91aSDag-Erling Smørgrav
159*fc7143b4SDag-Erling Smørgravatf_test_case ping6_4
1607fd2c91aSDag-Erling Smørgravping6_4_head()
1617fd2c91aSDag-Erling Smørgrav{
1627fd2c91aSDag-Erling Smørgrav	atf_set "descr" "ping6 does not accept -4"
1637fd2c91aSDag-Erling Smørgrav}
1647fd2c91aSDag-Erling Smørgravping6_4_body()
1657fd2c91aSDag-Erling Smørgrav{
1667fd2c91aSDag-Erling Smørgrav	require_ipv4
1677fd2c91aSDag-Erling Smørgrav	require_ipv6
1687fd2c91aSDag-Erling Smørgrav	atf_check -s exit:1 \
1697fd2c91aSDag-Erling Smørgrav	    -e match:"illegal option -- 4" \
1707fd2c91aSDag-Erling Smørgrav	    ping6 -4 localhost
1719ce201f2SAlan Somers}
1729ce201f2SAlan Somers
173c4ffb80eSDag-Erling Smørgravatf_test_case ping_nohost
174c4ffb80eSDag-Erling Smørgravping_nohost_head()
175c4ffb80eSDag-Erling Smørgrav{
176c4ffb80eSDag-Erling Smørgrav	atf_set "descr" "ping a nonexistent host"
177c4ffb80eSDag-Erling Smørgrav}
178c4ffb80eSDag-Erling Smørgravping_nohost_body()
179c4ffb80eSDag-Erling Smørgrav{
180c4ffb80eSDag-Erling Smørgrav	atf_check -s exit:68 -e match:"cannot resolve" \
181c4ffb80eSDag-Erling Smørgrav	    ping nonexistent.in-addr.arpa.
182c4ffb80eSDag-Erling Smørgrav}
183c4ffb80eSDag-Erling Smørgrav
184c4ffb80eSDag-Erling Smørgravatf_test_case ping4_nohost
185c4ffb80eSDag-Erling Smørgravping4_nohost_head()
186c4ffb80eSDag-Erling Smørgrav{
187c4ffb80eSDag-Erling Smørgrav	atf_set "descr" "ping -4 a nonexistent host"
188c4ffb80eSDag-Erling Smørgrav}
189c4ffb80eSDag-Erling Smørgravping4_nohost_body()
190c4ffb80eSDag-Erling Smørgrav{
191c4ffb80eSDag-Erling Smørgrav	atf_check -s exit:68 -e match:"cannot resolve" \
192c4ffb80eSDag-Erling Smørgrav	    ping -4 nonexistent.in-addr.arpa.
193c4ffb80eSDag-Erling Smørgrav}
194c4ffb80eSDag-Erling Smørgrav
195c4ffb80eSDag-Erling Smørgravatf_test_case ping6_nohost
196c4ffb80eSDag-Erling Smørgravping6_nohost_head()
197c4ffb80eSDag-Erling Smørgrav{
198c4ffb80eSDag-Erling Smørgrav	atf_set "descr" "ping -6 a nonexistent host"
199c4ffb80eSDag-Erling Smørgrav}
200c4ffb80eSDag-Erling Smørgravping6_nohost_body()
201c4ffb80eSDag-Erling Smørgrav{
202c4ffb80eSDag-Erling Smørgrav	atf_check -s exit:68 -e match:"cannot resolve" \
203c4ffb80eSDag-Erling Smørgrav	    ping -6 nonexistent.in-addr.arpa.
204c4ffb80eSDag-Erling Smørgrav}
205c4ffb80eSDag-Erling Smørgrav
206e35cfc60SAlan Somersatf_test_case "inject_opts" "cleanup"
207e35cfc60SAlan Somersinject_opts_head()
208e35cfc60SAlan Somers{
209e35cfc60SAlan Somers	atf_set "descr" "Inject an ECHO REPLY with IP options"
210e35cfc60SAlan Somers	atf_set "require.user" "root"
211e35cfc60SAlan Somers	atf_set "require.progs" "python3" "scapy"
212e35cfc60SAlan Somers}
213e35cfc60SAlan Somersinject_opts_body()
214e35cfc60SAlan Somers{
215e35cfc60SAlan Somers	atf_check -s exit:0 -o match:"wrong total length" -o match:"NOP" python3 $(atf_get_srcdir)/injection.py opts
216e35cfc60SAlan Somers}
217e35cfc60SAlan Somersinject_opts_cleanup()
218e35cfc60SAlan Somers{
219e35cfc60SAlan Somers	ifconfig `cat tun.txt` destroy
220e35cfc60SAlan Somers}
221e35cfc60SAlan Somers
222e35cfc60SAlan Somersatf_test_case "inject_pip" "cleanup"
223e35cfc60SAlan Somersinject_pip_head()
224e35cfc60SAlan Somers{
225e35cfc60SAlan Somers	atf_set "descr" "Inject an ICMP error with a quoted packet with IP options"
226e35cfc60SAlan Somers	atf_set "require.user" "root"
227e35cfc60SAlan Somers	atf_set "require.progs" "python3" "scapy"
228e35cfc60SAlan Somers}
229e35cfc60SAlan Somersinject_pip_body()
230e35cfc60SAlan Somers{
23120b41303SJose Luis Duran	atf_check -s exit:2 -o match:"Destination Host Unreachable" -o match:"(01){40}" python3 $(atf_get_srcdir)/injection.py pip
232e35cfc60SAlan Somers}
233e35cfc60SAlan Somersinject_pip_cleanup()
234e35cfc60SAlan Somers{
235e35cfc60SAlan Somers	ifconfig `cat tun.txt` destroy
236e35cfc60SAlan Somers}
237e35cfc60SAlan Somers
238e35cfc60SAlan Somers# This is redundant with the ping_ tests, but it serves to ensure that scapy.py
239e35cfc60SAlan Somers# is working correctly.
240e35cfc60SAlan Somersatf_test_case "inject_reply" "cleanup"
241e35cfc60SAlan Somersinject_reply_head()
242e35cfc60SAlan Somers{
243e35cfc60SAlan Somers	atf_set "descr" "Basic ping test with packet injection"
244e35cfc60SAlan Somers	atf_set "require.user" "root"
245e35cfc60SAlan Somers	atf_set "require.progs" "python3" "scapy"
246e35cfc60SAlan Somers}
247e35cfc60SAlan Somersinject_reply_body()
248e35cfc60SAlan Somers{
249e35cfc60SAlan Somers	atf_check -s exit:0 -o match:"1 packets transmitted, 1 packets received" python3 $(atf_get_srcdir)/injection.py reply
250e35cfc60SAlan Somers}
251e35cfc60SAlan Somersinject_reply_cleanup()
252e35cfc60SAlan Somers{
253e35cfc60SAlan Somers	ifconfig `cat tun.txt` destroy
254e35cfc60SAlan Somers}
255e35cfc60SAlan Somers
256fcae0b54SJose Luis Duranatf_init_test_cases()
257fcae0b54SJose Luis Duran{
2587cc426fbSAlan Somers	atf_add_test_case ping_c1_s56_t1
2595af718a5SMike Karels	atf_add_test_case ping_c1_s56_t1_S127
2603cde9171SAlan Somers	atf_add_test_case ping_6_c1_s8_t1
2615af718a5SMike Karels	atf_add_test_case ping_c1_s8_t1_S1
262d2624517SAlan Somers	atf_add_test_case ping6_c1_s8_t1
2639ce201f2SAlan Somers	atf_add_test_case ping_c1t6
2649ce201f2SAlan Somers	atf_add_test_case ping6_c1t4
2659ce201f2SAlan Somers	atf_add_test_case ping_46
2667fd2c91aSDag-Erling Smørgrav	atf_add_test_case ping_64
2677fd2c91aSDag-Erling Smørgrav	atf_add_test_case ping6_4
268c4ffb80eSDag-Erling Smørgrav	atf_add_test_case ping_nohost
269c4ffb80eSDag-Erling Smørgrav	atf_add_test_case ping4_nohost
270c4ffb80eSDag-Erling Smørgrav	atf_add_test_case ping6_nohost
271e35cfc60SAlan Somers	atf_add_test_case inject_opts
272e35cfc60SAlan Somers	atf_add_test_case inject_pip
273e35cfc60SAlan Somers	atf_add_test_case inject_reply
2747cc426fbSAlan Somers}
2757cc426fbSAlan Somers
276fcae0b54SJose Luis Durancheck_ping_statistics()
277fcae0b54SJose Luis Duran{
2787cc426fbSAlan Somers	sed -e 's/0.[0-9]\{3\}//g' \
2797cc426fbSAlan Somers	    -e 's/[1-9][0-9]*.[0-9]\{3\}//g' \
2807cc426fbSAlan Somers	    -e 's/localhost ([0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{1,3\})/localhost/' \
2817cc426fbSAlan Somers	    -e 's/from [0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{1,3\}/from/' \
2827cc426fbSAlan Somers	    -e 's/ttl=[0-9][0-9]*/ttl=/' \
2833cde9171SAlan Somers	    -e 's/hlim=[0-9][0-9]*/hlim=/' \
2847cc426fbSAlan Somers	    "$1" >"$1".filtered
2857cc426fbSAlan Somers	atf_check -s exit:0 diff -u "$1".filtered "$2"
2867cc426fbSAlan Somers}
287