cc19dd9803f2353bea10ad27f65c2e7ebd7019f9
[wimlib] / tests / win32-test-imagex-capture_and_apply.bat
1 @echo off\r
2 \r
3 REM\r
4 REM win32-test-imagex-capture_and_apply.bat\r
5 REM\r
6 REM Run some tests on the Windows version of wimlib-imagex.\r
7 REM\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
11 \r
12 setlocal EnableDelayedExpansion\r
13 set WIN32_TREE_CMP=win32-tree-cmp\r
14 set WIMLIB_IMAGEX=wimlib-imagex\r
15 \r
16 if exist in.dir rd /S /Q in.dir\r
17 if exist out.dir rd /S /Q out.dir\r
18 md in.dir\r
19 cd in.dir\r
20 \r
21 REM\r
22 REM BEGIN TESTS\r
23 REM\r
24 \r
25 call :msg "empty directory"\r
26 call :do_test\r
27 if %errorlevel% neq 0 exit /b %errorlevel%\r
28 \r
29 call :msg "single file"\r
30 echo 1 > file\r
31 call :do_test\r
32 if %errorlevel% neq 0 exit /b %errorlevel%\r
33 \r
34 call :msg "different files"\r
35 echo 1 > file\r
36 echo 2 > anotherfile\r
37 call :do_test\r
38 if %errorlevel% neq 0 exit /b %errorlevel%\r
39 \r
40 call :msg "identical files"\r
41 echo 1 > file\r
42 echo 1 > identicalfile\r
43 call :do_test\r
44 if %errorlevel% neq 0 exit /b %errorlevel%\r
45 \r
46 call :msg "hard linked file"\r
47 echo 1 > file\r
48 mklink /h link file > nul\r
49 call :do_test\r
50 if %errorlevel% neq 0 exit /b %errorlevel%\r
51 \r
52 call :msg "hard linked file, with other identical files"\r
53 echo 1 > file\r
54 mklink /h link file > nul\r
55 echo 1 > identicalfile\r
56 call :do_test\r
57 if %errorlevel% neq 0 exit /b %errorlevel%\r
58 \r
59 call :msg "empty file"\r
60 type nul > emptyfile\r
61 call :do_test\r
62 if %errorlevel% neq 0 exit /b %errorlevel%\r
63 \r
64 call :msg "hard linked empty file"\r
65 type nul > file\r
66 mklink /h link file > nul\r
67 call :do_test\r
68 if %errorlevel% neq 0 exit /b %errorlevel%\r
69 \r
70 call :msg "various hard linked, identical, different, and empty files"\r
71 echo 1 > file\r
72 echo 5 > file\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
79 echo 1 > 1file\r
80 mklink /h 1filelink 1file > nul\r
81 call :do_test\r
82 if %errorlevel% neq 0 exit /b %errorlevel%\r
83 \r
84 call :msg "multiple subdirectories, some empty, some not"\r
85 md subdir1\r
86 md subdir2\r
87 md subdir3\r
88 echo 1 > subdir1\1\r
89 echo 5 > subdir1\5\r
90 mklink /h link subdir1\1 > nul\r
91 md subdir2\subdir2subdir\r
92 type nul > subdir2\emptyfile\r
93 call :do_test\r
94 if %errorlevel% neq 0 exit /b %errorlevel%\r
95 \r
96 call :msg "file with custom security descriptor"\r
97 echo hello > file\r
98 icacls file /deny Administrator:F > nul\r
99 call :do_test\r
100 if %errorlevel% neq 0 exit /b %errorlevel%\r
101 \r
102 call :msg "directory with custom security descriptor (inheritence enabled)"\r
103 md subdir\r
104 icacls subdir /inheritance:e > nul\r
105 call :do_test\r
106 if %errorlevel% neq 0 exit /b %errorlevel%\r
107 \r
108 call :msg "directory with custom security descriptor (inheritence disabled)"\r
109 md subdir\r
110 icacls subdir /inheritance:d > nul\r
111 call :do_test\r
112 if %errorlevel% neq 0 exit /b %errorlevel%\r
113 \r
114 REM            win32-tree-cmp can't handle this case.\r
115 REM\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
119 REM call :do_test\r
120 REM if %errorlevel% neq 0 exit /b %errorlevel%\r
121 \r
122 call :msg "file with custom integrity level"\r
123 echo hello > file\r
124 icacls file /setintegritylevel H > nul\r
125 call :do_test\r
126 if %errorlevel% neq 0 exit /b %errorlevel%\r
127 \r
128 call :msg "relative symlink"\r
129 mklink relink dest > nul\r
130 call :do_test\r
131 if %errorlevel% neq 0 exit /b %errorlevel%\r
132 \r
133 call :msg "absolute symlink, with drive letter"\r
134 mklink abslink C:\absolute\target > nul\r
135 call :do_test\r
136 if %errorlevel% neq 0 exit /b %errorlevel%\r
137 \r
138 call :msg "absolute symlink, without drive letter"\r
139 mklink abslink \absolute\target > nul\r
140 call :do_test\r
141 if %errorlevel% neq 0 exit /b %errorlevel%\r
142 \r
143 call :msg "relative symlink, with file target"\r
144 echo 1 > 1\r
145 mklink relink 1 > nul\r
146 call :do_test\r
147 if %errorlevel% neq 0 exit /b %errorlevel%\r
148 \r
149 call :msg "relative symlink, with directory target"\r
150 md subdir\r
151 mklink reldlink subdir > nul\r
152 call :do_test\r
153 if %errorlevel% neq 0 exit /b %errorlevel%\r
154 \r
155 call :msg "junction"\r
156 md subdir\r
157 mklink /j junction subdir > nul\r
158 call :do_test\r
159 if %errorlevel% neq 0 exit /b %errorlevel%\r
160 \r
161 call :msg "symlinks, junctions, files, subdirectories, etc."\r
162 echo 1 > 1\r
163 mklink relink 1 > nul\r
164 mklink rellinklink relink > nul\r
165 mklink /j junction . > nul\r
166 md subdir\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
171 md subdir2\r
172 type nul > emptyfile\r
173 type nul > subdir2\emptyfile\r
174 md subdir2\s\r
175 md subdir2\s\s\r
176 md subdir2\s\s\s\r
177 echo "hello world!!!!" > subdir2\otherfile\r
178 call :do_test\r
179 if %errorlevel% neq 0 exit /b %errorlevel%\r
180 \r
181 call :msg "compressed file"\r
182 echo "test" > test\r
183 compact /C test > nul\r
184 call :do_test\r
185 if %errorlevel% neq 0 exit /b %errorlevel%\r
186 \r
187 call :msg "compressed directory"\r
188 md subdir\r
189 compact /C subdir > nul\r
190 call :do_test\r
191 if %errorlevel% neq 0 exit /b %errorlevel%\r
192 \r
193 call :msg "compressed directory with files in it"\r
194 md subdir\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
202 call :do_test\r
203 if %errorlevel% neq 0 exit /b %errorlevel%\r
204 \r
205 call :msg "compressed directory with some uncompressed files in it"\r
206 md subdir\r
207 compact /C subdir > nul\r
208 echo 1 > subdir\1\r
209 echo 5 > subdir\5\r
210 compact /U subdir\1 > nul\r
211 call :do_test\r
212 if %errorlevel% neq 0 exit /b %errorlevel%\r
213 \r
214 call :msg "file with alternate data stream"\r
215 echo 1 > file\r
216 echo 5 > file:ads\r
217 call :do_test\r
218 if %errorlevel% neq 0 exit /b %errorlevel%\r
219 \r
220 call :msg "file with multiple alternate data streams"\r
221 echo 1 > file\r
222 echo a > file:a\r
223 echo aa > file:aa\r
224 echo aaa > file:aaa\r
225 echo aaaa > file:aaaa\r
226 call :do_test\r
227 if %errorlevel% neq 0 exit /b %errorlevel%\r
228 \r
229 call :msg "file with multiple alternate data streams, with hard link"\r
230 echo 1 > file\r
231 echo a > file:a\r
232 echo aa > file:aa\r
233 echo aaa > file:aaa\r
234 echo aaaa > file:aaaa\r
235 mklink /h link file > nul\r
236 call :do_test\r
237 if %errorlevel% neq 0 exit /b %errorlevel%\r
238 \r
239 call :msg "files with multiple alternate data streams, some identical, with hard link"\r
240 echo 1 > file\r
241 echo 5 > file2\r
242 echo 1 > file:1\r
243 echo 1 > file:1again\r
244 echo aaa > file:aaa\r
245 echo 5 > file:5\r
246 mklink /h link file > nul\r
247 echo aaa > file2:aaa\r
248 call :do_test\r
249 if %errorlevel% neq 0 exit /b %errorlevel%\r
250 \r
251 call :msg "file with empty alternate data stream"\r
252 echo 1 > file\r
253 type nul > file:ads\r
254 call :do_test\r
255 if %errorlevel% neq 0 exit /b %errorlevel%\r
256 \r
257 call :msg "directory with empty alternate data stream"\r
258 md subdir\r
259 type nul > subdir:ads\r
260 call :do_test\r
261 if %errorlevel% neq 0 exit /b %errorlevel%\r
262 \r
263 call :msg "root directory with alternate data stream"\r
264 echo 1 > ..\in.dir:ads\r
265 call :do_test\r
266 if %errorlevel% neq 0 exit /b %errorlevel%\r
267 \r
268 call :msg "subdirectory with alternate data streams"\r
269 md subdir\r
270 echo 1 > subdir:1\r
271 echo 2 > subdir:2\r
272 echo 2 > subdir:2again\r
273 call :do_test\r
274 if %errorlevel% neq 0 exit /b %errorlevel%\r
275 \r
276 call :msg "subdirectories and files with alternate data streams"\r
277 md subdir\r
278 echo hello > hello\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
285 echo 1 > 1\r
286 type nul > helloagain:dummy\r
287 call :do_test\r
288 if %errorlevel% neq 0 exit /b %errorlevel%\r
289 \r
290 call :msg "symbolic link and hard link, to file with alternate data streams"\r
291 echo 1 > 1\r
292 echo test > .\1:test\r
293 mklink symlink 1 > nul\r
294 mklink /h hardlink 1 > nul\r
295 call :do_test\r
296 if %errorlevel% neq 0 exit /b %errorlevel%\r
297 \r
298 call :msg "compressed file with alternate data streams"\r
299 echo 1 > 1\r
300 echo 1 > .\1:1\r
301 echo 2 > .\1:2\r
302 compact /C 1 > nul\r
303 call :do_test\r
304 if %errorlevel% neq 0 exit /b %errorlevel%\r
305 \r
306 call :msg "hidden file"\r
307 echo 1 > hidden\r
308 attrib +h hidden\r
309 call :do_test\r
310 if %errorlevel% neq 0 exit /b %errorlevel%\r
311 \r
312 call :msg "hidden system file"\r
313 echo 1 > file\r
314 attrib +h +s file\r
315 call :do_test\r
316 if %errorlevel% neq 0 exit /b %errorlevel%\r
317 \r
318 call :msg "hidden, readonly, system file"\r
319 echo 1 > file\r
320 attrib +h +r +s file\r
321 call :do_test\r
322 if %errorlevel% neq 0 exit /b %errorlevel%\r
323 \r
324 call :msg "hidden directory"\r
325 md subdir\r
326 attrib +h subdir\r
327 call :do_test\r
328 if %errorlevel% neq 0 exit /b %errorlevel%\r
329 \r
330 call :msg "hidden system directory"\r
331 md subdir\r
332 attrib +h +s subdir\r
333 call :do_test\r
334 if %errorlevel% neq 0 exit /b %errorlevel%\r
335 \r
336 call :msg "hidden, readonly, system directory"\r
337 md subdir\r
338 attrib +h +r +s subdir\r
339 call :do_test\r
340 if %errorlevel% neq 0 exit /b %errorlevel%\r
341 \r
342 call :msg "encrypted file"\r
343 echo "hello" > encrypted\r
344 cipher /e encrypted > nul\r
345 call :do_test\r
346 if %errorlevel% neq 0 exit /b %errorlevel%\r
347 \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
353 call :do_test\r
354 if %errorlevel% neq 0 exit /b %errorlevel%\r
355 \r
356 call :msg "encrypted directory"\r
357 md subdir\r
358 cipher /e subdir > nul\r
359 call :do_test\r
360 if %errorlevel% neq 0 exit /b %errorlevel%\r
361 \r
362 call :msg "encrypted directory with encrypted file in it"\r
363 md subdir\r
364 echo 1 > subdir\1\r
365 cipher /e subdir > nul\r
366 cipher /e subdir\1 > nul\r
367 call :do_test\r
368 if %errorlevel% neq 0 exit /b %errorlevel%\r
369 \r
370 call :msg "encrypted directory with unencrypted file in it"\r
371 md subdir\r
372 echo 1 > subdir\1\r
373 cipher /e subdir > nul\r
374 cipher /d subdir\1 > nul\r
375 call :do_test\r
376 if %errorlevel% neq 0 exit /b %errorlevel%\r
377 \r
378 call :msg "encrypted root directory"\r
379 cd ..\r
380 cipher /e in.dir > nul\r
381 cd in.dir\r
382 echo "hello" > encrypted\r
383 call :do_test\r
384 if %errorlevel% neq 0 exit /b %errorlevel%\r
385 \r
386 call :msg "unencrypted file in encrypted directory in compressed directory"\r
387 md 1\r
388 md 1\2\r
389 compact /c 1 > nul\r
390 cipher /e 1\2 > nul\r
391 echo hello > 1\2\file\r
392 cipher /d 1\2\file > nul\r
393 call :do_test\r
394 if %errorlevel% neq 0 exit /b %errorlevel%\r
395 \r
396 call :msg "encrypted directory with alternate data streams"\r
397 md subdir\r
398 cipher /e subdir > nul\r
399 echo ads1 > subdir:ads1\r
400 echo ads2 > subdir:ads2\r
401 call :do_test\r
402 if %errorlevel% neq 0 exit /b %errorlevel%\r
403 \r
404 call :msg "hardlinked, encrypted file with alternate data streams"\r
405 echo hello > file\r
406 echo hello > file:ads\r
407 cipher /e file > nul\r
408 mklink /h link file > nul\r
409 call :do_test\r
410 if %errorlevel% neq 0 exit /b %errorlevel%\r
411 \r
412 :rpfix_tests\r
413 \r
414 echo Testing rpfix junction\r
415 md subdir\r
416 echo 1 > subdir\file\r
417 mklink /j junction subdir > nul\r
418 cd ..\r
419 %WIMLIB_IMAGEX% capture in.dir test.wim > nul\r
420 rd /s /q in.dir\r
421 %WIMLIB_IMAGEX% apply test.wim out.dir > nul\r
422 echo 1 > tmp1\r
423 type out.dir\junction\file > tmp2\r
424 fc tmp1 tmp2 > nul\r
425 if %errorlevel% neq 0 exit /b %errorlevel%\r
426 rd /s /q out.dir\r
427 del tmp1 tmp2\r
428 md in.dir\r
429 cd in.dir\r
430 \r
431 echo Testing rpfix relative\r
432 echo 1 > file\r
433 mklink relink file > nul\r
434 cd ..\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
440 md in.dir\r
441 cd in.dir\r
442 \r
443 REM\r
444 REM END OF TESTS\r
445 REM\r
446 \r
447 cd ..\r
448 del test.wim\r
449 rd /s /q in.dir\r
450 exit /b 0\r
451 \r
452 :do_test\r
453 cd ..\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
464 )\r
465 \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
469 rd /S /Q out.dir\r
470 md out.dir\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
476 \r
477 rd /S /Q in.dir out.dir\r
478 md in.dir\r
479 cd in.dir\r
480 goto :eof\r
481 \r
482 :msg\r
483 echo Testing capture and apply of %~1\r
484 goto :eof\r