Lines Matching +full:rx +full:- +full:eq

2 # SPDX-License-Identifier: GPL-2.0
46 declare -A all_tests
47 declare -a only_tests_ids
48 declare -a only_tests_names
49 declare -A failed_tests
102 ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true
104 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
120 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
121 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
122 ip -net "$ns1" link set ns1eth$i up
124 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
125 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
126 ip -net "$ns2" link set ns2eth$i up
129 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
130 ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i
138 tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1ms
139 tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1ms
145 rm -f "$capout"
174 rm -f "$cin" "$cout" "$sinfail"
175 rm -f "$sin" "$sout" "$cinsent" "$cinfail"
176 rm -f "$tmpfile"
177 rm -rf $evts_ns1 $evts_ns2
178 rm -f "$err"
184 printf "%-${nr_blank}s%-36s" " " "${*}"
190 [ -z "${1}" ] && return
229 local msg="${1:-"Feature not supported"}"
250 if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0 ]; then
256 if [ "$((MPTCP_LIB_TEST_COUNTER+1))" -eq "${i}" ]; then
271 if [ ${last_test_failed} -eq 1 ]; then
273 elif [ ${last_test_skipped} -eq 1 ]; then
275 elif [ ${last_test_ignored} -ne 1 ]; then
319 if ! nstat -asz "${counter}" | grep -wq "${counter}"; then
332 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
339 local ip="${2:-4}"
345 if [ $ip -eq 6 ]; then
349 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
351 if ! ip netns exec $ns2 $tables -A OUTPUT -p tcp \
352 -m tcp --tcp-option 30 \
353 -m bpf --bytecode \
355 -j DROP; then
369 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
370 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
382 ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
383 ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
388 # This rule inverts a 8-bit word at byte offset 148 for the 2nd TCP ACK packets
407 local ip="${2:-4}"
411 if [ $ip -eq 6 ]; then
416 -t mangle \
417 -A OUTPUT \
418 -o ns2eth$i \
419 -p tcp \
420 -m length --length 150:9999 \
421 -m statistic --mode nth --packet 1 --every 99999 \
422 -j MARK --set-mark 42 || return ${KSFT_SKIP}
424 tc -n $ns2 qdisc add dev ns2eth$i clsact || return ${KSFT_SKIP}
425 tc -n $ns2 filter add dev ns2eth$i egress \
438 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=1
439 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=1
444 if [ ${rc} -eq ${KSFT_SKIP} ]; then
471 local chain="${4:-INPUT}"
474 -A "${chain}" \
475 -s "${src}" \
476 -p tcp \
477 -j "${target}"; then
490 if [ ${#} -gt 0 ]; then
495 if [ ${last_test_failed} -eq 0 ]; then
508 done | sort -n
520 if [ -n "$bytes" ]; then
523 out_size=$(wc -c $out | awk '{print $1}')
524 if [ $out_size -ne $bytes ]; then
529 # note: BusyBox's "cmp" command doesn't support --bytes
531 head --bytes="$bytes" "$in" > "$tmpfile"
533 head --bytes="$bytes" "$out" > "$tmpfile"
537 cmp -l "$in" "$out" | while read -r i a b; do
539 if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then
559 if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then
560 fail_test "$listener_ns -> $connect_addr connectivity"
568 if [ -z "$FAILING_LINKS" ]; then
576 ip -net "$ns" link set "$veth" down
683 while [ -n "$1" ]; do
696 if [ -z "${id}" ]; then
697 fail_test "bad test - missing endpoint id"
712 local addr_nr_ns1=${addr_nr_ns1:-0}
713 local addr_nr_ns2=${addr_nr_ns2:-0}
714 local sflags=${sflags:-""}
715 local fullmesh=${fullmesh:-""}
718 if [ -n "${fullmesh}" ]; then
729 if [ $addr_nr_ns1 -gt 0 ]; then
733 while [ $add_nr_ns1 -gt 0 ]; do
742 add_nr_ns1=$((add_nr_ns1 - 1))
745 elif [ $addr_nr_ns1 -lt 0 ]; then
746 local rm_nr_ns1=$((-addr_nr_ns1))
747 if [ $rm_nr_ns1 -lt 8 ]; then
750 pm_nl_show_endpoints ${listener_ns} | while read -r line; do
758 if [ $counter -eq $rm_nr_ns1 ]; then
770 elif [ $rm_nr_ns1 -eq 8 ]; then
772 elif [ $rm_nr_ns1 -eq 9 ]; then
779 [ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1
781 if [ $addr_nr_ns2 -gt 0 ]; then
785 while [ $add_nr_ns2 -gt 0 ]; do
794 add_nr_ns2=$((add_nr_ns2 - 1))
797 elif [ $addr_nr_ns2 -lt 0 ]; then
798 local rm_nr_ns2=$((-addr_nr_ns2))
799 if [ $rm_nr_ns2 -lt 8 ]; then
802 pm_nl_show_endpoints ${connector_ns} | while read -r line; do
810 if [ $counter -eq $rm_nr_ns2 ]; then
825 elif [ $rm_nr_ns2 -eq 8 ]; then
827 elif [ $rm_nr_ns2 -eq 9 ]; then
838 if [ -n "${sflags}" ]; then
844 pm_nl_show_endpoints $netns | while read -r line; do
871 if [ -z "$count" ]; then
883 if [ -n "${cestab_ns1}" ]; then
886 if [ -n "${cestab_ns2}" ]; then
899 if [ -z $SUDO_USER ]; then
902 capuser="-Z $SUDO_USER"
905 capfile=$(printf "mp_join-%02u-%s.pcap" "$MPTCP_LIB_TEST_COUNTER" "$ns")
908 ip netns exec "$ns" tcpdump -i any -s 65535 -B 32768 $capuser -w "$capfile" > "$capout" 2>&1 &
926 echo "$((10000 + MPTCP_LIB_TEST_COUNTER - 1))"
938 local FAILING_LINKS=${FAILING_LINKS:-""}
939 local fastclose=${fastclose:-""}
940 local speed=${speed:-"fast"}
949 nstat -n
951 nstat -n
955 extra_args="-j"
957 extra_args="-r 50"
958 elif [ $speed -gt 0 ]; then
959 extra_args="-r ${speed}"
965 if [ -n "${fastclose}" ]; then
966 if [ ${test_linkfail} -le 1 ]; then
976 extra_cl_args="-f ${test_linkfail}"
977 extra_srv_args="-f -1"
979 extra_srv_args="-f ${test_linkfail}"
980 extra_cl_args="-f -1"
988 if [ "$test_linkfail" -gt 1 ];then
991 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
996 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
1004 if [ "$test_linkfail" -eq 0 ];then
1007 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1009 elif [ "$test_linkfail" -eq 1 ] || [ "$test_linkfail" -eq 2 ];then
1014 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1020 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1040 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
1042 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
1043 ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port"
1045 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
1046 ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"
1052 if [ "$test_linkfail" -gt 1 ];then
1058 if [ "$test_linkfail" -eq 0 ];then
1065 [ $retc -eq 0 ] && [ $rets -eq 0 ]
1086 local test_linkfail=${test_linkfail:-0}
1090 if [ "$test_linkfail" -gt 2 ]; then
1093 if [ -z "$cinfail" ]; then
1099 elif [ "$test_linkfail" -ne 0 ] && [ -z "$cinfail" ]; then
1112 if [ "$test_linkfail" -gt 2 ]; then
1115 if [ -z "$sinfail" ]; then
1119 elif [ "$test_linkfail" -eq 2 ] && [ -z "$sinfail" ]; then
1134 ip netns exec $ns1 nstat -as | grep Tcp
1136 ip netns exec $ns2 nstat -as | grep Tcp
1141 local csum_ns1=${1:-0}
1142 local csum_ns2=${2:-0}
1159 if [ -n "$count" ] && [ "$count" != "$csum_ns1" ]; then
1162 if [ -z "$count" ]; then
1164 elif { [ "$count" != $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 0 ]; } ||
1165 { [ "$count" -lt $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 1 ]; }; then
1173 if [ -n "$count" ] && [ "$count" != "$csum_ns2" ]; then
1176 if [ -z "$count" ]; then
1178 elif { [ "$count" != $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 0 ]; } ||
1179 { [ "$count" -lt $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 1 ]; }; then
1192 local ns_invert=${3:-""}
1197 local rx="client"
1206 rx="server"
1209 if [[ "${fail_tx}" = "-"* ]]; then
1213 if [[ "${fail_rx}" = "-"* ]]; then
1220 if [ -n "$count" ] && [ "$count" != "$fail_tx" ]; then
1223 if [ -z "$count" ]; then
1225 elif { [ "$count" != "$fail_tx" ] && [ $allow_tx_lost -eq 0 ]; } ||
1226 { [ "$count" -gt "$fail_tx" ] && [ $allow_tx_lost -eq 1 ]; }; then
1232 print_check "fail rx ${rx}"
1234 if [ -n "$count" ] && [ "$count" != "$fail_rx" ]; then
1235 extra_msg+=" rx=$count"
1237 if [ -z "$count" ]; then
1239 elif { [ "$count" != "$fail_rx" ] && [ $allow_rx_lost -eq 0 ]; } ||
1240 { [ "$count" -gt "$fail_rx" ] && [ $allow_rx_lost -eq 1 ]; }; then
1241 fail_test "got $count MP_FAIL[s] RX expected $fail_rx"
1258 local rx="server"
1264 rx="client"
1269 if [ -z "$count" ]; then
1277 print_check "fast close rx ${rx}"
1279 if [ -z "$count" ]; then
1282 fail_test "got $count MP_FASTCLOSE[s] RX expected $fclose_rx"
1292 local ns_invert=${3:-""}
1297 local rx="client"
1303 rx="server"
1308 if [ -z "$count" ]; then
1311 elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } ||
1312 { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then
1318 print_check "reset rx ${rx}"
1320 if [ -z "$count" ]; then
1323 elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } ||
1324 { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then
1325 fail_test "got $count MP_RST[s] RX expected $rst_rx"
1339 if [ -z "$count" ]; then
1347 print_check "infi rx server"
1349 if [ -z "$count" ]; then
1352 fail_test "got $count infinite map[s] RX expected $infi_rx"
1360 local syn_tx=${join_syn_tx:-0}
1361 local create=${join_create_err:-0}
1362 local bind=${join_bind_err:-0}
1363 local connect=${join_connect_err:-0}
1368 if [ -z "$count" ]; then
1377 if [ -z "$count" ]; then
1386 if [ -z "$count" ]; then
1395 if [ -z "$count" ]; then
1411 local csum_ns1=${join_csum_ns1:-0}
1412 local csum_ns2=${join_csum_ns2:-0}
1413 local fail_nr=${join_fail_nr:-0}
1414 local rst_nr=${join_rst_nr:-0}
1415 local infi_nr=${join_infi_nr:-0}
1416 local corrupted_pkts=${join_corrupted_pkts:-0}
1421 if [ "${corrupted_pkts}" -gt 0 ]; then
1426 if [ -z "$count" ]; then
1430 print_check "syn rx"
1431 fail_test "got $count JOIN[s] syn rx expected $syn_nr"
1434 with_cookie=$(ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies)
1436 if [ -z "$count" ]; then
1442 if [ "$with_cookie" != 2 ] || [ "$count" -le "$syn_ack_nr" ] || [ "$count" -gt "$syn_nr" ]; then
1444 print_check "synack rx"
1445 fail_test "got $count JOIN[s] synack rx expected $syn_ack_nr"
1450 if [ -z "$count" ]; then
1454 print_check "ack rx"
1455 fail_test "got $count JOIN[s] ack rx expected $ack_nr"
1458 print_results "join Rx" ${rc}
1460 join_syn_tx="${join_syn_tx:-${syn_nr}}" \
1473 # - as these tests do - we can have a quite high number of
1475 # sleep duration/ MPTCP-level RTX interval.
1490 if [ -z "$stale_nr" ] || [ -z "$recover_nr" ]; then
1492 elif [ $stale_nr -lt $stale_min ] ||
1493 { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } ||
1494 [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then
1497 " stale-recover delta $stale_delta"
1505 ip netns exec $ns ip -s link show
1506 ip netns exec $ns nstat -as | grep MPTcp
1514 local port_nr=${3:-0}
1515 local ns_invert=${4:-""}
1524 local rx=""
1532 rx=" server"
1535 timeout=$(ip netns exec ${ns_tx} sysctl -n net.mptcp.add_addr_timeout)
1537 print_check "add addr rx${rx}"
1539 if [ -z "$count" ]; then
1543 elif [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then
1549 print_check "add addr echo rx${tx}"
1551 if [ -z "$count" ]; then
1559 if [ $port_nr -gt 0 ]; then
1560 print_check "add addr rx with port${rx}"
1562 if [ -z "$count" ]; then
1565 fail_test "got $count ADD_ADDR[s] with a port-number expected $port_nr"
1570 print_check "syn rx port${tx}"
1572 if [ -z "$count" ]; then
1576 port-number expected $syn_nr"
1581 print_check "synack rx port${rx}"
1583 if [ -z "$count" ]; then
1587 port-number expected $syn_ack_nr"
1592 print_check "ack rx port${tx}"
1594 if [ -z "$count" ]; then
1598 port-number expected $ack_nr"
1603 print_check "syn rx port mismatch${tx}"
1605 if [ -z "$count" ]; then
1609 port-number expected $mis_syn_nr"
1614 print_check "ack rx port mismatch${tx}"
1616 if [ -z "$count" ]; then
1620 port-number expected $mis_ack_nr"
1634 timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout)
1638 if [ -z "$count" ]; then
1642 …elif [ "$count" != "$add_tx_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_tx_nr" ]; }; t…
1650 if [ -z "$count" ]; then
1673 while [ -n "$1" ]; do
1686 print_check "rm addr rx ${addr}"
1688 if [ -z "$count" ]; then
1698 if [ -z "$count" ]; then
1700 elif [ -n "$simult" ]; then
1712 if [ $count -ge "$rm_subflow_nr" ] && \
1713 [ "$count" -le "$((rm_subflow_nr *2 ))" ]; then
1733 if [ -z "$count" ]; then
1752 if [ -z "$count" ]; then
1760 print_check "mp_prio rx client"
1762 if [ -z "$count" ]; then
1765 fail_test "got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
1772 if [ -z "$count" ]; then
1782 if [ -z "$count" ]; then
1801 cnt1=$(ss -N $ns1 -tOni | grep -c token)
1802 cnt2=$(ss -N $ns2 -tOni | grep -c token)
1811 ss -N $ns1 -tOni
1812 ss -N $ns1 -tOni | grep token
1813 ip -n $ns1 mptcp endpoint
1829 cnt1=$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value "$info1" "$info1")
1830 cnt2=$(ss -N $ns2 -inmHM | mptcp_lib_get_info_value "$info2" "$info2")
1832 [ -z "$cnt1" ] && cnt1=0
1833 [ -z "$cnt2" ] && cnt2=0
1843 ss -N $ns1 -inmHM
1844 ss -N $ns2 -inmHM
1858 if [ -n "$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value $info $info)" ]; then
1866 cnt1=$(ss -N $ns1 -ti state established state syn-sent state syn-recv |
1867 grep -c tcp-ulp-mptcp)
1868 cnt2=$(ss -N $ns2 -ti state established state syn-sent state syn-recv |
1869 grep -c tcp-ulp-mptcp)
1879 ss -N $ns1 -ti
1880 ss -N $ns2 -ti
1893 tx_total=$(stat --format=%s $out)
1898 if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \
1899 [ $tx_rate -gt $((expected_rate + tolerance)) ]; then
1912 while [ $time -lt $timeout_ms ]; do
1928 ip netns exec $ns sysctl -q net.mptcp.pm_type=1
2160 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
2186 # active backup and link switch-over.
2214 chk_stale_nr $ns2 1 -1 1
2260 chk_stale_nr $ns2 1 -1 2
2323 addr_nr_ns2=-1 speed=slow \
2337 addr_nr_ns2=-2 speed=slow \
2349 addr_nr_ns1=-1 speed=slow \
2363 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2378 addr_nr_ns1=-1 addr_nr_ns2=-2 speed=10 \
2393 addr_nr_ns1=-3 speed=10 \
2409 addr_nr_ns1=-3 speed=10 \
2425 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2440 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2460 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2475 addr_nr_ns1=-8 speed=slow \
2489 addr_nr_ns2=-9 speed=slow \
2501 addr_nr_ns1=-9 speed=slow \
2602 addr_nr_ns1=-1 speed=slow \
2615 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2625 # subflow IPv4-mapped to IPv4-mapped
2626 if reset "single subflow IPv4-mapped"; then
2634 # signal address IPv4-mapped with IPv4-mapped sk
2635 if reset "signal address IPv4-mapped"; then
2644 # subflow v4-map-v6
2645 if reset "single subflow v4-map-v6"; then
2653 # signal address v4-map-v6
2654 if reset "signal address v4-map-v6"; then
2663 # subflow v6-map-v4
2664 if reset "single subflow v6-map-v4"; then
2672 # signal address v6-map-v4
2673 if reset "signal address v6-map-v4"; then
2683 if reset "no JOIN with diff families v4-v6"; then
2692 if reset "no JOIN with diff families v4-v6-2"; then
2701 if reset "no JOIN with diff families v6-v4"; then
2828 # 10.0.2.2 (non-backup) -> 10.0.1.1 (backup)
2830 # 10.0.1.2 (backup) -> 10.0.2.1 (non-backup)
2832 ip -net "$ns2" route add 10.0.2.1 via 10.0.1.1 dev ns2eth1 # force this path
2905 if [ -z "$count" ]; then
2908 fail_test "got ${count} MPC attempt[s] on port-based endpoint, expected ${attempts}"
2944 addr_nr_ns1=-1 speed=slow \
2963 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2977 addr_nr_ns1=-8 addr_nr_ns2=-2 speed=slow \
3006 if reset "port-based signal endpoint must not accept mpc"; then
3015 ./mptcp_connect -t ${timeout_poll} -p $port -s MPTCP 10.0.2.1 >/dev/null 2>&1
3169 # 1 non-fullmesh addr in ns1, added during the connection.
3182 # 1 non-fullmesh addr in ns1, added before the connection,
3198 # 1 non-fullmesh addr in ns1, added before the connection,
3211 # 1 non-fullmesh addr in ns1, added before the connection,
3299 tc -n $ns2 -j -s action show action pedit index 100 | \
3314 chk_fail_nr 1 -1 invert
3320 tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5ms
3381 local t=${3:-1}
3387 [ -n "$(mptcp_lib_evts_get_info "saddr4" "$evts" $t)" ] && ip=4
3388 [ -n "$(mptcp_lib_evts_get_info "saddr6" "$evts" $t)" ] && ip=6
3408 if [ ${rc} -eq 2 ]; then
3410 elif [ ${rc} -eq 0 ]; then
3412 elif [ ${rc} -eq 1 ]; then
3493 count=$(grep -cw "type:${evt}" "${evts}")
3570 addr_nr_ns2=-1 speed=slow \
3738 if reset_with_tcp_filter "delete and re-add" ns2 10.0.3.2 REJECT OUTPUT &&
3762 chk_subflow_nr "after re-add id 2" 2
3770 ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT
3786 chk_subflow_nr "after re-add id 0 ($i)" 3
3813 # remove and re-add
3814 if reset_with_events "delete re-add signal" &&
3841 chk_subflow_nr "after re-add" 3
3851 chk_subflow_nr "after re-add ID 0" 3
3856 chk_subflow_nr "after re-delete ID 0" 2
3861 chk_subflow_nr "after re-re-add ID 0" 3
3887 # flush and re-add
3888 if reset_with_tcp_filter "flush re-add" ns2 10.0.3.2 REJECT OUTPUT &&
3906 ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT
3923 if [ -n "${1}" ]; then
3932 echo " -${key} ${all_tests[${key}]}"
3935 echo " -c capture pcap files"
3936 echo " -C enable data checksum"
3937 echo " -i use ip mptcp"
3938 echo " -h help"
4000 usage "Unknown option: -${opt}"
4005 shift $((OPTIND - 1))
4008 if [[ "${arg}" =~ ^[0-9]+$ ]]; then
4015 if [ ${#tests[@]} -eq 0 ]; then
4025 if [ ${ret} -ne 0 ]; then
4029 echo -e "\t- ${i}: ${failed_tests[${i}]}"