189 lines
5.2 KiB
Bash
Executable File
189 lines
5.2 KiB
Bash
Executable File
#!/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}"
|