4 REM win32-test-imagex-capture_and_apply.bat
\r
6 REM Run some tests on the Windows version of wimlib-imagex.
\r
8 REM This must be run on Windows Vista or later in a clean directory, with
\r
9 REM Administrator privileges. wimlib-imagex and win32-tree-cmp must be
\r
10 REM executable using the paths set below.
\r
12 setlocal EnableDelayedExpansion
\r
13 set WIN32_TREE_CMP=win32-tree-cmp
\r
14 set WIMLIB_IMAGEX=wimlib-imagex
\r
16 if exist in.dir rd /S /Q in.dir
\r
17 if exist out.dir rd /S /Q out.dir
\r
25 call :msg "empty directory"
\r
27 if %errorlevel% neq 0 goto :fail
\r
29 call :msg "single file"
\r
32 if %errorlevel% neq 0 goto :fail
\r
34 call :msg "different files"
\r
36 echo 2 > anotherfile
\r
38 if %errorlevel% neq 0 goto :fail
\r
40 call :msg "identical files"
\r
42 echo 1 > identicalfile
\r
44 if %errorlevel% neq 0 goto :fail
\r
46 call :msg "hard linked file"
\r
48 mklink /h link file > nul
\r
50 if %errorlevel% neq 0 goto :fail
\r
52 call :msg "hard linked file, with other identical files"
\r
54 mklink /h link file > nul
\r
55 echo 1 > identicalfile
\r
57 if %errorlevel% neq 0 goto :fail
\r
59 call :msg "empty file"
\r
60 type nul > emptyfile
\r
62 if %errorlevel% neq 0 goto :fail
\r
64 call :msg "hard linked empty file"
\r
66 mklink /h link file > nul
\r
68 if %errorlevel% neq 0 goto :fail
\r
70 call :msg "various hard linked, identical, different, and empty files"
\r
73 mklink /h link1 file > nul
\r
74 mklink /h link2 file > nul
\r
75 type nul > emptyfile
\r
76 type nul > emptyfile2
\r
77 mklink /h emptyfilelink emptyfile > nul
\r
78 echo 5 > identicalfile
\r
80 mklink /h 1filelink 1file > nul
\r
82 if %errorlevel% neq 0 goto :fail
\r
84 call :msg "multiple subdirectories, some empty, some not"
\r
90 mklink /h link subdir1\1 > nul
\r
91 md subdir2\subdir2subdir
\r
92 type nul > subdir2\emptyfile
\r
94 if %errorlevel% neq 0 goto :fail
\r
96 call :msg "file with custom security descriptor"
\r
98 icacls file /deny Administrator:F > nul
\r
100 if %errorlevel% neq 0 goto :fail
\r
102 call :msg "directory with custom security descriptor (inheritence enabled)"
\r
104 icacls subdir /inheritance:e > nul
\r
106 if %errorlevel% neq 0 goto :fail
\r
108 call :msg "directory with custom security descriptor (inheritence disabled)"
\r
110 icacls subdir /inheritance:d > nul
\r
112 if %errorlevel% neq 0 goto :fail
\r
114 REM win32-tree-cmp can't handle this case.
\r
116 REM call :msg "file with custom security descriptor (all inherited ACEs removed)"
\r
117 REM echo hello > file
\r
118 REM icacls file /inheritance:r > nul
\r
120 REM if %errorlevel% neq 0 goto :fail
\r
122 call :msg "file with custom integrity level"
\r
124 icacls file /setintegritylevel H > nul
\r
126 if %errorlevel% neq 0 goto :fail
\r
128 call :msg "relative symlink"
\r
129 mklink relink dest > nul
\r
131 if %errorlevel% neq 0 goto :fail
\r
133 call :msg "absolute symlink, with drive letter"
\r
134 mklink abslink C:\absolute\target > nul
\r
136 if %errorlevel% neq 0 goto :fail
\r
138 call :msg "absolute symlink, without drive letter"
\r
139 mklink abslink \absolute\target > nul
\r
141 if %errorlevel% neq 0 goto :fail
\r
143 call :msg "relative symlink, with file target"
\r
145 mklink relink 1 > nul
\r
147 if %errorlevel% neq 0 goto :fail
\r
149 call :msg "relative symlink, with directory target"
\r
151 mklink reldlink subdir > nul
\r
153 if %errorlevel% neq 0 goto :fail
\r
155 call :msg "junction"
\r
157 mklink /j junction subdir > nul
\r
159 if %errorlevel% neq 0 goto :fail
\r
161 call :msg "symlinks, junctions, files, subdirectories, etc."
\r
163 mklink relink 1 > nul
\r
164 mklink rellinklink relink > nul
\r
165 mklink /j junction . > nul
\r
167 mklink /h subdir\hardlink 1 > nul
\r
168 echo "hello world!!!!" > hello
\r
169 mklink subdir\hello hello > nul
\r
170 mklink abslink C:\Users > nul
\r
172 type nul > emptyfile
\r
173 type nul > subdir2\emptyfile
\r
177 echo "hello world!!!!" > subdir2\otherfile
\r
179 if %errorlevel% neq 0 goto :fail
\r
181 call :msg "compressed file"
\r
183 compact /C test > nul
\r
185 if %errorlevel% neq 0 goto :fail
\r
187 call :msg "compressed directory"
\r
189 compact /C subdir > nul
\r
191 if %errorlevel% neq 0 goto :fail
\r
193 call :msg "compressed directory with files in it"
\r
195 compact /C subdir > nul
\r
196 echo 1 > subdir\file1
\r
197 echo 2 > subdir\file2
\r
198 echo 1 > subdir\file1
\r
199 md subdir\subsubdir
\r
200 mklink /h subdir\hardlink subdir\file1 > nul
\r
201 mklink /j subdir\j subdir\subsubdir > nul
\r
203 if %errorlevel% neq 0 goto :fail
\r
205 call :msg "compressed directory with some uncompressed files in it"
\r
207 compact /C subdir > nul
\r
210 compact /U subdir\1 > nul
\r
212 if %errorlevel% neq 0 goto :fail
\r
214 call :msg "file with alternate data stream"
\r
218 if %errorlevel% neq 0 goto :fail
\r
220 call :msg "file with multiple alternate data streams"
\r
224 echo aaa > file:aaa
\r
225 echo aaaa > file:aaaa
\r
227 if %errorlevel% neq 0 goto :fail
\r
229 call :msg "file with multiple alternate data streams, with hard link"
\r
233 echo aaa > file:aaa
\r
234 echo aaaa > file:aaaa
\r
235 mklink /h link file > nul
\r
237 if %errorlevel% neq 0 goto :fail
\r
239 call :msg "files with multiple alternate data streams, some identical, with hard link"
\r
243 echo 1 > file:1again
\r
244 echo aaa > file:aaa
\r
246 mklink /h link file > nul
\r
247 echo aaa > file2:aaa
\r
249 if %errorlevel% neq 0 goto :fail
\r
251 call :msg "file with empty alternate data stream"
\r
253 type nul > file:ads
\r
255 if %errorlevel% neq 0 goto :fail
\r
257 call :msg "directory with empty alternate data stream"
\r
259 type nul > subdir:ads
\r
261 if %errorlevel% neq 0 goto :fail
\r
263 call :msg "root directory with alternate data stream"
\r
264 echo 1 > ..\in.dir:ads
\r
266 if %errorlevel% neq 0 goto :fail
\r
268 call :msg "root directory with empty alternate data stream"
\r
269 type nul > ..\in.dir:ads
\r
271 if %errorlevel% neq 0 goto :fail
\r
273 call :msg "subdirectory with alternate data streams"
\r
277 echo 2 > subdir:2again
\r
279 if %errorlevel% neq 0 goto :fail
\r
281 call :msg "subdirectories and files with alternate data streams"
\r
284 echo hello > subdir:hello
\r
285 echo hello > subdir:helloagain
\r
286 echo hello > helloagain
\r
287 mklink /h hellolink hello > nul
\r
288 echo 1 > helloagain:1
\r
289 echo 8 > helloagain:8
\r
291 type nul > helloagain:dummy
\r
293 if %errorlevel% neq 0 goto :fail
\r
295 call :msg "symbolic link and hard link, to file with alternate data streams"
\r
297 echo test > .\1:test
\r
298 mklink symlink 1 > nul
\r
299 mklink /h hardlink 1 > nul
\r
301 if %errorlevel% neq 0 goto :fail
\r
303 call :msg "compressed file with alternate data streams"
\r
309 if %errorlevel% neq 0 goto :fail
\r
311 call :msg "hidden file"
\r
315 if %errorlevel% neq 0 goto :fail
\r
317 call :msg "hidden system file"
\r
321 if %errorlevel% neq 0 goto :fail
\r
323 call :msg "hidden, readonly, system file"
\r
325 attrib +h +r +s file
\r
327 if %errorlevel% neq 0 goto :fail
\r
329 call :msg "hidden directory"
\r
333 if %errorlevel% neq 0 goto :fail
\r
335 call :msg "hidden system directory"
\r
337 attrib +h +s subdir
\r
339 if %errorlevel% neq 0 goto :fail
\r
341 call :msg "hidden, readonly, system directory"
\r
343 attrib +h +r +s subdir
\r
345 if %errorlevel% neq 0 goto :fail
\r
347 call :msg "readonly directory with named data stream"
\r
349 echo foo > subdir:ads
\r
352 if %errorlevel% neq 0 goto :fail
\r
354 call :msg "encrypted file"
\r
355 echo "hello" > encrypted
\r
356 cipher /e encrypted > nul
\r
358 if %errorlevel% neq 0 goto :fail
\r
360 call :msg "identical encrypted files"
\r
361 echo "hello" > encrypted1
\r
362 echo "hello" > encrypted2
\r
363 cipher /e encrypted1 > nul
\r
364 cipher /e encrypted2 > nul
\r
366 if %errorlevel% neq 0 goto :fail
\r
368 call :msg "encrypted directory"
\r
370 cipher /e subdir > nul
\r
372 if %errorlevel% neq 0 goto :fail
\r
374 call :msg "encrypted directory with encrypted file in it"
\r
377 cipher /e subdir > nul
\r
378 cipher /e subdir\1 > nul
\r
380 if %errorlevel% neq 0 goto :fail
\r
382 call :msg "encrypted directory with unencrypted file in it"
\r
385 cipher /e subdir > nul
\r
386 cipher /d subdir\1 > nul
\r
388 if %errorlevel% neq 0 goto :fail
\r
390 call :msg "encrypted root directory"
\r
392 cipher /e in.dir > nul
\r
394 echo "hello" > encrypted
\r
396 if %errorlevel% neq 0 goto :fail
\r
398 call :msg "unencrypted file in encrypted directory in compressed directory"
\r
402 cipher /e 1\2 > nul
\r
403 echo hello > 1\2\file
\r
404 cipher /d 1\2\file > nul
\r
406 if %errorlevel% neq 0 goto :fail
\r
408 call :msg "encrypted directory with alternate data streams"
\r
410 cipher /e subdir > nul
\r
411 echo ads1 > subdir:ads1
\r
412 echo ads2 > subdir:ads2
\r
414 if %errorlevel% neq 0 goto :fail
\r
416 call :msg "hardlinked, encrypted file with alternate data streams"
\r
418 echo hello > file:ads
\r
419 cipher /e file > nul
\r
420 mklink /h link file > nul
\r
422 if %errorlevel% neq 0 goto :fail
\r
426 echo Testing rpfix junction
\r
428 echo 1 > subdir\file
\r
429 mklink /j junction subdir > nul
\r
431 %WIMLIB_IMAGEX% capture in.dir test.wim > nul
\r
433 %WIMLIB_IMAGEX% apply test.wim out.dir > nul
\r
435 type out.dir\junction\file > tmp2
\r
437 if %errorlevel% neq 0 goto :fail
\r
443 echo Testing rpfix relative
\r
445 mklink relink file > nul
\r
447 %WIMLIB_IMAGEX% capture in.dir test.wim > nul
\r
448 %WIMLIB_IMAGEX% apply test.wim out.dir > nul
\r
449 type out.dir\relink > out.dir\tmp
\r
450 if %errorlevel% neq 0 goto :fail
\r
451 fc in.dir\file out.dir\tmp > nul
\r
452 if %errorlevel% neq 0 goto :fail
\r
453 rd /s /q in.dir out.dir
\r
468 %WIMLIB_IMAGEX% capture in.dir test.wim --norpfix > NUL
\r
469 if %errorlevel% neq 0 goto :fail
\r
470 %WIMLIB_IMAGEX% apply test.wim out.dir > NUL
\r
471 if %errorlevel% neq 0 goto :fail
\r
472 %WIN32_TREE_CMP% in.dir out.dir
\r
473 if %errorlevel% neq 0 goto :fail
\r
475 REM apply a second time so we test the case where the files already exist
\r
476 %WIMLIB_IMAGEX% apply test.wim out.dir > NUL
\r
477 if %errorlevel% neq 0 goto :fail
\r
478 %WIN32_TREE_CMP% in.dir out.dir
\r
479 if %errorlevel% neq 0 goto :fail
\r
481 REM Fun fact: Microsoft's WIMGAPI has bugs that make it fail some of our tests.
\r
482 REM Even the Windows 8.1 version has incorrect behavior with empty files with
\r
483 REM multiple links, or files with named data streams and multiple links.
\r
486 REM dism /capture-image /capturedir:in.dir /imagefile:test.wim /name:"test" /norpfix > nul
\r
487 REM if %errorlevel% neq 0 goto :fail
\r
488 dism /apply-image /imagefile:test.wim /index:1 /applydir:out.dir > nul
\r
489 if %errorlevel% neq 0 goto :fail
\r
490 %WIN32_TREE_CMP% in.dir out.dir
\r
492 rd /S /Q in.dir out.dir
\r
498 echo Testing capture and apply of %~1
\r
502 echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
503 echo TEST FAILED!!!!!!!
\r
504 echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
505 exit /b %errorlevel%
\r