218 lines · 4.0 KB · Shell
RawDownload
#!/bin/sh# SPDX-License-Identifier: GPL-2.0## OVS kernel module self tests # Kselftest framework requirement - SKIP code is 4.ksft_skip=4 PAUSE_ON_FAIL=noVERBOSE=0TRACING=0 tests="	netlink_checks				ovsnl: validate netlink attrs and settings" info() {    [ $VERBOSE = 0 ] || echo $*} ovs_base=`pwd`sbxs=sbx_add () {	info "adding sandbox '$1'" 	sbxs="$sbxs $1" 	NO_BIN=0 	# Create sandbox.	local d="$ovs_base"/$1	if [ -e $d ]; then		info "removing $d"		rm -rf "$d"	fi	mkdir "$d" || return 1	ovs_setenv $1} ovs_exit_sig() {	[ -e ${ovs_dir}/cleanup ] && . "$ovs_dir/cleanup"} on_exit() {	echo "$1" > ${ovs_dir}/cleanup.tmp	cat ${ovs_dir}/cleanup >> ${ovs_dir}/cleanup.tmp	mv ${ovs_dir}/cleanup.tmp ${ovs_dir}/cleanup} ovs_setenv() {	sandbox=$1 	ovs_dir=$ovs_base${1:+/$1}; export ovs_dir 	test -e ${ovs_dir}/cleanup || : > ${ovs_dir}/cleanup} ovs_sbx() {	if test "X$2" != X; then		(ovs_setenv $1; shift; "$@" >> ${ovs_dir}/debug.log)	else		ovs_setenv $1	fi} ovs_add_dp () {	info "Adding DP/Bridge IF: sbx:$1 dp:$2 {$3, $4, $5}"	sbxname="$1"	shift	ovs_sbx "$sbxname" python3 $ovs_base/ovs-dpctl.py add-dp $*	on_exit "ovs_sbx $sbxname python3 $ovs_base/ovs-dpctl.py del-dp $1;"} usage() {	echo	echo "$0 [OPTIONS] [TEST]..."	echo "If no TEST argument is given, all tests will be run."	echo	echo "Options"	echo "  -t: capture traffic via tcpdump"	echo "  -v: verbose"	echo "  -p: pause on failure"	echo	echo "Available tests${tests}"	exit 1} # netlink_validation# - Create a dp# - check no warning with "old version" simulationtest_netlink_checks () {	sbx_add "test_netlink_checks" || return 1 	info "setting up new DP"	ovs_add_dp "test_netlink_checks" nv0 || return 1	# now try again	PRE_TEST=$(dmesg | grep -E "RIP: [0-9a-fA-Fx]+:ovs_dp_cmd_new\+")	ovs_add_dp "test_netlink_checks" nv0 -V 0 || return 1	POST_TEST=$(dmesg | grep -E "RIP: [0-9a-fA-Fx]+:ovs_dp_cmd_new\+")	if [ "$PRE_TEST" != "$POST_TEST" ]; then		info "failed - gen warning"		return 1	fi 	return 0} run_test() {	(	tname="$1"	tdesc="$2" 	if ! lsmod | grep openvswitch >/dev/null 2>&1; then		stdbuf -o0 printf "TEST: %-60s  [NOMOD]\n" "${tdesc}"		return $ksft_skip	fi 	if python3 ovs-dpctl.py -h 2>&1 | \	     grep "Need to install the python" >/dev/null 2>&1; then		stdbuf -o0 printf "TEST: %-60s  [PYLIB]\n" "${tdesc}"		return $ksft_skip	fi	printf "TEST: %-60s  [START]\n" "${tname}" 	unset IFS 	eval test_${tname}	ret=$? 	if [ $ret -eq 0 ]; then		printf "TEST: %-60s  [ OK ]\n" "${tdesc}"		ovs_exit_sig		rm -rf "$ovs_dir"	elif [ $ret -eq 1 ]; then		printf "TEST: %-60s  [FAIL]\n" "${tdesc}"		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then			echo			echo "Pausing. Logs in $ovs_dir/. Hit enter to continue"			read a		fi		ovs_exit_sig		[ "${PAUSE_ON_FAIL}" = "yes" ] || rm -rf "$ovs_dir"		exit 1	elif [ $ret -eq $ksft_skip ]; then		printf "TEST: %-60s  [SKIP]\n" "${tdesc}"	elif [ $ret -eq 2 ]; then		rm -rf test_${tname}		run_test "$1" "$2"	fi 	return $ret	)	ret=$?	case $ret in		0)			[ $all_skipped = true ] && [ $exitcode=$ksft_skip ] && exitcode=0			all_skipped=false		;;		$ksft_skip)			[ $all_skipped = true ] && exitcode=$ksft_skip		;;		*)			all_skipped=false			exitcode=1		;;	esac 	return $ret}  exitcode=0desc=0all_skipped=true while getopts :pvt odo	case $o in	p) PAUSE_ON_FAIL=yes;;	v) VERBOSE=1;;	t) if which tcpdump > /dev/null 2>&1; then		TRACING=1	   else		echo "=== tcpdump not available, tracing disabled"	   fi	   ;;	*) usage;;	esacdoneshift $(($OPTIND-1)) IFS="	" for arg do	# Check first that all requested tests are available before running any	command -v > /dev/null "test_${arg}" || { echo "=== Test ${arg} not found"; usage; }done name=""desc=""for t in ${tests}; do	[ "${name}" = "" ]	&& name="${t}"	&& continue	[ "${desc}" = "" ]	&& desc="${t}" 	run_this=1	for arg do		[ "${arg}" != "${arg#--*}" ] && continue		[ "${arg}" = "${name}" ] && run_this=1 && break		run_this=0	done	if [ $run_this -eq 1 ]; then		run_test "${name}" "${desc}"	fi	name=""	desc=""done exit ${exitcode}