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 exit /b %errorlevel%
\r
29 call :msg "single file"
\r
32 if %errorlevel% neq 0 exit /b %errorlevel%
\r
34 call :msg "different files"
\r
36 echo 2 > anotherfile
\r
38 if %errorlevel% neq 0 exit /b %errorlevel%
\r
40 call :msg "identical files"
\r
42 echo 1 > identicalfile
\r
44 if %errorlevel% neq 0 exit /b %errorlevel%
\r
46 call :msg "hard linked file"
\r
48 mklink /h link file > nul
\r
50 if %errorlevel% neq 0 exit /b %errorlevel%
\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 exit /b %errorlevel%
\r
59 call :msg "empty file"
\r
60 type nul > emptyfile
\r
62 if %errorlevel% neq 0 exit /b %errorlevel%
\r
64 call :msg "hard linked empty file"
\r
66 mklink /h link file > nul
\r
68 if %errorlevel% neq 0 exit /b %errorlevel%
\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 exit /b %errorlevel%
\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 exit /b %errorlevel%
\r
96 call :msg "file with custom security descriptor"
\r
98 icacls file /deny Administrator:F > nul
\r
100 if %errorlevel% neq 0 exit /b %errorlevel%
\r
102 call :msg "directory with custom security descriptor (inheritence enabled)"
\r
104 icacls subdir /inheritance:e > nul
\r
106 if %errorlevel% neq 0 exit /b %errorlevel%
\r
108 call :msg "directory with custom security descriptor (inheritence disabled)"
\r
110 icacls subdir /inheritance:d > nul
\r
112 if %errorlevel% neq 0 exit /b %errorlevel%
\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 exit /b %errorlevel%
\r
122 call :msg "file with custom integrity level"
\r
124 icacls file /setintegritylevel H > nul
\r
126 if %errorlevel% neq 0 exit /b %errorlevel%
\r
128 call :msg "relative symlink"
\r
129 mklink relink dest > nul
\r
131 if %errorlevel% neq 0 exit /b %errorlevel%
\r
133 call :msg "absolute symlink, with drive letter"
\r
134 mklink abslink C:\absolute\target > nul
\r
136 if %errorlevel% neq 0 exit /b %errorlevel%
\r
138 call :msg "absolute symlink, without drive letter"
\r
139 mklink abslink \absolute\target > nul
\r
141 if %errorlevel% neq 0 exit /b %errorlevel%
\r
143 call :msg "relative symlink, with file target"
\r
145 mklink relink 1 > nul
\r
147 if %errorlevel% neq 0 exit /b %errorlevel%
\r
149 call :msg "relative symlink, with directory target"
\r
151 mklink reldlink subdir > nul
\r
153 if %errorlevel% neq 0 exit /b %errorlevel%
\r
155 call :msg "junction"
\r
157 mklink /j junction subdir > nul
\r
159 if %errorlevel% neq 0 exit /b %errorlevel%
\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 exit /b %errorlevel%
\r
181 call :msg "compressed file"
\r
183 compact /C test > nul
\r
185 if %errorlevel% neq 0 exit /b %errorlevel%
\r
187 call :msg "compressed directory"
\r
189 compact /C subdir > nul
\r
191 if %errorlevel% neq 0 exit /b %errorlevel%
\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 exit /b %errorlevel%
\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 exit /b %errorlevel%
\r
214 call :msg "file with alternate data stream"
\r
218 if %errorlevel% neq 0 exit /b %errorlevel%
\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 exit /b %errorlevel%
\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 exit /b %errorlevel%
\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 exit /b %errorlevel%
\r
251 call :msg "file with empty alternate data stream"
\r
253 type nul > file:ads
\r
255 if %errorlevel% neq 0 exit /b %errorlevel%
\r
257 call :msg "directory with empty alternate data stream"
\r
259 type nul > subdir:ads
\r
261 if %errorlevel% neq 0 exit /b %errorlevel%
\r
263 call :msg "root directory with alternate data stream"
\r
264 echo 1 > ..\in.dir:ads
\r
266 if %errorlevel% neq 0 exit /b %errorlevel%
\r
268 call :msg "subdirectory with alternate data streams"
\r
272 echo 2 > subdir:2again
\r
274 if %errorlevel% neq 0 exit /b %errorlevel%
\r
276 call :msg "subdirectories and files with alternate data streams"
\r
279 echo hello > subdir:hello
\r
280 echo hello > subdir:helloagain
\r
281 echo hello > helloagain
\r
282 mklink /h hellolink hello > nul
\r
283 echo 1 > helloagain:1
\r
284 echo 8 > helloagain:8
\r
286 type nul > helloagain:dummy
\r
288 if %errorlevel% neq 0 exit /b %errorlevel%
\r
290 call :msg "symbolic link and hard link, to file with alternate data streams"
\r
292 echo test > .\1:test
\r
293 mklink symlink 1 > nul
\r
294 mklink /h hardlink 1 > nul
\r
296 if %errorlevel% neq 0 exit /b %errorlevel%
\r
298 call :msg "compressed file with alternate data streams"
\r
304 if %errorlevel% neq 0 exit /b %errorlevel%
\r
306 call :msg "hidden file"
\r
310 if %errorlevel% neq 0 exit /b %errorlevel%
\r
312 call :msg "hidden system file"
\r
316 if %errorlevel% neq 0 exit /b %errorlevel%
\r
318 call :msg "hidden, readonly, system file"
\r
320 attrib +h +r +s file
\r
322 if %errorlevel% neq 0 exit /b %errorlevel%
\r
324 call :msg "hidden directory"
\r
328 if %errorlevel% neq 0 exit /b %errorlevel%
\r
330 call :msg "hidden system directory"
\r
332 attrib +h +s subdir
\r
334 if %errorlevel% neq 0 exit /b %errorlevel%
\r
336 call :msg "hidden, readonly, system directory"
\r
338 attrib +h +r +s subdir
\r
340 if %errorlevel% neq 0 exit /b %errorlevel%
\r
342 call :msg "encrypted file"
\r
343 echo "hello" > encrypted
\r
344 cipher /e encrypted > nul
\r
346 if %errorlevel% neq 0 exit /b %errorlevel%
\r
348 call :msg "identical encrypted files"
\r
349 echo "hello" > encrypted1
\r
350 echo "hello" > encrypted2
\r
351 cipher /e encrypted1 > nul
\r
352 cipher /e encrypted2 > nul
\r
354 if %errorlevel% neq 0 exit /b %errorlevel%
\r
356 call :msg "encrypted directory"
\r
358 cipher /e subdir > nul
\r
360 if %errorlevel% neq 0 exit /b %errorlevel%
\r
362 call :msg "encrypted directory with encrypted file in it"
\r
365 cipher /e subdir > nul
\r
366 cipher /e subdir\1 > nul
\r
368 if %errorlevel% neq 0 exit /b %errorlevel%
\r
370 call :msg "encrypted directory with unencrypted file in it"
\r
373 cipher /e subdir > nul
\r
374 cipher /d subdir\1 > nul
\r
376 if %errorlevel% neq 0 exit /b %errorlevel%
\r
378 call :msg "encrypted root directory"
\r
380 cipher /e in.dir > nul
\r
382 echo "hello" > encrypted
\r
384 if %errorlevel% neq 0 exit /b %errorlevel%
\r
386 call :msg "unencrypted file in encrypted directory in compressed directory"
\r
390 cipher /e 1\2 > nul
\r
391 echo hello > 1\2\file
\r
392 cipher /d 1\2\file > nul
\r
394 if %errorlevel% neq 0 exit /b %errorlevel%
\r
396 call :msg "encrypted directory with alternate data streams"
\r
398 cipher /e subdir > nul
\r
399 echo ads1 > subdir:ads1
\r
400 echo ads2 > subdir:ads2
\r
402 if %errorlevel% neq 0 exit /b %errorlevel%
\r
404 call :msg "hardlinked, encrypted file with alternate data streams"
\r
406 echo hello > file:ads
\r
407 cipher /e file > nul
\r
408 mklink /h link file > nul
\r
410 if %errorlevel% neq 0 exit /b %errorlevel%
\r
414 echo Testing rpfix junction
\r
416 echo 1 > subdir\file
\r
417 mklink /j junction subdir > nul
\r
419 %WIMLIB_IMAGEX% capture in.dir test.wim > nul
\r
421 %WIMLIB_IMAGEX% apply test.wim out.dir > nul
\r
423 type out.dir\junction\file > tmp2
\r
425 if %errorlevel% neq 0 exit /b %errorlevel%
\r
431 echo Testing rpfix relative
\r
433 mklink relink file > nul
\r
435 %WIMLIB_IMAGEX% capture in.dir test.wim > nul
\r
436 %WIMLIB_IMAGEX% apply test.wim out.dir > nul
\r
437 fc in.dir\file out.dir\relink > nul
\r
438 if %errorlevel% neq 0 exit /b %errorlevel%
\r
439 rd /s /q in.dir out.dir
\r
454 %WIMLIB_IMAGEX% capture in.dir test.wim --norpfix > NUL
\r
455 if %errorlevel% neq 0 exit /b %errorlevel%
\r
456 %WIMLIB_IMAGEX% apply test.wim out.dir > NUL
\r
457 if %errorlevel% neq 0 exit /b %errorlevel%
\r
458 %WIN32_TREE_CMP% in.dir out.dir
\r
459 if %errorlevel% neq 0 (
\r
460 echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
461 echo TEST FAILED!!!!!!!
\r
462 echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
463 exit /b %errorlevel%
\r
466 REM Fun fact: Microsoft's WIMGAPI has bugs that make it fail some of our tests.
\r
467 REM Even the Windows 8.1 version has incorrect behavior with empty files with
\r
468 REM multiple links, or files with named data streams and multiple links.
\r
471 REM dism /capture-image /capturedir:in.dir /imagefile:test.wim /name:"test" /norpfix > nul
\r
472 REM if %errorlevel% neq 0 exit /b %errorlevel%
\r
473 dism /apply-image /imagefile:test.wim /index:1 /applydir:out.dir > nul
\r
474 if %errorlevel% neq 0 exit /b %errorlevel%
\r
475 %WIN32_TREE_CMP% in.dir out.dir
\r
477 rd /S /Q in.dir out.dir
\r
483 echo Testing capture and apply of %~1
\r