From: Kai Lueke Date: Thu, 20 Nov 2025 14:43:55 +0000 (+0900) Subject: test: Add tests for handling symlinks with systemd-sysext X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da6d189aa560a9970da6aaa1a08ee78c2b7d8355;p=thirdparty%2Fsystemd.git test: Add tests for handling symlinks with systemd-sysext When we now allow following symlinks inside a --root= we should also test that it works in various cases from simple relative and absolute symlinks to .v being a symlink itself or its contents, both for directory and for .raw image extensions. While at it, also add a simple test for .v without symlinks which wasn't there for direct usage of systemd-sysext. --- diff --git a/test/units/TEST-50-DISSECT.sysext.sh b/test/units/TEST-50-DISSECT.sysext.sh index 866e932f16c..2bac42cfbbd 100755 --- a/test/units/TEST-50-DISSECT.sysext.sh +++ b/test/units/TEST-50-DISSECT.sysext.sh @@ -1307,6 +1307,286 @@ run_systemd_sysext "$fake_root" unmerge extension_verify_after_unmerge "$fake_root" "$hierarchy" -h ) +# A couple of symlink tests follow below + +( init_trap +: "Check if following a relative extension directory symlink works with and without --root=" +fake_root=${roots_dir:+"$roots_dir/follow-relative-dir-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image "$fake_root" "$hierarchy" +mv -T "$fake_root/var/lib/extensions/test-extension" "$fake_root/var/othername-extension" +ln -s "../../othername-extension" "$fake_root/var/lib/extensions/test-extension" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/othername-extension" +) + +( init_trap +: "Check if following an absolute extension directory symlink works with and without --root=" +fake_root=${roots_dir:+"$roots_dir/follow-absolute-dir-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image "$fake_root" "$hierarchy" +mv -T "$fake_root/var/lib/extensions/test-extension" "$fake_root/var/othername-extension" +ln -s "/var/othername-extension" "$fake_root/var/lib/extensions/test-extension" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/othername-extension" +) + +( init_trap +: "Check if following a relative extension image symlink works with and without --root=" +fake_root=${roots_dir:+"$roots_dir/follow-relative-image-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image_raw "$fake_root" "$hierarchy" +mv "$fake_root/var/lib/extensions/test-extension.raw" "$fake_root/var/othername-extension.raw" +ln -s "../../othername-extension.raw" "$fake_root/var/lib/extensions/test-extension.raw" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/othername-extension.raw" +) + +( init_trap +: "Check if following an absolute extension image symlink works with and without --root=" +fake_root=${roots_dir:+"$roots_dir/follow-absolute-image-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image_raw "$fake_root" "$hierarchy" +mv "$fake_root/var/lib/extensions/test-extension.raw" "$fake_root/var/othername-extension.raw" +ln -s "/var/othername-extension.raw" "$fake_root/var/lib/extensions/test-extension.raw" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/othername-extension.raw" +) + +# And now a couple of vpick tests, including following symlinks + +( init_trap +: "Check if vpick works for directory extensions" +fake_root=${roots_dir:+"$roots_dir/vpick-dir"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image "$fake_root" "$hierarchy" +mkdir -p "$fake_root/var/lib/extensions/test-extension.v" +mv -T "$fake_root/var/lib/extensions/test-extension" "$fake_root/var/lib/extensions/test-extension.v/test-extension_1.0" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.v" +) + +( init_trap +: "Check if vpick works for image extensions" +fake_root=${roots_dir:+"$roots_dir/vpick-image"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image_raw "$fake_root" "$hierarchy" +mkdir -p "$fake_root/var/lib/extensions/test-extension.raw.v" +mv "$fake_root/var/lib/extensions/test-extension.raw" "$fake_root/var/lib/extensions/test-extension.raw.v/test-extension_1.0.raw" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.raw.v" +) + +( init_trap +: "Check if vpick works for directory extensions if .v is a relative symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-dir-relative-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image "$fake_root" "$hierarchy" +mkdir -p "$fake_root/var/test-extension-vpick" +mv -T "$fake_root/var/lib/extensions/test-extension" "$fake_root/var/test-extension-vpick/test-extension_1.0" +ln -s "../../test-extension-vpick" "$fake_root/var/lib/extensions/test-extension.v" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.v" "$fake_root/var/test-extension-vpick" +) + +( init_trap +: "Check if vpick works for directory extensions if .v is an absolute symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-dir-absolute-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image "$fake_root" "$hierarchy" +mkdir -p "$fake_root/var/test-extension-vpick" +mv -T "$fake_root/var/lib/extensions/test-extension" "$fake_root/var/test-extension-vpick/test-extension_1.0" +ln -s "/var/test-extension-vpick" "$fake_root/var/lib/extensions/test-extension.v" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.v" "$fake_root/var/test-extension-vpick" +) + +( init_trap +: "Check if vpick works for image extensions if .v is a relative symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-image-relative-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image_raw "$fake_root" "$hierarchy" +mkdir -p "$fake_root/var/test-extension-vpick" +mv "$fake_root/var/lib/extensions/test-extension.raw" "$fake_root/var/test-extension-vpick/test-extension_1.0.raw" +ln -s "../../test-extension-vpick" "$fake_root/var/lib/extensions/test-extension.raw.v" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.raw.v" "$fake_root/var/test-extension-vpick" +) + +( init_trap +: "Check if vpick works for image extensions if .v is an absolute symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-image-absolute-symlink"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image_raw "$fake_root" "$hierarchy" +mkdir -p "$fake_root/var/test-extension-vpick" +mv "$fake_root/var/lib/extensions/test-extension.raw" "$fake_root/var/test-extension-vpick/test-extension_1.0.raw" +ln -s "/var/test-extension-vpick" "$fake_root/var/lib/extensions/test-extension.raw.v" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.raw.v" "$fake_root/var/test-extension-vpick" +) + +( init_trap +: "Check if vpick works for directory extensions if inside a .v there is a relative symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-dir-relative-symlink-inside"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image "$fake_root" "$hierarchy" +mv -T "$fake_root/var/lib/extensions/test-extension" "$fake_root/var/othername-extension" +mkdir -p "$fake_root/var/lib/extensions/test-extension.v" +ln -s "../../../othername-extension" "$fake_root/var/lib/extensions/test-extension.v/test-extension_1.0" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.v" "$fake_root/var/othername-extension" +) + +( init_trap +: "Check if vpick works for directory extensions if inside a .v there is an absolute symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-dir-absolute-symlink-inside"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image "$fake_root" "$hierarchy" +mv -T "$fake_root/var/lib/extensions/test-extension" "$fake_root/var/othername-extension" +mkdir -p "$fake_root/var/lib/extensions/test-extension.v" +ln -s "/var/othername-extension" "$fake_root/var/lib/extensions/test-extension.v/test-extension_1.0" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.v" "$fake_root/var/othername-extension" +) + +( init_trap +: "Check if vpick works for image extensions if inside a .v there is a relative symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-image-relative-symlink-inside"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image_raw "$fake_root" "$hierarchy" +mv "$fake_root/var/lib/extensions/test-extension.raw" "$fake_root/var/othername-extension.raw" +mkdir -p "$fake_root/var/lib/extensions/test-extension.raw.v" +ln -s "../../../othername-extension.raw" "$fake_root/var/lib/extensions/test-extension.raw.v/test-extension_1.0.raw" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.raw.v" "$fake_root/var/othername-extension.raw" +) + +( init_trap +: "Check if vpick works for image extensions if inside a .v there is an absolute symlink" +fake_root=${roots_dir:+"$roots_dir/vpick-image-absolute-symlink-inside"} +hierarchy=/opt + +prepare_root "$fake_root" "$hierarchy" +prepare_extension_image_raw "$fake_root" "$hierarchy" +mv "$fake_root/var/lib/extensions/test-extension.raw" "$fake_root/var/othername-extension.raw" +mkdir -p "$fake_root/var/lib/extensions/test-extension.raw.v" +ln -s "/var/othername-extension.raw" "$fake_root/var/lib/extensions/test-extension.raw.v/test-extension_1.0.raw" +prepare_read_only_hierarchy "$fake_root" "$hierarchy" + +run_systemd_sysext "$fake_root" merge +extension_verify_after_merge "$fake_root" "$hierarchy" -e -h + +run_systemd_sysext "$fake_root" unmerge +extension_verify_after_unmerge "$fake_root" "$hierarchy" -h +rm -rf "$fake_root/var/lib/extensions/test-extension.raw.v" "$fake_root/var/othername-extension.raw" +) + +# Done with the above vpick symlink tests for --root= and without + } # End of run_sysext_tests