]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: make sure all symlinks under /dev/disk/ are valid
authorFrantisek Sumsal <frantisek@sumsal.cz>
Fri, 10 Sep 2021 11:04:58 +0000 (13:04 +0200)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Sun, 12 Sep 2021 16:52:56 +0000 (18:52 +0200)
test/units/testsuite-64.sh

index 64859f1c8953d641c5eb234a570f24021d8af63e..8e8f27d23c3989055fd9f0b7e1153fd4b887b420 100755 (executable)
@@ -4,6 +4,28 @@
 set -eux
 set -o pipefail
 
+# Check if all symlinks under /dev/disk/ are valid
+helper_check_device_symlinks() {
+    local dev link target
+
+    while read -r link; do
+        target="$(readlink -f "$link")"
+        # Both checks should do virtually the same thing, but check both to be
+        # on the safe side
+        if [[ ! -e "$link" || ! -e "$target" ]]; then
+            echo >&2 "ERROR: symlink '$link' points to '$target' which doesn't exist"
+            return 1
+        fi
+
+        # Check if the symlink points to the correct device in /dev
+        dev="/dev/$(udevadm info -q name "$link")"
+        if [[ "$target" != "$dev" ]]; then
+            echo >&2 "ERROR: symlink '$link' points to '$target' but '$dev' was expected"
+            return 1
+        fi
+    done < <(find /dev/disk -type l)
+}
+
 testcase_megasas2_basic() {
     lsblk -S
     [[ "$(lsblk --scsi --noheadings | wc -l)" -ge 128 ]]
@@ -121,9 +143,11 @@ EOF
 : >/failed
 
 udevadm settle
-
 lsblk -a
 
+echo "Check if all symlinks under /dev/disk/ are valid (pre-test)"
+helper_check_device_symlinks
+
 # TEST_FUNCTION_NAME is passed on the kernel command line via systemd.setenv=
 # in the respective test.sh file
 if ! command -v "${TEST_FUNCTION_NAME:?}"; then
@@ -134,6 +158,9 @@ fi
 echo "TEST_FUNCTION_NAME=$TEST_FUNCTION_NAME"
 "$TEST_FUNCTION_NAME"
 
+echo "Check if all symlinks under /dev/disk/ are valid (post-test)"
+helper_check_device_symlinks
+
 systemctl status systemd-udevd
 
 touch /testok