Commit d5149319 authored by Geliang Tang's avatar Geliang Tang
Browse files

selftests: mptcp: print test results with colors

mainline inclusion
from mainline-v6.9-rc1
commit 747ba8783a33fca6bad9b6c74280096ee93be9f2
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9VYQ9
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=747ba8783a33fca6bad9b6c74280096ee93be9f2



--------------------------------

To unify the output formats of all test scripts, this patch adds
four more helpers:

        mptcp_lib_pr_ok()
        mptcp_lib_pr_skip()
        mptcp_lib_pr_fail()
        mptcp_lib_pr_info()

to print out [ OK ], [SKIP], [FAIL] and 'INFO: ' with colors. Use them
in all scripts to print the "ok/skip/fail/info' using the same 'format'.

Having colors helps to quickly identify issues when looking at a long
list of output logs and results.

Note that now all print the same keywords, which was not the case
before, but it is good to uniform that.

rebased on: inet: implement lockless IP_TOS (Geliang)

Signed-off-by: default avatarGeliang Tang <tanggeliang@kylinos.cn>
Reviewed-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://lore.kernel.org/r/20240308-upstream-net-next-20240308-selftests-mptcp-unification-v1-9-4f42c347b653@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarJackie Liu <liuyun01@kylinos.cn>
Signed-off-by: default avatarGeliang Tang <tanggeliang@kylinos.cn>
parent 5e0cfb49
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -57,15 +57,15 @@ __chk_nr()
	mptcp_lib_print_title "$msg"
	if [ "$nr" != "$expected" ]; then
		if [ "$nr" = "$skip" ] && ! mptcp_lib_expect_all_features; then
			echo "[ skip ] Feature probably not supported"
			mptcp_lib_pr_skip "Feature probably not supported"
			mptcp_lib_result_skip "${msg}"
		else
			echo "[ fail ] expected $expected found $nr"
			mptcp_lib_pr_fail "expected $expected found $nr"
			mptcp_lib_result_fail "${msg}"
			ret=${KSFT_FAIL}
		fi
	else
		echo "[  ok  ]"
		mptcp_lib_pr_ok
		mptcp_lib_result_pass "${msg}"
	fi
}
@@ -114,15 +114,15 @@ wait_msk_nr()

	mptcp_lib_print_title "$msg"
	if [ $i -ge $timeout ]; then
		echo "[ fail ] timeout while expecting $expected max $max last $nr"
		mptcp_lib_pr_fail "timeout while expecting $expected max $max last $nr"
		mptcp_lib_result_fail "${msg} # timeout"
		ret=${KSFT_FAIL}
	elif [ $nr != $expected ]; then
		echo "[ fail ] expected $expected found $nr"
		mptcp_lib_pr_fail "expected $expected found $nr"
		mptcp_lib_result_fail "${msg} # unexpected result"
		ret=${KSFT_FAIL}
	else
		echo "[  ok  ]"
		mptcp_lib_pr_ok
		mptcp_lib_result_pass "${msg}"
	fi
}
+31 −31
Original line number Diff line number Diff line
@@ -218,7 +218,7 @@ set_ethtool_flags() {
	local flags="$3"

	if ip netns exec $ns ethtool -K $dev $flags 2>/dev/null; then
		echo "INFO: set $ns dev $dev: ethtool -K $flags"
		mptcp_lib_pr_info "set $ns dev $dev: ethtool -K $flags"
	fi
}

@@ -261,7 +261,7 @@ check_mptcp_disabled()
	print_larger_title "New MPTCP socket can be blocked via sysctl"
	# net.mptcp.enabled should be enabled by default
	if [ "$(ip netns exec ${disabled_ns} sysctl net.mptcp.enabled | awk '{ print $3 }')" -ne 1 ]; then
		echo -e "net.mptcp.enabled sysctl is not 1 by default\t\t[ FAIL ]"
		mptcp_lib_pr_fail "net.mptcp.enabled sysctl is not 1 by default"
		mptcp_lib_result_fail "net.mptcp.enabled sysctl is not 1 by default"
		ret=1
		return 1
@@ -274,13 +274,13 @@ check_mptcp_disabled()
	mptcp_lib_ns_exit "${disabled_ns}"

	if [ ${err} -eq 0 ]; then
		echo -e "New MPTCP socket cannot be blocked via sysctl\t\t[ FAIL ]"
		mptcp_lib_pr_fail "New MPTCP socket cannot be blocked via sysctl"
		mptcp_lib_result_fail "New MPTCP socket cannot be blocked via sysctl"
		ret=1
		return 1
	fi

	echo "[ OK ]"
	mptcp_lib_pr_ok
	mptcp_lib_result_pass "New MPTCP socket can be blocked via sysctl"
	return 0
}
@@ -301,7 +301,7 @@ do_ping()
	ip netns exec ${connector_ns} ping ${ping_args} $connect_addr >/dev/null || rc=1

	if [ $rc -ne 0 ] ; then
		echo "$listener_ns -> $connect_addr connectivity [ FAIL ]"
		mptcp_lib_pr_fail "$listener_ns -> $connect_addr connectivity"
		ret=1

		return 1
@@ -335,7 +335,7 @@ do_transfer()
	fi

	if [ -n "$extra_args" ] && $options_log; then
		echo "INFO: extra options: $extra_args"
		mptcp_lib_pr_info "extra options: $extra_args"
	fi
	options_log=false

@@ -434,7 +434,7 @@ do_transfer()
	result_msg+=" # time=${duration}ms"
	printf "(duration %05sms) " "${duration}"
	if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
		echo "[ FAIL ] client exit code $retc, server $rets" 1>&2
		mptcp_lib_pr_fail "client exit code $retc, server $rets"
		echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
		ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port"
		cat /tmp/${listener_ns}.out
@@ -479,14 +479,14 @@ do_transfer()
	fi

	if [ ${stat_synrx_now_l} -lt ${expect_synrx} ]; then
		printf "[ FAIL ] lower MPC SYN rx (%d) than expected (%d)\n" \
			"${stat_synrx_now_l}" "${expect_synrx}"
		mptcp_lib_pr_fail "lower MPC SYN rx (${stat_synrx_now_l})" \
				  "than expected (${expect_synrx})"
		retc=1
	fi
	if [ ${stat_ackrx_now_l} -lt ${expect_ackrx} ] && [ ${stat_ooo_now} -eq 0 ]; then
		if [ ${stat_ooo_now} -eq 0 ]; then
			printf "[ FAIL ] lower MPC ACK rx (%d) than expected (%d)\n" \
				"${stat_ackrx_now_l}" "${expect_ackrx}"
			mptcp_lib_pr_fail "lower MPC ACK rx (${stat_ackrx_now_l})" \
					  "than expected (${expect_ackrx})"
			rets=1
		else
			extra+=" [ Note ] fallback due to TCP OoO"
@@ -501,13 +501,13 @@ do_transfer()

		local csum_err_s_nr=$((csum_err_s - stat_csum_err_s))
		if [ $csum_err_s_nr -gt 0 ]; then
			printf "[ FAIL ]\nserver got %d data checksum error[s]" ${csum_err_s_nr}
			mptcp_lib_pr_fail "server got ${csum_err_s_nr} data checksum error[s]"
			rets=1
		fi

		local csum_err_c_nr=$((csum_err_c - stat_csum_err_c))
		if [ $csum_err_c_nr -gt 0 ]; then
			printf "[ FAIL ]\nclient got %d data checksum error[s]" ${csum_err_c_nr}
			mptcp_lib_pr_fail "client got ${csum_err_c_nr} data checksum error[s]"
			retc=1
		fi
	fi
@@ -543,11 +543,11 @@ do_transfer()
	fi

	if [ $retc -eq 0 ] && [ $rets -eq 0 ]; then
		printf "[ OK ]%s\n" "${extra}"
		mptcp_lib_pr_ok "${extra:1}"
		mptcp_lib_result_pass "${TEST_GROUP}: ${result_msg}"
	else
		if [ -n "${extra}" ]; then
			printf "%s\n" "${extra:1}"
			mptcp_lib_print_warn "${extra:1}"
		fi
		mptcp_lib_result_fail "${TEST_GROUP}: ${result_msg}"
	fi
@@ -677,7 +677,7 @@ run_test_transparent()
	# following function has been exported (T). Not great but better than
	# checking for a specific kernel version.
	if ! mptcp_lib_kallsyms_has "T __ip_sock_set_tos$"; then
		echo "INFO: ${msg} not supported by the kernel: SKIP"
		mptcp_lib_pr_skip "${msg} not supported by the kernel"
		mptcp_lib_result_skip "${TEST_GROUP}"
		return
	fi
@@ -694,7 +694,7 @@ table inet mangle {
}
EOF
	then
		echo "SKIP: $msg, could not load nft ruleset"
		mptcp_lib_pr_skip "$msg, could not load nft ruleset"
		mptcp_lib_fail_if_expected_feature "nft rules"
		mptcp_lib_result_skip "${TEST_GROUP}"
		return
@@ -710,7 +710,7 @@ EOF

	if ! ip -net "$listener_ns" $r6flag rule add fwmark 1 lookup 100; then
		ip netns exec "$listener_ns" nft flush ruleset
		echo "SKIP: $msg, ip $r6flag rule failed"
		mptcp_lib_pr_skip "$msg, ip $r6flag rule failed"
		mptcp_lib_fail_if_expected_feature "ip rule"
		mptcp_lib_result_skip "${TEST_GROUP}"
		return
@@ -719,13 +719,13 @@ EOF
	if ! ip -net "$listener_ns" route add local $local_addr/0 dev lo table 100; then
		ip netns exec "$listener_ns" nft flush ruleset
		ip -net "$listener_ns" $r6flag rule del fwmark 1 lookup 100
		echo "SKIP: $msg, ip route add local $local_addr failed"
		mptcp_lib_pr_skip "$msg, ip route add local $local_addr failed"
		mptcp_lib_fail_if_expected_feature "ip route"
		mptcp_lib_result_skip "${TEST_GROUP}"
		return
	fi

	echo "INFO: test $msg"
	mptcp_lib_pr_info "test $msg"

	port=$((20000 - 1))
	local extra_args="-o TRANSPARENT"
@@ -738,12 +738,12 @@ EOF
	ip -net "$listener_ns" route del local $local_addr/0 dev lo table 100

	if [ $lret -ne 0 ]; then
		echo "FAIL: $msg, mptcp connection error"
		mptcp_lib_pr_fail "$msg, mptcp connection error"
		ret=$lret
		return 1
	fi

	echo "PASS: $msg"
	mptcp_lib_pr_info "$msg pass"
	return 0
}

@@ -752,7 +752,7 @@ run_tests_peekmode()
	local peekmode="$1"

	TEST_GROUP="peek mode: ${peekmode}"
	echo "INFO: with peek mode: ${peekmode}"
	mptcp_lib_pr_info "with peek mode: ${peekmode}"
	run_tests_lo "$ns1" "$ns1" 10.0.1.1 1 "-P ${peekmode}"
	run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-P ${peekmode}"
}
@@ -762,12 +762,12 @@ run_tests_mptfo()
	TEST_GROUP="MPTFO"

	if ! mptcp_lib_kallsyms_has "mptcp_fastopen_"; then
		echo "INFO: TFO not supported by the kernel: SKIP"
		mptcp_lib_pr_skip "TFO not supported by the kernel"
		mptcp_lib_result_skip "${TEST_GROUP}"
		return
	fi

	echo "INFO: with MPTFO start"
	mptcp_lib_pr_info "with MPTFO start"
	ip netns exec "$ns1" sysctl -q net.ipv4.tcp_fastopen=2
	ip netns exec "$ns2" sysctl -q net.ipv4.tcp_fastopen=1

@@ -779,7 +779,7 @@ run_tests_mptfo()

	ip netns exec "$ns1" sysctl -q net.ipv4.tcp_fastopen=0
	ip netns exec "$ns2" sysctl -q net.ipv4.tcp_fastopen=0
	echo "INFO: with MPTFO end"
	mptcp_lib_pr_info "with MPTFO end"
}

run_tests_disconnect()
@@ -790,7 +790,7 @@ run_tests_disconnect()
	TEST_GROUP="full disconnect"

	if ! mptcp_lib_kallsyms_has "mptcp_pm_data_reset$"; then
		echo "INFO: Full disconnect not supported: SKIP"
		mptcp_lib_pr_skip "Full disconnect not supported"
		mptcp_lib_result_skip "${TEST_GROUP}"
		return
	fi
@@ -803,7 +803,7 @@ run_tests_disconnect()
	cin_disconnect="$old_cin"
	connect_per_transfer=3

	echo "INFO: disconnect"
	mptcp_lib_pr_info "disconnect"
	run_tests_lo "$ns1" "$ns1" 10.0.1.1 1 "-I 3 -i $old_cin"
	run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-I 3 -i $old_cin"

@@ -827,7 +827,7 @@ log_if_error()
	local msg="$1"

	if [ ${ret} -ne 0 ]; then
		echo "FAIL: ${msg}"
		mptcp_lib_pr_fail "${msg}"

		final_ret=${ret}
		ret=0
@@ -874,7 +874,7 @@ done
mptcp_lib_result_code "${ret}" "ping tests"

stop_if_error "Could not even run ping tests"
echo "[ OK ]"
mptcp_lib_pr_ok

[ -n "$tc_loss" ] && tc -net "$ns2" qdisc add dev ns2eth3 root netem loss random $tc_loss delay ${tc_delay}ms
tc_info="loss of $tc_loss "
@@ -899,7 +899,7 @@ elif [ "$reorder_delay" -gt 0 ];then
	tc_info+="$tc_reorder with delay ${reorder_delay}ms "
fi

echo "INFO: Using ${tc_info}on ns3eth4"
mptcp_lib_pr_info "Using ${tc_info}on ns3eth4"

tc -net "$ns3" qdisc add dev ns3eth4 root netem delay ${reorder_delay}ms $tc_reorder

+3 −3
Original line number Diff line number Diff line
@@ -185,17 +185,17 @@ print_info()

print_ok()
{
	mptcp_lib_print_ok "[ ok ]${1:+ ${*}}"
	mptcp_lib_pr_ok "${@}"
}

print_fail()
{
	mptcp_lib_print_err "[fail]${1:+ ${*}}"
	mptcp_lib_pr_fail "${@}"
}

print_skip()
{
	mptcp_lib_print_warn "[skip]${1:+ ${*}}"
	mptcp_lib_pr_skip "${@}"
}

# [ $1: fail msg ]
+27 −9
Original line number Diff line number Diff line
@@ -61,6 +61,23 @@ mptcp_lib_print_err() {
	mptcp_lib_print_color "${MPTCP_LIB_COLOR_RED}${*}"
}

# shellcheck disable=SC2120 # parameters are optional
mptcp_lib_pr_ok() {
	mptcp_lib_print_ok "[ OK ]${1:+ ${*}}"
}

mptcp_lib_pr_skip() {
	mptcp_lib_print_warn "[SKIP]${1:+ ${*}}"
}

mptcp_lib_pr_fail() {
	mptcp_lib_print_err "[FAIL]${1:+ ${*}}"
}

mptcp_lib_pr_info() {
	mptcp_lib_print_info "INFO: ${*}"
}

# SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var can be set when validating all
# features using the last version of the kernel and the selftests to make sure
# a test is not being skipped by mistake.
@@ -91,14 +108,14 @@ mptcp_lib_has_file() {

mptcp_lib_check_mptcp() {
	if ! mptcp_lib_has_file "/proc/sys/net/mptcp/enabled"; then
		echo "SKIP: MPTCP support is not available"
		mptcp_lib_pr_skip "MPTCP support is not available"
		exit ${KSFT_SKIP}
	fi
}

mptcp_lib_check_kallsyms() {
	if ! mptcp_lib_has_file "/proc/kallsyms"; then
		echo "SKIP: CONFIG_KALLSYMS is missing"
		mptcp_lib_pr_skip "CONFIG_KALLSYMS is missing"
		exit ${KSFT_SKIP}
	fi
}
@@ -305,7 +322,7 @@ mptcp_lib_check_transfer() {
	local what="${3}"

	if ! cmp "$in" "$out" > /dev/null 2>&1; then
		echo "[ FAIL ] $what does not match (in, out):"
		mptcp_lib_pr_fail "$what does not match (in, out):"
		mptcp_lib_print_file_err "$in"
		mptcp_lib_print_file_err "$out"

@@ -345,13 +362,13 @@ mptcp_lib_check_output() {
	fi

	if [ ${cmd_ret} -ne 0 ]; then
		mptcp_lib_print_err "[FAIL] command execution '${cmd}' stderr"
		mptcp_lib_pr_fail "command execution '${cmd}' stderr"
		cat "${err}"
		return 2
	elif [ "${out}" = "${expected}" ]; then
		return 0
	else
		mptcp_lib_print_err "[FAIL] expected '${expected}' got '${out}'"
		mptcp_lib_pr_fail "expected '${expected}' got '${out}'"
		return 1
	fi
}
@@ -363,29 +380,30 @@ mptcp_lib_check_tools() {
		case "${tool}" in
		"ip")
			if ! ip -Version &> /dev/null; then
				mptcp_lib_print_warn "SKIP: Could not run test without ip tool"
				mptcp_lib_pr_skip "Could not run test without ip tool"
				exit ${KSFT_SKIP}
			fi
			;;
		"ss")
			if ! ss -h | grep -q MPTCP; then
				mptcp_lib_print_warn "SKIP: ss tool does not support MPTCP"
				mptcp_lib_pr_skip "ss tool does not support MPTCP"
				exit ${KSFT_SKIP}
			fi
			;;
		"iptables"* | "ip6tables"*)
			if ! "${tool}" -V &> /dev/null; then
				mptcp_lib_print_warn "SKIP: Could not run all tests without ${tool}"
				mptcp_lib_pr_skip "Could not run all tests without ${tool}"
				exit ${KSFT_SKIP}
			fi
			;;
		*)
			mptcp_lib_print_err "Internal error: unsupported tool: ${tool}"
			mptcp_lib_pr_fail "Internal error: unsupported tool: ${tool}"
			exit ${KSFT_FAIL}
			;;
		esac
	done
}

mptcp_lib_ns_init() {
	local sec rndh

+14 −14
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ check_mark()
	local v
	for v in $values; do
		if [ $v -ne 0 ]; then
			echo "FAIL: got $tables $values in ns $ns," \
			mptcp_lib_pr_fail "got $tables $values in ns $ns," \
					  "not 0 - not all expected packets marked"
			ret=1
			return 1
@@ -169,7 +169,7 @@ do_transfer()

	print_title "Transfer ${ip:2}"
	if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
		echo "[FAIL] client exit code $retc, server $rets"
		mptcp_lib_pr_fail "client exit code $retc, server $rets"
		echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
		ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port"

@@ -184,7 +184,7 @@ do_transfer()
	if ! mptcp_lib_check_transfer $cin $sout "file received by server"; then
		rets=1
	else
		echo "[ OK ]"
		mptcp_lib_pr_ok
	fi
	mptcp_lib_result_code "${rets}" "transfer ${ip}"

@@ -200,10 +200,10 @@ do_transfer()
	mptcp_lib_result_code "${retc}" "mark ${ip}"

	if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
		echo "[ OK ]"
		mptcp_lib_pr_ok
		return 0
	fi
	echo "[FAIL]"
	mptcp_lib_pr_fail

	return 1
}
@@ -224,7 +224,7 @@ do_mptcp_sockopt_tests()
	local lret=0

	if ! mptcp_lib_kallsyms_has "mptcp_diag_fill_info$"; then
		echo "INFO: MPTCP sockopt not supported: SKIP"
		mptcp_lib_pr_skip "MPTCP sockopt not supported"
		mptcp_lib_result_skip "sockopt"
		return
	fi
@@ -234,12 +234,12 @@ do_mptcp_sockopt_tests()

	print_title "SOL_MPTCP sockopt v4"
	if [ $lret -ne 0 ]; then
		echo "[FAIL]"
		mptcp_lib_pr_fail
		mptcp_lib_result_fail "sockopt v4"
		ret=$lret
		return
	fi
	echo "[ OK ]"
	mptcp_lib_pr_ok
	mptcp_lib_result_pass "sockopt v4"

	ip netns exec "$ns_sbox" ./mptcp_sockopt -6
@@ -247,12 +247,12 @@ do_mptcp_sockopt_tests()

	print_title "SOL_MPTCP sockopt v6"
	if [ $lret -ne 0 ]; then
		echo "[FAIL]"
		mptcp_lib_pr_fail
		mptcp_lib_result_fail "sockopt v6"
		ret=$lret
		return
	fi
	echo "[ OK ]"
	mptcp_lib_pr_ok
	mptcp_lib_result_pass "sockopt v6"
}

@@ -280,12 +280,12 @@ do_tcpinq_test()
	local lret=$?
	if [ $lret -ne 0 ];then
		ret=$lret
		echo "[FAIL]"
		mptcp_lib_pr_fail
		mptcp_lib_result_fail "TCP_INQ: $*"
		return $lret
	fi

	echo "[ OK ]"
	mptcp_lib_pr_ok
	mptcp_lib_result_pass "TCP_INQ: $*"
	return $lret
}
@@ -295,7 +295,7 @@ do_tcpinq_tests()
	local lret=0

	if ! mptcp_lib_kallsyms_has "mptcp_ioctl$"; then
		echo "INFO: TCP_INQ not supported: SKIP"
		mptcp_lib_pr_skip "TCP_INQ not supported"
		mptcp_lib_result_skip "TCP_INQ"
		return
	fi
Loading