diff --git a/test/units/TEST-58-REPART.sh b/test/units/TEST-58-REPART.sh index b752af3f4d..251c337425 100755 --- a/test/units/TEST-58-REPART.sh +++ b/test/units/TEST-58-REPART.sh @@ -1685,6 +1685,76 @@ EOF grep -q 'UUID=[0-9a-f-]* /home btrfs discard,rw,nodev,suid,exec,subvol=@home,zstd:1,noatime,lazytime 0 1' "$root"/etc/fstab } +testcase_btrfs_compression() { + local defs imgs loop output + + if ! systemd-analyze compare-versions "$(btrfs --version | head -n 1 | awk '{ print $2 }')" ge v6.13; then + echo "btrfs-progs is not installed or older than v6.13, skipping test." + return 0 + fi + + defs="$(mktemp -d)" + imgs="$(mktemp -d)" + # shellcheck disable=SC2064 + trap "rm -rf '$defs' '$imgs'" RETURN + chmod 0755 "$defs" + + echo "*** testcase for btrfs compression with CopyFiles (OFFLINE=$OFFLINE) ***" + + # Must not be in tmpfs due to exclusions. It also must be large and + # compressible so that the compression check succeeds later. + src=/etc/test-source-file + dd if=/dev/zero of="$src" bs=1M count=1 2>/dev/null + + tee "$defs/btrfs-compressed.conf" <&1 | tee "$imgs/repart-output.txt" + rm "$src" + + output=$(cat "$imgs/repart-output.txt") + + assert_in "Rootdir from:" "$output" + assert_in "Compress:" "$output" + + if [[ "$OFFLINE" == "yes" ]] || systemd-detect-virt --quiet --container; then + echo "Skipping mount verification (requires loop devices)" + return 0 + fi + loop="$(losetup -P --show --find "$imgs/btrfs-compressed.img")" + # shellcheck disable=SC2064 + trap "umount '$imgs/mount' 2>/dev/null || true; losetup -d '$loop' 2>/dev/null || true; rm -rf '$defs' '$imgs'" RETURN + echo "Loop device: $loop" + udevadm wait --timeout=60 --settle "${loop:?}p1" + + mkdir -p "$imgs/mount" + mount -t btrfs "${loop:?}p1" "$imgs/mount" + + [[ -f "$imgs/mount/test-file" ]] + [[ "$(stat -c%s "$imgs/mount/test-file")" == "1048576" ]] + + if command -v compsize &>/dev/null; then + output=$(compsize "$imgs/mount/test-file" 2>&1) + assert_in "zstd" "$output" + fi + + umount "$imgs/mount" + losetup -d "$loop" +} + testcase_varlink_list_devices() { REPART="$(which systemd-repart)" varlinkctl introspect "$REPART"