1*053f45beSAndroid Build Coastguard Worker#!/bin/bash 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 3*053f45beSAndroid Build Coastguard Worker# 4*053f45beSAndroid Build Coastguard Worker# Run traceroute/traceroute6 tests 5*053f45beSAndroid Build Coastguard Worker# 6*053f45beSAndroid Build Coastguard Worker 7*053f45beSAndroid Build Coastguard WorkerVERBOSE=0 8*053f45beSAndroid Build Coastguard WorkerPAUSE_ON_FAIL=no 9*053f45beSAndroid Build Coastguard Worker 10*053f45beSAndroid Build Coastguard Worker################################################################################ 11*053f45beSAndroid Build Coastguard Worker# 12*053f45beSAndroid Build Coastguard Workerlog_test() 13*053f45beSAndroid Build Coastguard Worker{ 14*053f45beSAndroid Build Coastguard Worker local rc=$1 15*053f45beSAndroid Build Coastguard Worker local expected=$2 16*053f45beSAndroid Build Coastguard Worker local msg="$3" 17*053f45beSAndroid Build Coastguard Worker 18*053f45beSAndroid Build Coastguard Worker if [ ${rc} -eq ${expected} ]; then 19*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [ OK ]\n" "${msg}" 20*053f45beSAndroid Build Coastguard Worker nsuccess=$((nsuccess+1)) 21*053f45beSAndroid Build Coastguard Worker else 22*053f45beSAndroid Build Coastguard Worker ret=1 23*053f45beSAndroid Build Coastguard Worker nfail=$((nfail+1)) 24*053f45beSAndroid Build Coastguard Worker printf "TEST: %-60s [FAIL]\n" "${msg}" 25*053f45beSAndroid Build Coastguard Worker if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 26*053f45beSAndroid Build Coastguard Worker echo 27*053f45beSAndroid Build Coastguard Worker echo "hit enter to continue, 'q' to quit" 28*053f45beSAndroid Build Coastguard Worker read a 29*053f45beSAndroid Build Coastguard Worker [ "$a" = "q" ] && exit 1 30*053f45beSAndroid Build Coastguard Worker fi 31*053f45beSAndroid Build Coastguard Worker fi 32*053f45beSAndroid Build Coastguard Worker} 33*053f45beSAndroid Build Coastguard Worker 34*053f45beSAndroid Build Coastguard Workerrun_cmd() 35*053f45beSAndroid Build Coastguard Worker{ 36*053f45beSAndroid Build Coastguard Worker local ns 37*053f45beSAndroid Build Coastguard Worker local cmd 38*053f45beSAndroid Build Coastguard Worker local out 39*053f45beSAndroid Build Coastguard Worker local rc 40*053f45beSAndroid Build Coastguard Worker 41*053f45beSAndroid Build Coastguard Worker ns="$1" 42*053f45beSAndroid Build Coastguard Worker shift 43*053f45beSAndroid Build Coastguard Worker cmd="$*" 44*053f45beSAndroid Build Coastguard Worker 45*053f45beSAndroid Build Coastguard Worker if [ "$VERBOSE" = "1" ]; then 46*053f45beSAndroid Build Coastguard Worker printf " COMMAND: $cmd\n" 47*053f45beSAndroid Build Coastguard Worker fi 48*053f45beSAndroid Build Coastguard Worker 49*053f45beSAndroid Build Coastguard Worker out=$(eval ip netns exec ${ns} ${cmd} 2>&1) 50*053f45beSAndroid Build Coastguard Worker rc=$? 51*053f45beSAndroid Build Coastguard Worker if [ "$VERBOSE" = "1" -a -n "$out" ]; then 52*053f45beSAndroid Build Coastguard Worker echo " $out" 53*053f45beSAndroid Build Coastguard Worker fi 54*053f45beSAndroid Build Coastguard Worker 55*053f45beSAndroid Build Coastguard Worker [ "$VERBOSE" = "1" ] && echo 56*053f45beSAndroid Build Coastguard Worker 57*053f45beSAndroid Build Coastguard Worker return $rc 58*053f45beSAndroid Build Coastguard Worker} 59*053f45beSAndroid Build Coastguard Worker 60*053f45beSAndroid Build Coastguard Worker################################################################################ 61*053f45beSAndroid Build Coastguard Worker# create namespaces and interconnects 62*053f45beSAndroid Build Coastguard Worker 63*053f45beSAndroid Build Coastguard Workercreate_ns() 64*053f45beSAndroid Build Coastguard Worker{ 65*053f45beSAndroid Build Coastguard Worker local ns=$1 66*053f45beSAndroid Build Coastguard Worker local addr=$2 67*053f45beSAndroid Build Coastguard Worker local addr6=$3 68*053f45beSAndroid Build Coastguard Worker 69*053f45beSAndroid Build Coastguard Worker [ -z "${addr}" ] && addr="-" 70*053f45beSAndroid Build Coastguard Worker [ -z "${addr6}" ] && addr6="-" 71*053f45beSAndroid Build Coastguard Worker 72*053f45beSAndroid Build Coastguard Worker ip netns add ${ns} 73*053f45beSAndroid Build Coastguard Worker 74*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} ip link set lo up 75*053f45beSAndroid Build Coastguard Worker if [ "${addr}" != "-" ]; then 76*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} ip addr add dev lo ${addr} 77*053f45beSAndroid Build Coastguard Worker fi 78*053f45beSAndroid Build Coastguard Worker if [ "${addr6}" != "-" ]; then 79*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} ip -6 addr add dev lo ${addr6} 80*053f45beSAndroid Build Coastguard Worker fi 81*053f45beSAndroid Build Coastguard Worker 82*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} ip ro add unreachable default metric 8192 83*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} ip -6 ro add unreachable default metric 8192 84*053f45beSAndroid Build Coastguard Worker 85*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1 86*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 87*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1 88*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1 89*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0 90*053f45beSAndroid Build Coastguard Worker} 91*053f45beSAndroid Build Coastguard Worker 92*053f45beSAndroid Build Coastguard Worker# create veth pair to connect namespaces and apply addresses. 93*053f45beSAndroid Build Coastguard Workerconnect_ns() 94*053f45beSAndroid Build Coastguard Worker{ 95*053f45beSAndroid Build Coastguard Worker local ns1=$1 96*053f45beSAndroid Build Coastguard Worker local ns1_dev=$2 97*053f45beSAndroid Build Coastguard Worker local ns1_addr=$3 98*053f45beSAndroid Build Coastguard Worker local ns1_addr6=$4 99*053f45beSAndroid Build Coastguard Worker local ns2=$5 100*053f45beSAndroid Build Coastguard Worker local ns2_dev=$6 101*053f45beSAndroid Build Coastguard Worker local ns2_addr=$7 102*053f45beSAndroid Build Coastguard Worker local ns2_addr6=$8 103*053f45beSAndroid Build Coastguard Worker 104*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns1} ip li add ${ns1_dev} type veth peer name tmp 105*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns1} ip li set ${ns1_dev} up 106*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns1} ip li set tmp netns ${ns2} name ${ns2_dev} 107*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns2} ip li set ${ns2_dev} up 108*053f45beSAndroid Build Coastguard Worker 109*053f45beSAndroid Build Coastguard Worker if [ "${ns1_addr}" != "-" ]; then 110*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns1} ip addr add dev ${ns1_dev} ${ns1_addr} 111*053f45beSAndroid Build Coastguard Worker fi 112*053f45beSAndroid Build Coastguard Worker 113*053f45beSAndroid Build Coastguard Worker if [ "${ns2_addr}" != "-" ]; then 114*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns2} ip addr add dev ${ns2_dev} ${ns2_addr} 115*053f45beSAndroid Build Coastguard Worker fi 116*053f45beSAndroid Build Coastguard Worker 117*053f45beSAndroid Build Coastguard Worker if [ "${ns1_addr6}" != "-" ]; then 118*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns1} ip addr add dev ${ns1_dev} ${ns1_addr6} 119*053f45beSAndroid Build Coastguard Worker fi 120*053f45beSAndroid Build Coastguard Worker 121*053f45beSAndroid Build Coastguard Worker if [ "${ns2_addr6}" != "-" ]; then 122*053f45beSAndroid Build Coastguard Worker ip netns exec ${ns2} ip addr add dev ${ns2_dev} ${ns2_addr6} 123*053f45beSAndroid Build Coastguard Worker fi 124*053f45beSAndroid Build Coastguard Worker} 125*053f45beSAndroid Build Coastguard Worker 126*053f45beSAndroid Build Coastguard Worker################################################################################ 127*053f45beSAndroid Build Coastguard Worker# traceroute6 test 128*053f45beSAndroid Build Coastguard Worker# 129*053f45beSAndroid Build Coastguard Worker# Verify that in this scenario 130*053f45beSAndroid Build Coastguard Worker# 131*053f45beSAndroid Build Coastguard Worker# ------------------------ N2 132*053f45beSAndroid Build Coastguard Worker# | | 133*053f45beSAndroid Build Coastguard Worker# ------ ------ N3 ---- 134*053f45beSAndroid Build Coastguard Worker# | R1 | | R2 |------|H2| 135*053f45beSAndroid Build Coastguard Worker# ------ ------ ---- 136*053f45beSAndroid Build Coastguard Worker# | | 137*053f45beSAndroid Build Coastguard Worker# ------------------------ N1 138*053f45beSAndroid Build Coastguard Worker# | 139*053f45beSAndroid Build Coastguard Worker# ---- 140*053f45beSAndroid Build Coastguard Worker# |H1| 141*053f45beSAndroid Build Coastguard Worker# ---- 142*053f45beSAndroid Build Coastguard Worker# 143*053f45beSAndroid Build Coastguard Worker# where H1's default route goes through R1 and R1's default route goes 144*053f45beSAndroid Build Coastguard Worker# through R2 over N2, traceroute6 from H1 to H2 reports R2's address 145*053f45beSAndroid Build Coastguard Worker# on N2 and not N1. 146*053f45beSAndroid Build Coastguard Worker# 147*053f45beSAndroid Build Coastguard Worker# Addresses are assigned as follows: 148*053f45beSAndroid Build Coastguard Worker# 149*053f45beSAndroid Build Coastguard Worker# N1: 2000:101::/64 150*053f45beSAndroid Build Coastguard Worker# N2: 2000:102::/64 151*053f45beSAndroid Build Coastguard Worker# N3: 2000:103::/64 152*053f45beSAndroid Build Coastguard Worker# 153*053f45beSAndroid Build Coastguard Worker# R1's host part of address: 1 154*053f45beSAndroid Build Coastguard Worker# R2's host part of address: 2 155*053f45beSAndroid Build Coastguard Worker# H1's host part of address: 3 156*053f45beSAndroid Build Coastguard Worker# H2's host part of address: 4 157*053f45beSAndroid Build Coastguard Worker# 158*053f45beSAndroid Build Coastguard Worker# For example: 159*053f45beSAndroid Build Coastguard Worker# the IPv6 address of R1's interface on N2 is 2000:102::1/64 160*053f45beSAndroid Build Coastguard Worker 161*053f45beSAndroid Build Coastguard Workercleanup_traceroute6() 162*053f45beSAndroid Build Coastguard Worker{ 163*053f45beSAndroid Build Coastguard Worker local ns 164*053f45beSAndroid Build Coastguard Worker 165*053f45beSAndroid Build Coastguard Worker for ns in host-1 host-2 router-1 router-2 166*053f45beSAndroid Build Coastguard Worker do 167*053f45beSAndroid Build Coastguard Worker ip netns del ${ns} 2>/dev/null 168*053f45beSAndroid Build Coastguard Worker done 169*053f45beSAndroid Build Coastguard Worker} 170*053f45beSAndroid Build Coastguard Worker 171*053f45beSAndroid Build Coastguard Workersetup_traceroute6() 172*053f45beSAndroid Build Coastguard Worker{ 173*053f45beSAndroid Build Coastguard Worker brdev=br0 174*053f45beSAndroid Build Coastguard Worker 175*053f45beSAndroid Build Coastguard Worker # start clean 176*053f45beSAndroid Build Coastguard Worker cleanup_traceroute6 177*053f45beSAndroid Build Coastguard Worker 178*053f45beSAndroid Build Coastguard Worker set -e 179*053f45beSAndroid Build Coastguard Worker create_ns host-1 180*053f45beSAndroid Build Coastguard Worker create_ns host-2 181*053f45beSAndroid Build Coastguard Worker create_ns router-1 182*053f45beSAndroid Build Coastguard Worker create_ns router-2 183*053f45beSAndroid Build Coastguard Worker 184*053f45beSAndroid Build Coastguard Worker # Setup N3 185*053f45beSAndroid Build Coastguard Worker connect_ns router-2 eth3 - 2000:103::2/64 host-2 eth3 - 2000:103::4/64 186*053f45beSAndroid Build Coastguard Worker ip netns exec host-2 ip route add default via 2000:103::2 187*053f45beSAndroid Build Coastguard Worker 188*053f45beSAndroid Build Coastguard Worker # Setup N2 189*053f45beSAndroid Build Coastguard Worker connect_ns router-1 eth2 - 2000:102::1/64 router-2 eth2 - 2000:102::2/64 190*053f45beSAndroid Build Coastguard Worker ip netns exec router-1 ip route add default via 2000:102::2 191*053f45beSAndroid Build Coastguard Worker 192*053f45beSAndroid Build Coastguard Worker # Setup N1. host-1 and router-2 connect to a bridge in router-1. 193*053f45beSAndroid Build Coastguard Worker ip netns exec router-1 ip link add name ${brdev} type bridge 194*053f45beSAndroid Build Coastguard Worker ip netns exec router-1 ip link set ${brdev} up 195*053f45beSAndroid Build Coastguard Worker ip netns exec router-1 ip addr add 2000:101::1/64 dev ${brdev} 196*053f45beSAndroid Build Coastguard Worker 197*053f45beSAndroid Build Coastguard Worker connect_ns host-1 eth0 - 2000:101::3/64 router-1 eth0 - - 198*053f45beSAndroid Build Coastguard Worker ip netns exec router-1 ip link set dev eth0 master ${brdev} 199*053f45beSAndroid Build Coastguard Worker ip netns exec host-1 ip route add default via 2000:101::1 200*053f45beSAndroid Build Coastguard Worker 201*053f45beSAndroid Build Coastguard Worker connect_ns router-2 eth1 - 2000:101::2/64 router-1 eth1 - - 202*053f45beSAndroid Build Coastguard Worker ip netns exec router-1 ip link set dev eth1 master ${brdev} 203*053f45beSAndroid Build Coastguard Worker 204*053f45beSAndroid Build Coastguard Worker # Prime the network 205*053f45beSAndroid Build Coastguard Worker ip netns exec host-1 ping6 -c5 2000:103::4 >/dev/null 2>&1 206*053f45beSAndroid Build Coastguard Worker 207*053f45beSAndroid Build Coastguard Worker set +e 208*053f45beSAndroid Build Coastguard Worker} 209*053f45beSAndroid Build Coastguard Worker 210*053f45beSAndroid Build Coastguard Workerrun_traceroute6() 211*053f45beSAndroid Build Coastguard Worker{ 212*053f45beSAndroid Build Coastguard Worker if [ ! -x "$(command -v traceroute6)" ]; then 213*053f45beSAndroid Build Coastguard Worker echo "SKIP: Could not run IPV6 test without traceroute6" 214*053f45beSAndroid Build Coastguard Worker return 215*053f45beSAndroid Build Coastguard Worker fi 216*053f45beSAndroid Build Coastguard Worker 217*053f45beSAndroid Build Coastguard Worker setup_traceroute6 218*053f45beSAndroid Build Coastguard Worker 219*053f45beSAndroid Build Coastguard Worker # traceroute6 host-2 from host-1 (expects 2000:102::2) 220*053f45beSAndroid Build Coastguard Worker run_cmd host-1 "traceroute6 2000:103::4 | grep -q 2000:102::2" 221*053f45beSAndroid Build Coastguard Worker log_test $? 0 "IPV6 traceroute" 222*053f45beSAndroid Build Coastguard Worker 223*053f45beSAndroid Build Coastguard Worker cleanup_traceroute6 224*053f45beSAndroid Build Coastguard Worker} 225*053f45beSAndroid Build Coastguard Worker 226*053f45beSAndroid Build Coastguard Worker################################################################################ 227*053f45beSAndroid Build Coastguard Worker# traceroute test 228*053f45beSAndroid Build Coastguard Worker# 229*053f45beSAndroid Build Coastguard Worker# Verify that traceroute from H1 to H2 shows 1.0.1.1 in this scenario 230*053f45beSAndroid Build Coastguard Worker# 231*053f45beSAndroid Build Coastguard Worker# 1.0.3.1/24 232*053f45beSAndroid Build Coastguard Worker# ---- 1.0.1.3/24 1.0.1.1/24 ---- 1.0.2.1/24 1.0.2.4/24 ---- 233*053f45beSAndroid Build Coastguard Worker# |H1|--------------------------|R1|--------------------------|H2| 234*053f45beSAndroid Build Coastguard Worker# ---- N1 ---- N2 ---- 235*053f45beSAndroid Build Coastguard Worker# 236*053f45beSAndroid Build Coastguard Worker# where net.ipv4.icmp_errors_use_inbound_ifaddr is set on R1 and 237*053f45beSAndroid Build Coastguard Worker# 1.0.3.1/24 and 1.0.1.1/24 are respectively R1's primary and secondary 238*053f45beSAndroid Build Coastguard Worker# address on N1. 239*053f45beSAndroid Build Coastguard Worker# 240*053f45beSAndroid Build Coastguard Worker 241*053f45beSAndroid Build Coastguard Workercleanup_traceroute() 242*053f45beSAndroid Build Coastguard Worker{ 243*053f45beSAndroid Build Coastguard Worker local ns 244*053f45beSAndroid Build Coastguard Worker 245*053f45beSAndroid Build Coastguard Worker for ns in host-1 host-2 router 246*053f45beSAndroid Build Coastguard Worker do 247*053f45beSAndroid Build Coastguard Worker ip netns del ${ns} 2>/dev/null 248*053f45beSAndroid Build Coastguard Worker done 249*053f45beSAndroid Build Coastguard Worker} 250*053f45beSAndroid Build Coastguard Worker 251*053f45beSAndroid Build Coastguard Workersetup_traceroute() 252*053f45beSAndroid Build Coastguard Worker{ 253*053f45beSAndroid Build Coastguard Worker # start clean 254*053f45beSAndroid Build Coastguard Worker cleanup_traceroute 255*053f45beSAndroid Build Coastguard Worker 256*053f45beSAndroid Build Coastguard Worker set -e 257*053f45beSAndroid Build Coastguard Worker create_ns host-1 258*053f45beSAndroid Build Coastguard Worker create_ns host-2 259*053f45beSAndroid Build Coastguard Worker create_ns router 260*053f45beSAndroid Build Coastguard Worker 261*053f45beSAndroid Build Coastguard Worker connect_ns host-1 eth0 1.0.1.3/24 - \ 262*053f45beSAndroid Build Coastguard Worker router eth1 1.0.3.1/24 - 263*053f45beSAndroid Build Coastguard Worker ip netns exec host-1 ip route add default via 1.0.1.1 264*053f45beSAndroid Build Coastguard Worker 265*053f45beSAndroid Build Coastguard Worker ip netns exec router ip addr add 1.0.1.1/24 dev eth1 266*053f45beSAndroid Build Coastguard Worker ip netns exec router sysctl -qw \ 267*053f45beSAndroid Build Coastguard Worker net.ipv4.icmp_errors_use_inbound_ifaddr=1 268*053f45beSAndroid Build Coastguard Worker 269*053f45beSAndroid Build Coastguard Worker connect_ns host-2 eth0 1.0.2.4/24 - \ 270*053f45beSAndroid Build Coastguard Worker router eth2 1.0.2.1/24 - 271*053f45beSAndroid Build Coastguard Worker ip netns exec host-2 ip route add default via 1.0.2.1 272*053f45beSAndroid Build Coastguard Worker 273*053f45beSAndroid Build Coastguard Worker # Prime the network 274*053f45beSAndroid Build Coastguard Worker ip netns exec host-1 ping -c5 1.0.2.4 >/dev/null 2>&1 275*053f45beSAndroid Build Coastguard Worker 276*053f45beSAndroid Build Coastguard Worker set +e 277*053f45beSAndroid Build Coastguard Worker} 278*053f45beSAndroid Build Coastguard Worker 279*053f45beSAndroid Build Coastguard Workerrun_traceroute() 280*053f45beSAndroid Build Coastguard Worker{ 281*053f45beSAndroid Build Coastguard Worker if [ ! -x "$(command -v traceroute)" ]; then 282*053f45beSAndroid Build Coastguard Worker echo "SKIP: Could not run IPV4 test without traceroute" 283*053f45beSAndroid Build Coastguard Worker return 284*053f45beSAndroid Build Coastguard Worker fi 285*053f45beSAndroid Build Coastguard Worker 286*053f45beSAndroid Build Coastguard Worker setup_traceroute 287*053f45beSAndroid Build Coastguard Worker 288*053f45beSAndroid Build Coastguard Worker # traceroute host-2 from host-1 (expects 1.0.1.1). Takes a while. 289*053f45beSAndroid Build Coastguard Worker run_cmd host-1 "traceroute 1.0.2.4 | grep -q 1.0.1.1" 290*053f45beSAndroid Build Coastguard Worker log_test $? 0 "IPV4 traceroute" 291*053f45beSAndroid Build Coastguard Worker 292*053f45beSAndroid Build Coastguard Worker cleanup_traceroute 293*053f45beSAndroid Build Coastguard Worker} 294*053f45beSAndroid Build Coastguard Worker 295*053f45beSAndroid Build Coastguard Worker################################################################################ 296*053f45beSAndroid Build Coastguard Worker# Run tests 297*053f45beSAndroid Build Coastguard Worker 298*053f45beSAndroid Build Coastguard Workerrun_tests() 299*053f45beSAndroid Build Coastguard Worker{ 300*053f45beSAndroid Build Coastguard Worker run_traceroute6 301*053f45beSAndroid Build Coastguard Worker run_traceroute 302*053f45beSAndroid Build Coastguard Worker} 303*053f45beSAndroid Build Coastguard Worker 304*053f45beSAndroid Build Coastguard Worker################################################################################ 305*053f45beSAndroid Build Coastguard Worker# main 306*053f45beSAndroid Build Coastguard Worker 307*053f45beSAndroid Build Coastguard Workerdeclare -i nfail=0 308*053f45beSAndroid Build Coastguard Workerdeclare -i nsuccess=0 309*053f45beSAndroid Build Coastguard Worker 310*053f45beSAndroid Build Coastguard Workerwhile getopts :pv o 311*053f45beSAndroid Build Coastguard Workerdo 312*053f45beSAndroid Build Coastguard Worker case $o in 313*053f45beSAndroid Build Coastguard Worker p) PAUSE_ON_FAIL=yes;; 314*053f45beSAndroid Build Coastguard Worker v) VERBOSE=$(($VERBOSE + 1));; 315*053f45beSAndroid Build Coastguard Worker *) exit 1;; 316*053f45beSAndroid Build Coastguard Worker esac 317*053f45beSAndroid Build Coastguard Workerdone 318*053f45beSAndroid Build Coastguard Worker 319*053f45beSAndroid Build Coastguard Workerrun_tests 320*053f45beSAndroid Build Coastguard Worker 321*053f45beSAndroid Build Coastguard Workerprintf "\nTests passed: %3d\n" ${nsuccess} 322*053f45beSAndroid Build Coastguard Workerprintf "Tests failed: %3d\n" ${nfail} 323