#!/bin/bash
# helpers for btrfs-convert tests

populate_fs() {

        for dataset_type in 'small' 'hardlink' 'fast_symlink' 'brokenlink' 'perm' 'sparse' 'acls' 'fifo' 'slow_symlink'; do
		generate_dataset "$dataset_type"
	done
}

# verbose message before the test, same arguments as convert_test
convert_test_preamble() {
	local features
	local msg

	features="$1"
	msg="$2"
	shift 3
	echo "    [TEST/conv]     $msg, btrfs" "${features:-defaults}"
	echo "creating ext image with: $@" >> "$RESULTS"
}

#  prepare TEST_DEV before conversion, create filesystem and mount it, image
#  size is 512MB
#  $@: free form, command to create the filesystem, with appended -F
convert_test_prep_fs() {
	# TEST_DEV not removed as the file might have special permissions, eg.
	# when test image is on NFS and would not be writable for root
	run_check truncate -s 0 "$TEST_DEV"
	# 256MB is the smallest acceptable btrfs image.
	run_check truncate -s 512M "$TEST_DEV"
	run_check "$@" -F "$TEST_DEV"

	# create a file to check btrfs-convert can convert regular file correct
	run_check_mount_test_dev

	# create a file inside the fs before convert, to make sure there is
	# data covering btrfs backup superblock range (64M)
	run_check $SUDO_HELPER dd if=/dev/zero bs=1M count=64 \
		of="$TEST_MNT/convert_space_holder"
}

# generate md5 checksums of files on $TEST_MNT
# $1: path where the checksums will be stored
convert_test_gen_checksums() {
	_assert_path "$1"

	run_check $SUDO_HELPER dd if=/dev/zero of="$TEST_MNT/test" "bs=$nodesize" \
		count=1 >/dev/null 2>&1
	run_check_stdout $SUDO_HELPER find "$TEST_MNT" -type f ! -name 'image' -exec md5sum {} \+ > "$1"
}
# list $TEST_MNT data set file permissions.
# $1: path where the permissions will be stored
convert_test_perm() {
	local PERMTMP

	_assert_path "$1"
	PERMTMP="$1"
	FILES_LIST=$(mktemp --tmpdir btrfs-progs-convert.fileslistXXXXXX)

	run_check $SUDO_HELPER dd if=/dev/zero of="$TEST_MNT/test" "bs=$nodesize" \
		count=1 >/dev/null 2>&1
	run_check_stdout $SUDO_HELPER find "$TEST_MNT" -type f ! -name 'image' -fprint "$FILES_LIST"
	# Fix directory entries order
	sort "$FILES_LIST" -o "$FILES_LIST"
	for file in `cat "$FILES_LIST"` ;do
		run_check_stdout $SUDO_HELPER getfacl --absolute-names "$file" >> "$PERMTMP"
	done
	rm -- "$FILES_LIST"
}
# list acls of files on $TEST_MNT
# $1: path where the acls will be stored
convert_test_acl() {
	local ACLSTMP
	ACLTMP="$1"
	FILES_LIST=$(mktemp --tmpdir btrfs-progs-convert.fileslistXXXXXX)

	run_check_stdout $SUDO_HELPER find "$TEST_MNT/acls" -type f -fprint "$FILES_LIST"
	# Fix directory entries order
	sort "$FILES_LIST" -o "$FILES_LIST"
	for file in `cat "$FILES_LIST"`;do
		run_check_stdout $SUDO_HELPER getfattr --absolute-names -d "$file" >> "$ACLTMP"
	done
	rm -- "$FILES_LIST"
}

# do conversion with given features and nodesize, fsck afterwards
# $1: features, argument of -O, can be empty
# $2: nodesize, argument of -N, can be empty
convert_test_do_convert() {
	run_check "$TOP/btrfs-convert" ${1:+-O "$1"} ${2:+-N "$2"} "$TEST_DEV"
	run_check "$TOP/btrfs" check "$TEST_DEV"
	run_check "$TOP/btrfs" inspect-internal dump-super -Ffa "$TEST_DEV"
}

# post conversion check, verify file permissions.
# $1: file with ext permissions.
convert_test_post_check_permissions() {
	local EXT_PERMTMP
	local BTRFS_PERMTMP

	_assert_path "$1"
	EXT_PERMTMP="$1"
	BTRFS_PERMTMP=$(mktemp --tmpdir btrfs-progs-convert.permXXXXXX)
	convert_test_perm "$BTRFS_PERMTMP"

	btrfs_perm=`md5sum "$BTRFS_PERMTMP" | cut -f1 -d' '`
	ext_perm=`md5sum "$EXT_PERMTMP" | cut -f1 -d' '`

	if [ "$btrfs_perm" != "$ext_perm" ];
	then
		btrfs_perm_file=`md5sum "$BTRFS_PERMTMP" | cut -f2 -d' '`
		ext_perm_file=`md5sum "$EXT_PERMTMP" | cut -f2 -d' '`
		_fail "file permission failed. Mismatched BTRFS:$btrfs_perm_file:$btrfs_perm EXT:$ext_perm_file:$ext_perm"
	fi

	rm -- "$BTRFS_PERMTMP"
}
# post conversion check, compare BTRFS file acls against EXT.
# $1: file with ext acls.
convert_test_post_check_acl() {
	local EXT_ACLTMP
	local BTRFS_ACLTMP

	_assert_path "$1"
	EXT_ACLTMP="$1"
	BTRFS_ACLTMP=$(mktemp --tmpdir btrfs-progs-convert.aclsXXXXXXX)
	convert_test_acl "$BTRFS_ACLTMP"

	btrfs_acl=`md5sum "$BTRFS_ACLTMP" | cut -f1 -d' '`
	ext_acl=`md5sum "$EXT_ACLTMP" | cut -f1 -d' '`

	if [ "$btrfs_acl" != "$ext_acl" ]
	then
		btrfs_acl_file=`md5sum "$BTRFS_ACLTMP" | cut -f2 -d' '`
		ext_acl_file=`md5sum "$EXT_ACLTMP" | cut -f2 -d' '`
		_fail "file acl failed. Mismatched BTRFS:$btrfs_acl_file:$btrfs_acl EXT:$ext_acl_file:$ext_acl"
	fi

	rm -- "$BTRFS_ACLTMP"
}

# post conversion checks, verify md5sums
convert_test_post_check_checksums() {
	_assert_path "$1"
	run_check_stdout $SUDO_HELPER md5sum -c "$1" |
		grep -q 'FAILED' && _fail "file validation failed"
}

# post conversion checks, all three in one call, on an unmounted image
# $1: file with checksums
# $2: file with permissions.
# $3: file with acl entries.
convert_test_post_checks_all() {
	_assert_path "$1"
	_assert_path "$2"
	_assert_path "$3"

	run_check_mount_test_dev
	convert_test_post_check_checksums "$1"
	convert_test_post_check_permissions "$2"
	convert_test_post_check_acl "$3"

	# Create a large file to trigger data chunk allocation
	generate_dataset "large"
	run_check_umount_test_dev
}

# do rollback and fsck
convert_test_post_rollback() {
	run_check "$TOP/btrfs-convert" --rollback "$TEST_DEV"
	run_check fsck -n -t ext2,ext3,ext4 "$TEST_DEV"
}

# simple wrapper for a convert test
# $1: btrfs features, argument to -O
# $2: description of the test "ext2 8k nodesize"
# $3: nodesize value
# $4 + rest: command to create the ext2 image
convert_test() {
	local features
	local nodesize
	local msg
	local CHECKSUMTMP
	local EXT_PERMTMP
	local EXT_ACLTMP

	features="$1"
	msg="$2"
	nodesize="$3"
	shift 3
	convert_test_preamble "$features" "$msg" "$nodesize" "$@"
	convert_test_prep_fs "$@"
	populate_fs
	CHECKSUMTMP=$(mktemp --tmpdir btrfs-progs-convert.XXXXXXXXXX)
	EXT_PERMTMP=$(mktemp --tmpdir btrfs-progs-convert.permXXXXXX)
	EXT_ACLTMP=$(mktemp --tmpdir btrfs-progs-convert.aclsXXXXXXX)
	convert_test_gen_checksums "$CHECKSUMTMP"
	convert_test_perm "$EXT_PERMTMP"
	convert_test_acl "$EXT_ACLTMP"

	run_check_umount_test_dev

	convert_test_do_convert "$features" "$nodesize"
	convert_test_post_checks_all "$CHECKSUMTMP" "$EXT_PERMTMP" "$EXT_ACLTMP"
	rm -- "$CHECKSUMTMP"
	rm -- "$EXT_PERMTMP"
	rm -- "$EXT_ACLTMP"

	convert_test_post_rollback
}
