summaryrefslogtreecommitdiff
path: root/tests/convert-tests.sh
blob: 17f5889da7de97b5e18fe5adae6c8405be96416a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/bin/bash
#
# convert ext2/3/4 images to btrfs images, and make sure the results are
# clean.
#

unset TOP
unset LANG
LANG=C
SCRIPT_DIR=$(dirname $(readlink -f $0))
TOP=$(readlink -f $SCRIPT_DIR/../)
RESULTS="$TOP/tests/convert-tests-results.txt"
# how many files to create.
DATASET_SIZE=50

source $TOP/tests/common

rm -f $RESULTS

setup_root_helper
prepare_test_dev 512M

CHECKSUMTMP=$(mktemp --tmpdir btrfs-progs-convert.XXXXXXXXXX)

generate_dataset() {

	dataset_type="$1"
	dirpath=$TEST_MNT/$dataset_type
	run_check $SUDO_HELPER mkdir -p $dirpath

	case $dataset_type in
		small)
			for num in $(seq 1 $DATASET_SIZE); do
				run_check $SUDO_HELPER dd if=/dev/urandom of=$dirpath/$dataset_type.$num bs=10K \
				count=1 >/dev/null 2>&1
			done
			;;

		hardlink)
			for num in $(seq 1 $DATASET_SIZE); do
				run_check $SUDO_HELPER touch $dirpath/$dataset_type.$num
				run_check $SUDO_HELPER ln $dirpath/$dataset_type.$num $dirpath/hlink.$num
			done
			;;

		symlink)
			for num in $(seq 1 $DATASET_SIZE); do
				run_check $SUDO_HELPER touch $dirpath/$dataset_type.$num
				run_check $SUDO_HELPER ln -s $dirpath/$dataset_type.$num $dirpath/slink.$num
			done
			;;

		brokenlink)
			for num in $(seq 1 $DATASET_SIZE); do
				run_check $SUDO_HELPER ln -s $dirpath/$dataset_type.$num $dirpath/blink.$num
			done
			;;

		perm)
			for modes in $(seq 1 7777); do
				if [[ "$modes" == *9* ]] || [[ "$modes" == *8* ]]
				then
					continue;
				else
					run_check $SUDO_HELPER touch $dirpath/$dataset_type.$modes
					run_check $SUDO_HELPER chmod $modes $dirpath/$dataset_type.$modes
				fi
			done
			;;

		sparse)
			for num in $(seq 1 $DATASET_SIZE); do
				run_check $SUDO_HELPER dd if=/dev/urandom of=$dirpath/$dataset_type.$num bs=10K \
				count=1 >/dev/null 2>&1
				run_check $SUDO_HELPER truncate -s 500K $dirpath/$dataset_type.$num
				run_check $SUDO_HELPER dd if=/dev/urandom of=$dirpath/$dataset_type.$num bs=10K \
				oflag=append conv=notrunc count=1 >/dev/null 2>&1
				run_check $SUDO_HELPER truncate -s 800K $dirpath/$dataset_type.$num
			done
			;;

		acls)
			for num in $(seq 1 $DATASET_SIZE); do
				run_check $SUDO_HELPER touch $dirpath/$dataset_type.$num
				run_check $SUDO_HELPER setfacl -m "u:root:x" $dirpath/$dataset_type.$num
				run_check $SUDO_HELPER setfattr -n user.foo -v bar$num $dirpath/$dataset_type.$num
			done
			;;
	esac
}

populate_fs() {

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

convert_test() {
	local features
	local nodesize

	features="$1"
	shift

	if [ -z "$features" ]; then
		echo "    [TEST/conv]   $1, btrfs defaults"
	else
		echo "    [TEST/conv]   $1, btrfs $features"
	fi
	nodesize=$2
	shift 2
	echo "creating ext image with: $*" >> $RESULTS
	# 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
	populate_fs
	run_check $SUDO_HELPER dd if=/dev/zero of=$TEST_MNT/test bs=$nodesize \
		count=1 >/dev/null 2>&1
	run_check_stdout find $TEST_MNT -type f ! -name 'image' -exec md5sum {} \+ > $CHECKSUMTMP
	run_check_umount_test_dev

	run_check $TOP/btrfs-convert ${features:+-O "$features"} -N "$nodesize" $TEST_DEV
	run_check $TOP/btrfs check $TEST_DEV
	run_check $TOP/btrfs-show-super $TEST_DEV

	run_check_mount_test_dev
	run_check_stdout md5sum -c $CHECKSUMTMP |
		grep -q 'FAILED' && _fail "file validation failed."
	run_check_umount_test_dev
}

if ! [ -z "$TEST" ]; then
	echo "    [TEST/conv]   skipped all convert tests, TEST=$TEST"
	exit 0
fi

for feature in '' 'extref' 'skinny-metadata' 'no-holes'; do
	convert_test "$feature" "ext2 4k nodesize" 4096 mke2fs -b 4096
	convert_test "$feature" "ext3 4k nodesize" 4096 mke2fs -j -b 4096
	convert_test "$feature" "ext4 4k nodesize" 4096 mke2fs -t ext4 -b 4096
	convert_test "$feature" "ext2 8k nodesize" 8192 mke2fs -b 4096
	convert_test "$feature" "ext3 8k nodesize" 8192 mke2fs -j -b 4096
	convert_test "$feature" "ext4 8k nodesize" 8192 mke2fs -t ext4 -b 4096
	convert_test "$feature" "ext2 16k nodesize" 16384 mke2fs -b 4096
	convert_test "$feature" "ext3 16k nodesize" 16384 mke2fs -j -b 4096
	convert_test "$feature" "ext4 16k nodesize" 16384 mke2fs -t ext4 -b 4096
	convert_test "$feature" "ext2 32k nodesize" 32768 mke2fs -b 4096
	convert_test "$feature" "ext3 32k nodesize" 32768 mke2fs -j -b 4096
	convert_test "$feature" "ext4 32k nodesize" 32768 mke2fs -t ext4 -b 4096
	convert_test "$feature" "ext2 64k nodesize" 65536 mke2fs -b 4096
	convert_test "$feature" "ext3 64k nodesize" 65536 mke2fs -j -b 4096
	convert_test "$feature" "ext4 64k nodesize" 65536 mke2fs -t ext4 -b 4096
done

rm $CHECKSUMTMP