blob: 44888f32b5130bfc6681291033bdbb880fad26fc [file] [log] [blame] [edit]
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# These tests verify basic set and get functionality of the team
# driver options over netlink.
# Run in private netns.
test_dir="$(dirname "$0")"
if [[ $# -eq 0 ]]; then
"${test_dir}"/../../../net/in_netns.sh "$0" __subprocess
exit $?
fi
ALL_TESTS="
team_test_options
"
source "${test_dir}/../../../net/lib.sh"
TEAM_PORT="team0"
MEMBER_PORT="dummy0"
setup()
{
ip link add name "${MEMBER_PORT}" type dummy
ip link add name "${TEAM_PORT}" type team
}
get_and_check_value()
{
local option_name="$1"
local expected_value="$2"
local port_flag="$3"
local value_from_get
if ! value_from_get=$(teamnl "${TEAM_PORT}" getoption "${option_name}" \
"${port_flag}"); then
echo "Could not get option '${option_name}'" >&2
return 1
fi
if [[ "${value_from_get}" != "${expected_value}" ]]; then
echo "Incorrect value for option '${option_name}'" >&2
echo "get (${value_from_get}) != set (${expected_value})" >&2
return 1
fi
}
set_and_check_get()
{
local option_name="$1"
local option_value="$2"
local port_flag="$3"
local value_from_get
if ! teamnl "${TEAM_PORT}" setoption "${option_name}" \
"${option_value}" "${port_flag}"; then
echo "'setoption ${option_name} ${option_value}' failed" >&2
return 1
fi
get_and_check_value "${option_name}" "${option_value}" "${port_flag}"
return $?
}
# Get a "port flag" to pass to the `teamnl` command.
# E.g. $1="dummy0" -> "port=dummy0",
# $1="" -> ""
get_port_flag()
{
local port_name="$1"
if [[ -n "${port_name}" ]]; then
echo "--port=${port_name}"
fi
}
attach_port_if_specified()
{
local port_name="$1"
if [[ -n "${port_name}" ]]; then
ip link set dev "${port_name}" master "${TEAM_PORT}"
return $?
fi
}
detach_port_if_specified()
{
local port_name="$1"
if [[ -n "${port_name}" ]]; then
ip link set dev "${port_name}" nomaster
return $?
fi
}
# Test that an option's get value matches its set value.
# Globals:
# RET - Used by testing infra like `check_err`.
# EXIT_STATUS - Used by `log_test` for whole script exit value.
# Arguments:
# option_name - The name of the option.
# value_1 - The first value to try setting.
# value_2 - The second value to try setting.
# port_name - The (optional) name of the attached port.
team_test_option()
{
local option_name="$1"
local value_1="$2"
local value_2="$3"
local possible_values="$2 $3 $2"
local port_name="$4"
local port_flag
RET=0
echo "Setting '${option_name}' to '${value_1}' and '${value_2}'"
attach_port_if_specified "${port_name}"
check_err $? "Couldn't attach ${port_name} to master"
port_flag=$(get_port_flag "${port_name}")
# Set and get both possible values.
for value in ${possible_values}; do
set_and_check_get "${option_name}" "${value}" "${port_flag}"
check_err $? "Failed to set '${option_name}' to '${value}'"
done
detach_port_if_specified "${port_name}"
check_err $? "Couldn't detach ${port_name} from its master"
log_test "Set + Get '${option_name}' test"
}
# Test that getting a non-existant option fails.
# Globals:
# RET - Used by testing infra like `check_err`.
# EXIT_STATUS - Used by `log_test` for whole script exit value.
# Arguments:
# option_name - The name of the option.
# port_name - The (optional) name of the attached port.
team_test_get_option_fails()
{
local option_name="$1"
local port_name="$2"
local port_flag
RET=0
attach_port_if_specified "${port_name}"
check_err $? "Couldn't attach ${port_name} to master"
port_flag=$(get_port_flag "${port_name}")
# Just confirm that getting the value fails.
teamnl "${TEAM_PORT}" getoption "${option_name}" "${port_flag}"
check_fail $? "Shouldn't be able to get option '${option_name}'"
detach_port_if_specified "${port_name}"
log_test "Get '${option_name}' fails"
}
team_test_options()
{
# Wrong option name behavior.
team_test_get_option_fails fake_option1
team_test_get_option_fails fake_option2 "${MEMBER_PORT}"
# Correct set and get behavior.
team_test_option mode activebackup loadbalance
team_test_option notify_peers_count 0 5
team_test_option notify_peers_interval 0 5
team_test_option mcast_rejoin_count 0 5
team_test_option mcast_rejoin_interval 0 5
team_test_option enabled true false "${MEMBER_PORT}"
team_test_option user_linkup true false "${MEMBER_PORT}"
team_test_option user_linkup_enabled true false "${MEMBER_PORT}"
team_test_option priority 10 20 "${MEMBER_PORT}"
team_test_option queue_id 0 1 "${MEMBER_PORT}"
}
require_command teamnl
setup
tests_run
exit "${EXIT_STATUS}"