blob: 504d8d32e5e25eb4aef54af3dc5537667e5ac5e9 [file] [log] [blame]
#!/bin/sh
set -e
mnt=/mnt/mount
tmp=$(mktemp -d)
trap "sh -c 'sudo umount ${mnt} 2>/dev/null; rm -rf ${tmp}'" EXIT INT
build=${PWD}/build
test() {
type=$1
img=${tmp}/${type}.img
printf "\n===> Prepping \`${img}'\n"
dd if=/dev/zero bs=1M count=64 >${img} 2>/dev/null
mkfs.${type} -E root_owner ${img} >/dev/null 2>&1
sudo mount -o loop ${img} ${mnt} -o rw
mkdir -p ${mnt}/dir/subdir
echo " ==> Adding \`test' files and links"
echo 'Moin!' >${mnt}/test
echo 'Moin! from `dir'\' >${mnt}/dir/test
echo 'Moin! from `subdir'\' >${mnt}/dir/subdir/test
ln -s test ${mnt}/l5
ln -s ../l5 ${mnt}/dir/l4
ln -s ../l4 ${mnt}/dir/subdir/l3
ln -s ../dir/subdir/l3 ${mnt}/dir/l2
ln -s ../dir/subdir/../l2 ${mnt}/dir/l1
ln -s l1 ${mnt}/dir/ltest
ln -s ../../dir/../dir/../dir/../dir/subdir/../../dir/subdir/../subdir/../subdir/../../dir/test ${mnt}/dir/subdir/ltest
echo " ==> Adding random small files"
i=0; step=123; files=12345
for j in $(seq $((files/step))); do
dd if=/dev/urandom bs=123 count=1 2>/dev/null | \
tee $(printf "${mnt}/dir/random%05d " $(seq $((i+1)) $((i+step)))) >/dev/null
i=$((i+step))
done
echo " => Removing some files to produce gaps"
i=0
for j in $(seq $((files/step))); do
rm $(printf "${mnt}/dir/random%05d " $(seq $((i+2)) 2 $((i+step))))
i=$((i+step))
done
echo " ==> Adding a big file (should be fragmented)"
dd if=/dev/urandom bs=1M count=30 >${mnt}/random 2>/dev/null
echo " ==> Removing some more small files"
i=0
for j in $(seq $((files/step))); do
rm $(printf "${mnt}/dir/random%05d " $(seq $((i+3)) 4 $((i+step))))
rm $(printf "${mnt}/dir/random%05d " $(seq $((i+5)) 8 $((i+step))))
rm $(printf "${mnt}/dir/random%05d " $(seq $((i+9)) 16 $((i+step))))
i=$((i+step))
done
echo " ==> Adding a big, fragmented, sparse file"
for i in $(seq 1 2 8765); do
dd if=/dev/urandom bs=4K count=1 conv=notrunc \
seek=${i} of=${mnt}/dir/subdir/sparse 2>/dev/null
done
if [ "${type}" = "ext4" ]; then
echo " => Increasing sparse file >1GiB"
dd if=/dev/urandom bs=4K count=1 conv=notrunc \
seek=345678 of=${mnt}/dir/subdir/sparse 2>/dev/null
fi
sudo umount ${mnt}
sudo mount -o loop ${img} ${mnt} -o ro
cd ${mnt}
printf "\n ==> Running simple test for \`test' files\n"
${build}/fstest -d ${img}
printf "\n ==> Comparing all file contents"
find . \( -name lost+found -prune \) -o ! -type d -printf . \
\( -exec sh -c "${build}/fscat -d ${img} {} | cmp - {}" \; \
-o \( -exec false {} + -quit \) \)
printf " done\n"
printf "\n ==> Comparing all file contents (at once)... "
sum=$(find . \( -name lost+found -prune \) -o ! -type d \
-exec ${build}/fscat -d ${img} {} + | cksum)
sum2=$(find . \( -name lost+found -prune \) -o ! -type d -exec cat {} + | cksum)
if [ "${sum}" = "${sum2}" ]; then
printf "done\n"
else
printf "FAILED!\n"
exit 1
fi
cd - >/dev/null
sudo umount ${mnt}
}
test ext2
test ext4