From e6834c5db6b38047edbb7ef8a159d2f269e43acc Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 18 Apr 2023 19:34:20 +0200 Subject: [PATCH] src/net: new test, basic bridge Signed-off-by: Joachim Wiberg --- src/net/test/Makefile.am | 1 + src/net/test/bridge.sh | 49 ++++++++++++++++++++ src/net/test/lib.sh | 96 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 144 insertions(+), 2 deletions(-) create mode 100755 src/net/test/bridge.sh diff --git a/src/net/test/Makefile.am b/src/net/test/Makefile.am index 640c757d..c0bbfca4 100644 --- a/src/net/test/Makefile.am +++ b/src/net/test/Makefile.am @@ -4,5 +4,6 @@ pkgdata_DATA = $(EXTRA_DIST) TEST_EXTENSIONS = .sh TESTS_ENVIRONMENT = unshare -mrun TESTS = three-independent.sh +TESTS += bridge.sh CLEANFILES = *~ *.trs *.log diff --git a/src/net/test/bridge.sh b/src/net/test/bridge.sh new file mode 100755 index 00000000..9d83077b --- /dev/null +++ b/src/net/test/bridge.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# - Basic bridge with three bridge ports +# - Add another port +# - Remove a port + +TEST_DIR=$(dirname "$0") +. "$TEST_DIR/lib.sh" + +################################################ +say "Verify bringup of basic bridge with three ports" +create_iface eth0 +create_iface eth1 +create_iface eth2 +create_bridge br0 eth0 eth1 eth2 + +netdo + +assert_bridge_ports br0 true eth0 eth1 eth2 +assert_iface br0 + +################################################ +sep +say "Verify add another bridge port" +create_ng + +create_iface br0 +create_iface eth3 +add_brport br0 eth3 + +netdo + +assert_bridge_ports br0 true eth0 eth1 eth2 eth3 +assert_iface br0 + +################################################ +sep +say "Verify delete a bridge port" +del_brport br0 eth1 +create_ng + +create_iface br0 +create_iface eth1 + +netdo + +bridge link +assert_bridge_ports br0 true eth0 eth2 eth3 +assert_bridge_ports br0 false eth1 +assert_iface br0 diff --git a/src/net/test/lib.sh b/src/net/test/lib.sh index 634d11d8..30b8f24b 100755 --- a/src/net/test/lib.sh +++ b/src/net/test/lib.sh @@ -20,6 +20,12 @@ export NET_DIR gen=-1 NET=$(command -v net) +if [ -n "$NET" ]; then + # Verify we didn't find Samba net command, our net live in sbin + if [ "$(dirname "$NET")" = "/usr/bin" ]; then + NET="" + fi +fi [ -n "$NET" ] || NET=../src/net # Exit immediately on error, treat unset variables as error @@ -175,6 +181,61 @@ create_iface() echo "up" > "$ifdir/admin-state" } +add_brport() +{ + brname=$1 + brdir="$NET_DIR/$gen/$brname" + shift + # shellcheck disable=SC2124 + brports=$@ + + mkdir -p "$brdir/deps" + for port in $brports; do + pdir="$NET_DIR/$gen/$port" + ln -s "../../$port" "$brdir/deps/$port" + + create_iface "$port" + cat <<-EOF >"$pdir/init.ip" + link add $port type dummy + link set $port master $brname + link set $port up + EOF + done +} + +del_brport() +{ + brname=$1 + brdir="$NET_DIR/$gen/$brname" + shift + # shellcheck disable=SC2124 + brports=$@ + + for port in $brports; do + cat <<-EOF >"$pdir/exit.ip" + link set $port nomaster + EOF + done +} + +create_bridge() +{ + brname=$1 + brdir="$NET_DIR/$gen/$brname" + shift + # shellcheck disable=SC2124 + brports=$@ + + create_iface "$brname" + cat <<-EOF > "$brdir/init.ip" + link add $brname type bridge + link set $brname up + EOF + + # shellcheck disable=SC2086 + add_brport "$brname" $brports +} + remove_iface() { ifname=$1 @@ -187,7 +248,11 @@ EOF assert_iface() { ifname=$1 - address=$2 + if [ $# -gt 1 ]; then + address=$2 + else + address="" + fi state=$(tr '[:lower:]' '[:upper:]' < "$NET_DIR/$gen/$ifname/admin-state") addr=$(ip -br -j addr show "$ifname" | jq -r '.[] | .addr_info[0].local') @@ -197,7 +262,9 @@ assert_iface() # echo "$state => $ifname: $updn $addr" assert "Verify $ifname state $state" "$state" = "$updn" - assert "Verify $ifname address $address" "$address" = "$addr" + if [ -n "$address" ]; then + assert "Verify $ifname address $address" "$address" = "$addr" + fi } assert_noiface() @@ -234,4 +301,29 @@ assert_iface_flag() assert "$msg" "$found" = "$val" } +assert_bridge_ports() +{ + br="$1" + val="$2" + shift 2 + # shellcheck disable=SC2124 + ports=$@ + + for port in $ports; do + found=false + for brport in $(bridge -j link |jq -r --arg br "$br" '.[] | select(.master == $br).ifname'); do + if [ "$port" = "$brport" ]; then + found=true + break; + fi + done + if [ "$val" = "false" ]; then + not="NOT " + else + not="" + fi + assert "Port $port is ${not}a $br bridge port" "$found" = "$val" + done +} + setup