]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/vsock: reuse logic for vsock_test through wrapper functions
authorBobby Eshleman <bobbyeshleman@meta.com>
Sat, 8 Nov 2025 16:00:54 +0000 (08:00 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 12 Nov 2025 14:19:38 +0000 (06:19 -0800)
Add wrapper functions vm_vsock_test() and host_vsock_test() to invoke
the vsock_test binary. This encapsulates several items of repeat logic,
such as waiting for the server to reach listening state and
enabling/disabling the bash option pipefail to avoid pipe-style logging
from hiding failures.

Signed-off-by: Bobby Eshleman <bobbyeshleman@meta.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Link: https://patch.msgid.link/20251108-vsock-selftests-fixes-and-improvements-v4-3-d5e8d6c87289@meta.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/vsock/vmtest.sh

index 01ce16523afbc5dc8435ec2e4342766c5ec83ef7..3bccd9b84e4ac3c8b97615f6089f5e884e61460b 100755 (executable)
@@ -272,8 +272,81 @@ EOF
 }
 
 host_wait_for_listener() {
-       wait_for_listener "${TEST_HOST_PORT_LISTENER}" "${WAIT_PERIOD}" "${WAIT_PERIOD_MAX}"
+       local port=$1
 
+       wait_for_listener "${port}" "${WAIT_PERIOD}" "${WAIT_PERIOD_MAX}"
+}
+
+vm_vsock_test() {
+       local host=$1
+       local cid=$2
+       local port=$3
+       local rc
+
+       # log output and use pipefail to respect vsock_test errors
+       set -o pipefail
+       if [[ "${host}" != server ]]; then
+               vm_ssh -- "${VSOCK_TEST}" \
+                       --mode=client \
+                       --control-host="${host}" \
+                       --peer-cid="${cid}" \
+                       --control-port="${port}" \
+                       2>&1 | log_guest
+               rc=$?
+       else
+               vm_ssh -- "${VSOCK_TEST}" \
+                       --mode=server \
+                       --peer-cid="${cid}" \
+                       --control-port="${port}" \
+                       2>&1 | log_guest &
+               rc=$?
+
+               if [[ $rc -ne 0 ]]; then
+                       set +o pipefail
+                       return $rc
+               fi
+
+               vm_wait_for_listener "${port}"
+               rc=$?
+       fi
+       set +o pipefail
+
+       return $rc
+}
+
+host_vsock_test() {
+       local host=$1
+       local cid=$2
+       local port=$3
+       local rc
+
+       # log output and use pipefail to respect vsock_test errors
+       set -o pipefail
+       if [[ "${host}" != server ]]; then
+               ${VSOCK_TEST} \
+                       --mode=client \
+                       --peer-cid="${cid}" \
+                       --control-host="${host}" \
+                       --control-port="${port}" 2>&1 | log_host
+               rc=$?
+       else
+               ${VSOCK_TEST} \
+                       --mode=server \
+                       --peer-cid="${cid}" \
+                       --control-port="${port}" 2>&1 | log_host &
+               rc=$?
+
+               if [[ $rc -ne 0 ]]; then
+                       set +o pipefail
+                       return $rc
+               fi
+
+               host_wait_for_listener "${port}"
+               rc=$?
+       fi
+       set +o pipefail
+
+       return $rc
 }
 
 log() {
@@ -312,59 +385,41 @@ log_guest() {
 }
 
 test_vm_server_host_client() {
+       if ! vm_vsock_test "server" 2 "${TEST_GUEST_PORT}"; then
+               return "${KSFT_FAIL}"
+       fi
 
-       vm_ssh -- "${VSOCK_TEST}" \
-               --mode=server \
-               --control-port="${TEST_GUEST_PORT}" \
-               --peer-cid=2 \
-               2>&1 | log_guest &
-
-       vm_wait_for_listener "${TEST_GUEST_PORT}"
-
-       ${VSOCK_TEST} \
-               --mode=client \
-               --control-host=127.0.0.1 \
-               --peer-cid="${VSOCK_CID}" \
-               --control-port="${TEST_HOST_PORT}" 2>&1 | log_host
+       if ! host_vsock_test "127.0.0.1" "${VSOCK_CID}" "${TEST_HOST_PORT}"; then
+               return "${KSFT_FAIL}"
+       fi
 
-       return $?
+       return "${KSFT_PASS}"
 }
 
 test_vm_client_host_server() {
+       if ! host_vsock_test "server" "${VSOCK_CID}" "${TEST_HOST_PORT_LISTENER}"; then
+               return "${KSFT_FAIL}"
+       fi
 
-       ${VSOCK_TEST} \
-               --mode "server" \
-               --control-port "${TEST_HOST_PORT_LISTENER}" \
-               --peer-cid "${VSOCK_CID}" 2>&1 | log_host &
-
-       host_wait_for_listener
-
-       vm_ssh -- "${VSOCK_TEST}" \
-               --mode=client \
-               --control-host=10.0.2.2 \
-               --peer-cid=2 \
-               --control-port="${TEST_HOST_PORT_LISTENER}" 2>&1 | log_guest
+       if ! vm_vsock_test "10.0.2.2" 2 "${TEST_HOST_PORT_LISTENER}"; then
+               return "${KSFT_FAIL}"
+       fi
 
-       return $?
+       return "${KSFT_PASS}"
 }
 
 test_vm_loopback() {
        local port=60000 # non-forwarded local port
 
-       vm_ssh -- "${VSOCK_TEST}" \
-               --mode=server \
-               --control-port="${port}" \
-               --peer-cid=1 2>&1 | log_guest &
-
-       vm_wait_for_listener "${port}"
+       if ! vm_vsock_test "server" 1 "${port}"; then
+               return "${KSFT_FAIL}"
+       fi
 
-       vm_ssh -- "${VSOCK_TEST}" \
-               --mode=client \
-               --control-host="127.0.0.1" \
-               --control-port="${port}" \
-               --peer-cid=1 2>&1 | log_guest
+       if ! vm_vsock_test "127.0.0.1" 1 "${port}"; then
+               return "${KSFT_FAIL}"
+       fi
 
-       return $?
+       return "${KSFT_PASS}"
 }
 
 run_test() {