| #!/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}" |