]> git.itanic.dy.fi Git - linux-stable/commitdiff
kselftest/runner.sh: add netns support
authorHangbin Liu <liuhangbin@gmail.com>
Tue, 19 Dec 2023 09:48:56 +0000 (17:48 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 23 Dec 2023 00:26:32 +0000 (00:26 +0000)
Add a variable RUN_IN_NETNS if the user wants to run all the selected tests
in namespace in parallel. With this, we can save a lot of testing time.

Note that some tests may not fit to run in namespace, e.g.
net/drop_monitor_tests.sh, as the dwdump needs to be run in init ns.

I also added another parameter -p to make all the logs reported separately
instead of mixing them in the stdout or output.log.

Nit: the NUM in run_one is not used, rename it to test_num.

Acked-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/kselftest/runner.sh
tools/testing/selftests/run_kselftest.sh

index cd2fb43eea61ee5ab182783a2706099e321cf956..74954f6a8f94b3709ecfe965b3f3f6c95bad6a2f 100644 (file)
@@ -6,6 +6,7 @@ export skip_rc=4
 export timeout_rc=124
 export logfile=/dev/stdout
 export per_test_logging=
+export RUN_IN_NETNS=
 
 # Defaults for "settings" file fields:
 # "timeout" how many seconds to let each test run before running
@@ -47,7 +48,7 @@ run_one()
 {
        DIR="$1"
        TEST="$2"
-       NUM="$3"
+       local test_num="$3"
 
        BASENAME_TEST=$(basename $TEST)
 
@@ -141,6 +142,33 @@ run_one()
        fi
 }
 
+in_netns()
+{
+       local name=$1
+       ip netns exec $name bash <<-EOF
+               BASE_DIR=$BASE_DIR
+               source $BASE_DIR/kselftest/runner.sh
+               logfile=$logfile
+               run_one $DIR $TEST $test_num
+       EOF
+}
+
+run_in_netns()
+{
+       local netns=$(mktemp -u ${BASENAME_TEST}-XXXXXX)
+       local tmplog="/tmp/$(mktemp -u ${BASENAME_TEST}-XXXXXX)"
+       ip netns add $netns
+       if [ $? -ne 0 ]; then
+               echo "# Warning: Create namespace failed for $BASENAME_TEST"
+               echo "not ok $test_num selftests: $DIR: $BASENAME_TEST # Create NS failed"
+       fi
+       ip -n $netns link set lo up
+       in_netns $netns &> $tmplog
+       ip netns del $netns &> /dev/null
+       cat $tmplog
+       rm -f $tmplog
+}
+
 run_many()
 {
        echo "TAP version 13"
@@ -155,6 +183,12 @@ run_many()
                        logfile="/tmp/$BASENAME_TEST"
                        cat /dev/null > "$logfile"
                fi
-               run_one "$DIR" "$TEST" "$test_num"
+               if [ -n "$RUN_IN_NETNS" ]; then
+                       run_in_netns &
+               else
+                       run_one "$DIR" "$TEST" "$test_num"
+               fi
        done
+
+       wait
 }
index 92743980e553b89d98dc4f34859bed9115d4d0f0..a28c1416cb89b96ba5f8b287e68b324b51d95673 100755 (executable)
@@ -20,11 +20,13 @@ usage()
 {
        cat <<EOF
 Usage: $0 [OPTIONS]
-  -s | --summary               Print summary with detailed log in output.log
+  -s | --summary               Print summary with detailed log in output.log (conflict with -p)
+  -p | --per_test_log          Print test log in /tmp with each test name (conflict with -s)
   -t | --test COLLECTION:TEST  Run TEST from COLLECTION
   -c | --collection COLLECTION Run all tests from COLLECTION
   -l | --list                  List the available collection:test entries
   -d | --dry-run               Don't actually run any tests
+  -n | --netns                 Run each test in namespace
   -h | --help                  Show this usage info
   -o | --override-timeout      Number of seconds after which we timeout
 EOF
@@ -41,6 +43,9 @@ while true; do
                        logfile="$BASE_DIR"/output.log
                        cat /dev/null > $logfile
                        shift ;;
+               -p | --per-test-log)
+                       per_test_logging=1
+                       shift ;;
                -t | --test)
                        TESTS="$TESTS $2"
                        shift 2 ;;
@@ -53,6 +58,9 @@ while true; do
                -d | --dry-run)
                        dryrun="echo"
                        shift ;;
+               -n | --netns)
+                       RUN_IN_NETNS=1
+                       shift ;;
                -o | --override-timeout)
                        kselftest_override_timeout="$2"
                        shift 2 ;;