-
Notifications
You must be signed in to change notification settings - Fork 21
/
test-imagex-mount
executable file
·272 lines (242 loc) · 7.95 KB
/
test-imagex-mount
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#!/usr/bin/env bash
# Test WIM mounting
set -e
cd tests
srcdir="${srcdir:-.}/.."
srcdir="$(cd $srcdir; pwd)"
. "$srcdir/tests/test_utils.sh"
TEST_SUBDIR=tmpdir_test-imagex-mount
skip_test() {
cd ..
cleanup
exit 77
}
imagex_unmount() {
# Give the --lazy flag to work around a problem testing on Ubuntu and
# other OS's running Gnome, as they have a daemon
# "gvfs-gdu-volume-monitor" that apparently likes to randomly read
# filesystems that get mounted, thereby stopping them from being
# unmounted.
wimunmount "$@" --lazy
}
cleanup() {
fusermount3 -u $TEST_SUBDIR/tmp.mnt &> /dev/null || true
rm -rf $TEST_SUBDIR
}
init() {
mkdir dir
cp $srcdir/src/*.c dir
mkdir dir/subdir
echo 'hello' > dir/subdir/hello
echo 'hello' > dir/subdir/hello2
ln dir/subdir/hello dir/subdir/hellolink
echo -n > dir/subdir/empty_file
ln -s hello dir/subdir/rel_symlink
mkdir dir2
echo 'testing' > dir2/file
dd if=/dev/zero of=dir2/zeroes bs=4096 count=5
mkdir tmp.empty tmp.mnt tmp.apply tmp.orig
wimcapture tmp.empty empty.wim --norpfix
}
if [ ! -r /dev/fuse ] || [ ! -w /dev/fuse ]; then
echo "WARNING: /dev/fuse is not readable and writable."
echo "Skipping WIM mounting checks"
skip_test
fi
cleanup
mkdir $TEST_SUBDIR
cd $TEST_SUBDIR
init
# wimmount
for flag in "--compress=none" "--compress=maximum" "--compress=fast"; do
echo "Using flag $flag"
echo "Testing mounting WIM read-only"
if ! wimcapture dir dir.wim $flag; then
error "Failed to capture WIM"
fi
if ! wimmount dir.wim dir tmp.mnt; then
error "Failed to mount test WIM read-only. " \
"Please read any error messages above before reporting this test failure. "\
"Perhaps you don't have FUSE installed, or the FUSE kernel module isn't" \
"loaded, or you aren't a member of the FUSE group?"
fi
echo "Testing extracting file from mounted read-only WIM"
if ! cp tmp.mnt/write.c write.c; then
error "Failed to extract file from read-only mounted WIM"
fi
if ! diff -q dir/write.c write.c; then
error "Extracted file does not match copy in mounted WIM"
fi
if ! diff -q tmp.mnt/write.c dir/write.c; then
error "Extractef file does not match original"
fi
rm -f write.c
echo "Testing modifying mounted read-only WIM (should fail)"
if rm tmp.mnt/write.c; then
error "Removing file from read-only mounted WIM didn't fail"
fi
if touch tmp.mnt/newfile; then
error "Creating file on read-only mounted WIM didn't fail"
fi
if echo 3 > tmp.mnt/write.c; then
error "Writing to file on read-only mounted WIM didn't fail"
fi
echo "Testing diff of mounted read-only WIM with original directory"
if ! diff -q -r tmp.mnt dir; then
error "Recursive diff of read-only mounted WIM with original directory failed"
fi
echo "Testing unmount of read-only filesystem"
if ! imagex_unmount tmp.mnt; then
error "Unmounting read-only WIM failed"
fi
echo "Testing unmount of read-only filesystem with --commit given"
if ! wimmount dir.wim dir tmp.mnt; then
error "Failed to re-mount WIM read-only"
fi
if ! imagex_unmount tmp.mnt --commit; then
error "Failed to unmount read-only WIM with --commit flag (should be ignored)"
fi
rm -rf dir.wim
done
# wimmountrw
echo "Testing mounting WIM read-write"
if ! wimcapture dir dir.wim; then
error "Failed to capture WIM"
fi
if ! wimmountrw dir.wim dir tmp.mnt; then
error "Failed to mount test WIM read-write"
fi
echo "Testing unmounting WIM unmodified"
if ! imagex_unmount tmp.mnt; then
error "Failed to unmount test WIM unmodified"
fi
echo "Testing unmounting WIM unmodified with --commit and --check"
if ! wimmountrw dir.wim dir tmp.mnt; then
error "Failed to re-mount test WIM read-write"
fi
if ! imagex_unmount tmp.mnt --commit --check; then
error "Failed to unmount read-write mounted WIM with changes committed (no changes made)"
fi
echo "Testing removing file from mounted WIM"
if ! wimmountrw dir.wim dir tmp.mnt; then
error "Failed to re-mount test WIM read-write"
fi
if ! rm tmp.mnt/write.c; then
error "Failed to remove file from read-write mounted WIM"
fi
if test -f tmp.mnt/write.c; then
error "Removing file from read-write mounted WIM failed"
fi
echo "Testing making directory in mounted WIM"
if ! mkdir tmp.mnt/newdir; then
error "Failed to make directory in read-write mounted WIM"
fi
if ! test -d tmp.mnt/newdir; then
error "Making directory in read-write mounted WIM failed"
fi
echo "Testing making new empty file in mounted WIM"
if ! touch tmp.mnt/newdir/empty_file; then
error "Could not create new empty file in read-write mounted WIM"
fi
if ! test -f tmp.mnt/newdir/empty_file; then
error "New empty file not created correctly in read-write mounted WIM"
fi
if ! test "`get_file_size tmp.mnt/newdir/empty_file`" = 0; then
error "New empty file in read-write mounted WIM is not empty"
fi
echo "Testing making new non-empty file in mounted WIM"
if ! dd if=/dev/zero of=tmp.mnt/newdir/zeroes1 bs=1 count=4096; then
error "Failed to make new non-empty file in mounted WIM"
fi
if ! dd if=/dev/zero of=tmp.mnt/newdir/zeroes2 bs=4096 count=1; then
error "Failed to make new non-empty file in mounted WIM"
fi
if ! diff -q tmp.mnt/newdir/zeroes1 tmp.mnt/newdir/zeroes2; then
error "New files in mounted WIM not made correctly"
fi
echo "Unmounting WIM with changes committed and --check"
if ! imagex_unmount tmp.mnt --commit --check; then
error "Failed to unmount read-write mounted WIM"
fi
if ! wiminfo dir.wim | grep -q Integrity; then
error "Integrity information was not included"
fi
if ! wimapply dir.wim tmp.apply; then
error "Failed to apply WIM we had previously mounted read-write"
fi
if ! diff -q tmp.apply/newdir/zeroes1 tmp.apply/newdir/zeroes2; then
error "The new non-empty files we made in the read-write mounted WIM were not extracted correctly"
fi
if test `get_file_size tmp.apply/newdir/empty_file` != 0; then
error "The new empty file we made in the read-write mounted WIM was not extracted correctly"
fi
if test `get_file_size tmp.apply/newdir/zeroes1` != 4096; then
error "The new non-empty files we made in the read-write mounted WIM were not extracted correctly"
fi
rm -rf tmp.apply/*
# Now do some tests using tar.
do_tree_cmp() {
if ! ../tree-cmp $1 $2; then
if [ -x /usr/bin/tree ]; then
echo "Dumping tree of applied image"
tree $2 --inodes -F -s --noreport
error 'Information was lost or corrupted while capturing
and then applying a directory tree'
fi
fi
}
msg() {
echo "--------------------------------------------------------------------"
echo "Testing making $1 on read-write mounted WIM"
echo "--------------------------------------------------------------------"
}
do_test() {
# Create tree, tar it up, and untar it on an empty WIM image mounted
# read-write
cp empty.wim test.wim
cd tmp.orig
eval "$1"
if [ -x /usr/bin/tree ]; then
tree . --inodes -F -s --noreport
fi
tar cf ../test.tar .
cd ..
if ! wimmountrw test.wim tmp.mnt --unix-data; then
error "Failed to mount WIM read-write"
fi
cd tmp.mnt
if ! tar xf ../test.tar; then
error "Failed to untar archive on read-write mounted WIM"
fi
cd ..
# Diff the original tree with the mounted WIM
do_tree_cmp tmp.orig tmp.mnt
# Clear the mounted WIM and do it again! (We need to test deleting
# stuff as well as creating stuff.)
if ! rm -rf tmp.mnt/*; then
error "Failed to clear mounted WIM"
fi
cd tmp.mnt
if ! tar xf ../test.tar; then
error "Failed to untar archive on read-write mounted WIM"
fi
cd ..
# Diff the original tree with the mounted WIM
do_tree_cmp tmp.orig tmp.mnt
# Unmount the WIM, apply it, and diff the original tree with the applied
# tree
if ! imagex_unmount tmp.mnt --commit; then
error "Failed to unmount WIM mounted read-write"
fi
if ! wimapply test.wim tmp.apply; then
error "Failed to apply WIM we previously had mounted read-write"
fi
do_tree_cmp tmp.orig tmp.apply
rm -rf tmp.orig/* tmp.apply/*
}
. $srcdir/tests/common_tests.sh
echo "**********************************************************"
echo " WIM mount tests passed "
echo "**********************************************************"
cd ..
cleanup