f4e23ce0554990e72bdad3bb3045122e7f9b238a
[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 WIMLIB_IMAGEX=wimlib-imagex\r
14 set WIN32_TREE_CMP=win32-tree-cmp\r
15 set SET_REPARSE_POINT=set_reparse_point\r
16 \r
17 if exist in.dir rd /S /Q in.dir\r
18 if exist out.dir rd /S /Q out.dir\r
19 md in.dir\r
20 cd in.dir\r
21 \r
22 REM\r
23 REM BEGIN TESTS\r
24 REM\r
25 \r
26 call :msg "empty directory"\r
27 call :do_test\r
28 \r
29 call :msg "single file"\r
30 echo 1 > file\r
31 call :do_test\r
32 \r
33 call :msg "different files"\r
34 echo 1 > file\r
35 echo 2 > anotherfile\r
36 call :do_test\r
37 \r
38 call :msg "identical files"\r
39 echo 1 > file\r
40 echo 1 > identicalfile\r
41 call :do_test\r
42 \r
43 call :msg "hard linked file"\r
44 echo 1 > file\r
45 mklink /h link file > nul\r
46 call :do_test\r
47 \r
48 call :msg "hard linked file, with other identical files"\r
49 echo 1 > file\r
50 mklink /h link file > nul\r
51 echo 1 > identicalfile\r
52 call :do_test\r
53 \r
54 call :msg "empty file"\r
55 type nul > emptyfile\r
56 call :do_test\r
57 \r
58 call :msg "hard linked empty file"\r
59 type nul > file\r
60 mklink /h link file > nul\r
61 call :do_test\r
62 \r
63 call :msg "various hard linked, identical, different, and empty files"\r
64 echo 1 > file\r
65 echo 5 > file\r
66 mklink /h link1 file > nul\r
67 mklink /h link2 file > nul\r
68 type nul > emptyfile\r
69 type nul > emptyfile2\r
70 mklink /h emptyfilelink emptyfile > nul\r
71 echo 5 > identicalfile\r
72 echo 1 > 1file\r
73 mklink /h 1filelink 1file > nul\r
74 call :do_test\r
75 \r
76 call :msg "multiple subdirectories, some empty, some not"\r
77 md subdir1\r
78 md subdir2\r
79 md subdir3\r
80 echo 1 > subdir1\1\r
81 echo 5 > subdir1\5\r
82 mklink /h link subdir1\1 > nul\r
83 md subdir2\subdir2subdir\r
84 type nul > subdir2\emptyfile\r
85 call :do_test\r
86 \r
87 call :msg "file with custom security descriptor"\r
88 echo hello > file\r
89 icacls file /deny Administrator:F > nul\r
90 call :do_test\r
91 \r
92 call :msg "directory with custom security descriptor (inheritence enabled)"\r
93 md subdir\r
94 icacls subdir /inheritance:e > nul\r
95 call :do_test\r
96 \r
97 call :msg "directory with custom security descriptor (inheritence disabled)"\r
98 md subdir\r
99 icacls subdir /inheritance:d > nul\r
100 call :do_test\r
101 \r
102 REM            win32-tree-cmp can't handle this case.\r
103 REM\r
104 REM call :msg "file with custom security descriptor (all inherited ACEs removed)"\r
105 REM echo hello > file\r
106 REM icacls file /inheritance:r > nul\r
107 REM call :do_test\r
108 \r
109 call :msg "file with custom integrity level"\r
110 echo hello > file\r
111 icacls file /setintegritylevel H > nul\r
112 call :do_test\r
113 \r
114 call :msg "relative symlink"\r
115 mklink relink dest > nul\r
116 call :do_test\r
117 \r
118 call :msg "absolute symlink, with drive letter"\r
119 mklink abslink C:\absolute\target > nul\r
120 call :do_test\r
121 \r
122 call :msg "absolute symlink, without drive letter"\r
123 mklink abslink \absolute\target > nul\r
124 call :do_test\r
125 \r
126 call :msg "relative symlink, with file target"\r
127 echo 1 > 1\r
128 mklink relink 1 > nul\r
129 call :do_test\r
130 \r
131 call :msg "relative symlink, with directory target"\r
132 md subdir\r
133 mklink reldlink subdir > nul\r
134 call :do_test\r
135 \r
136 call :msg "junction"\r
137 md subdir\r
138 mklink /j junction subdir > nul\r
139 call :do_test\r
140 \r
141 call :msg "symlinks, junctions, files, subdirectories, etc."\r
142 echo 1 > 1\r
143 mklink relink 1 > nul\r
144 mklink rellinklink relink > nul\r
145 mklink /j junction . > nul\r
146 md subdir\r
147 mklink /h subdir\hardlink 1 > nul\r
148 echo "hello world!!!!" > hello\r
149 mklink subdir\hello hello > nul\r
150 mklink abslink C:\Users > nul\r
151 md subdir2\r
152 type nul > emptyfile\r
153 type nul > subdir2\emptyfile\r
154 md subdir2\s\r
155 md subdir2\s\s\r
156 md subdir2\s\s\s\r
157 echo "hello world!!!!" > subdir2\otherfile\r
158 call :do_test\r
159 \r
160 call :msg "reparse point that is neither a symlink nor a junction"\r
161 type nul > file\r
162 %SET_REPARSE_POINT% file\r
163 call :do_test\r
164 \r
165 call :msg "reparse point with named data streams"\r
166 type nul > file\r
167 echo 11 > file:a\r
168 echo 1 > file:aa\r
169 %SET_REPARSE_POINT% file\r
170 call :do_test\r
171 \r
172 call :msg "reparse point with unnamed data stream"\r
173 echo "test" > file\r
174 %SET_REPARSE_POINT% file\r
175 call :do_test\r
176 \r
177 call :msg "reparse point with unnamed data stream and named data streams"\r
178 echo "test" > file\r
179 echo 11 > file:a\r
180 echo 1 > file:aa\r
181 %SET_REPARSE_POINT% file\r
182 call :do_test\r
183 \r
184 call :msg "empty reparse point"\r
185 type nul > file\r
186 %SET_REPARSE_POINT% file 0\r
187 call :do_test\r
188 \r
189 call :msg "empty reparse point with unnamed data stream"\r
190 echo hello > file\r
191 %SET_REPARSE_POINT% file 0\r
192 call :do_test\r
193 \r
194 call :msg "empty reparse point with unnamed data stream and named data streams"\r
195 echo hello > file\r
196 echo hello > file:ads1\r
197 type nul > file:ads2\r
198 %SET_REPARSE_POINT% file 0\r
199 call :do_test\r
200 \r
201 call :msg "maximum length reparse point"\r
202 type nul > file\r
203 %SET_REPARSE_POINT% file 16376\r
204 call :do_test\r
205 \r
206 call :msg "directory reparse point that is neither a symlink nor a junction"\r
207 md subdir\r
208 %SET_REPARSE_POINT% subdir\r
209 call :do_test\r
210 \r
211 call :msg "directory reparse point with named data streams"\r
212 md subdir\r
213 echo 11 > subdir:a\r
214 echo 1 > subdir:aa\r
215 %SET_REPARSE_POINT% subdir\r
216 call :do_test\r
217 \r
218 call :msg "compressed file"\r
219 echo "test" > test\r
220 compact /C test > nul\r
221 call :do_test\r
222 \r
223 call :msg "compressed directory"\r
224 md subdir\r
225 compact /C subdir > nul\r
226 call :do_test\r
227 \r
228 call :msg "compressed directory with files in it"\r
229 md subdir\r
230 compact /C subdir > nul\r
231 echo 1 > subdir\file1\r
232 echo 2 > subdir\file2\r
233 echo 1 > subdir\file1\r
234 md subdir\subsubdir\r
235 mklink /h subdir\hardlink subdir\file1 > nul\r
236 mklink /j subdir\j subdir\subsubdir > nul\r
237 call :do_test\r
238 \r
239 call :msg "compressed directory with some uncompressed files in it"\r
240 md subdir\r
241 compact /C subdir > nul\r
242 echo 1 > subdir\1\r
243 echo 5 > subdir\5\r
244 compact /U subdir\1 > nul\r
245 call :do_test\r
246 \r
247 call :msg "file with alternate data stream"\r
248 echo 1 > file\r
249 echo 5 > file:ads\r
250 call :do_test\r
251 \r
252 call :msg "file with multiple alternate data streams"\r
253 echo 1 > file\r
254 echo a > file:a\r
255 echo aa > file:aa\r
256 echo aaa > file:aaa\r
257 echo aaaa > file:aaaa\r
258 call :do_test\r
259 \r
260 call :msg "file with multiple alternate data streams, with hard link"\r
261 echo 1 > file\r
262 echo a > file:a\r
263 echo aa > file:aa\r
264 echo aaa > file:aaa\r
265 echo aaaa > file:aaaa\r
266 mklink /h link file > nul\r
267 call :do_test\r
268 \r
269 call :msg "files with multiple alternate data streams, some identical, with hard link"\r
270 echo 1 > file\r
271 echo 5 > file2\r
272 echo 1 > file:1\r
273 echo 1 > file:1again\r
274 echo aaa > file:aaa\r
275 echo 5 > file:5\r
276 mklink /h link file > nul\r
277 echo aaa > file2:aaa\r
278 call :do_test\r
279 \r
280 call :msg "file with empty alternate data stream"\r
281 echo 1 > file\r
282 type nul > file:ads\r
283 call :do_test\r
284 \r
285 call :msg "directory with empty alternate data stream"\r
286 md subdir\r
287 type nul > subdir:ads\r
288 call :do_test\r
289 \r
290 call :msg "root directory with alternate data stream"\r
291 echo 1 > ..\in.dir:ads\r
292 call :do_test\r
293 \r
294 call :msg "root directory with empty alternate data stream"\r
295 type nul > ..\in.dir:ads\r
296 call :do_test\r
297 \r
298 call :msg "subdirectory with alternate data streams"\r
299 md subdir\r
300 echo 1 > subdir:1\r
301 echo 2 > subdir:2\r
302 echo 2 > subdir:2again\r
303 call :do_test\r
304 \r
305 call :msg "subdirectories and files with alternate data streams"\r
306 md subdir\r
307 echo hello > hello\r
308 echo hello > subdir:hello\r
309 echo hello > subdir:helloagain\r
310 echo hello > helloagain\r
311 mklink /h hellolink hello > nul\r
312 echo 1 > helloagain:1\r
313 echo 8 > helloagain:8\r
314 echo 1 > 1\r
315 type nul > helloagain:dummy\r
316 call :do_test\r
317 \r
318 call :msg "symbolic link and hard link, to file with alternate data streams"\r
319 echo 1 > 1\r
320 echo test > .\1:test\r
321 mklink symlink 1 > nul\r
322 mklink /h hardlink 1 > nul\r
323 call :do_test\r
324 \r
325 call :msg "compressed file with alternate data streams"\r
326 echo 1 > 1\r
327 echo 1 > .\1:1\r
328 echo 2 > .\1:2\r
329 compact /C 1 > nul\r
330 call :do_test\r
331 \r
332 call :msg "hidden file"\r
333 echo 1 > hidden\r
334 attrib +h hidden\r
335 call :do_test\r
336 \r
337 call :msg "hidden system file"\r
338 echo 1 > file\r
339 attrib +h +s file\r
340 call :do_test\r
341 \r
342 call :msg "hidden, readonly, system file"\r
343 echo 1 > file\r
344 attrib +h +r +s file\r
345 call :do_test\r
346 \r
347 call :msg "hidden directory"\r
348 md subdir\r
349 attrib +h subdir\r
350 call :do_test\r
351 \r
352 call :msg "hidden system directory"\r
353 md subdir\r
354 attrib +h +s subdir\r
355 call :do_test\r
356 \r
357 call :msg "hidden, readonly, system directory"\r
358 md subdir\r
359 attrib +h +r +s subdir\r
360 call :do_test\r
361 \r
362 call :msg "readonly directory with named data stream"\r
363 md subdir\r
364 echo foo > subdir:ads\r
365 attrib +r subdir\r
366 call :do_test\r
367 \r
368 call :msg "encrypted file"\r
369 echo "hello" > encrypted\r
370 cipher /e encrypted > nul\r
371 call :do_test\r
372 \r
373 call :msg "identical encrypted files"\r
374 echo "hello" > encrypted1\r
375 echo "hello" > encrypted2\r
376 cipher /e encrypted1 > nul\r
377 cipher /e encrypted2 > nul\r
378 call :do_test\r
379 \r
380 call :msg "encrypted directory"\r
381 md subdir\r
382 cipher /e subdir > nul\r
383 call :do_test\r
384 \r
385 call :msg "encrypted directory with encrypted file in it"\r
386 md subdir\r
387 echo 1 > subdir\1\r
388 cipher /e subdir > nul\r
389 cipher /e subdir\1 > nul\r
390 call :do_test\r
391 \r
392 call :msg "encrypted directory with unencrypted file in it"\r
393 md subdir\r
394 echo 1 > subdir\1\r
395 cipher /e subdir > nul\r
396 cipher /d subdir\1 > nul\r
397 call :do_test\r
398 \r
399 call :msg "encrypted root directory"\r
400 cd ..\r
401 cipher /e in.dir > nul\r
402 cd in.dir\r
403 echo "hello" > encrypted\r
404 call :do_test\r
405 \r
406 call :msg "unencrypted file in encrypted directory in compressed directory"\r
407 md 1\r
408 md 1\2\r
409 compact /c 1 > nul\r
410 cipher /e 1\2 > nul\r
411 echo hello > 1\2\file\r
412 cipher /d 1\2\file > nul\r
413 call :do_test\r
414 \r
415 call :msg "encrypted directory with alternate data streams"\r
416 md subdir\r
417 cipher /e subdir > nul\r
418 echo ads1 > subdir:ads1\r
419 echo ads2 > subdir:ads2\r
420 call :do_test\r
421 \r
422 call :msg "hardlinked, encrypted file with alternate data streams"\r
423 echo hello > file\r
424 echo hello > file:ads\r
425 cipher /e file > nul\r
426 mklink /h link file > nul\r
427 call :do_test\r
428 \r
429 REM Note: since object IDs must be unique per filesystem, we can't expect them\r
430 REM to preserved using our testing scheme.  Therefore, win32-tree-cmp doesn't\r
431 REM compare them, and the below tests really just ensure the object ID code is\r
432 REM run to some extent.\r
433 \r
434 call :msg "file with object ID"\r
435 echo hello > file\r
436 fsutil objectid create file > nul\r
437 call :do_test\r
438 \r
439 call :msg "directory with object ID"\r
440 md subdir\r
441 fsutil objectid set f67394c12b17608e1d050d181ba8ffd2 7df80cbdf620f4c82c79b9e6799147b6 97621aff72915ade05abb96b15dea1a3 e0bda4caa9e33cfd461c92c16be9713d subdir\r
442 call :do_test\r
443 \r
444 :rpfix_tests\r
445 \r
446 echo Testing rpfix junction\r
447 md subdir\r
448 echo 1 > subdir\file\r
449 mklink /j junction subdir > nul\r
450 cd ..\r
451 %WIMLIB_IMAGEX% capture in.dir test.wim > nul\r
452 rd /s /q in.dir\r
453 %WIMLIB_IMAGEX% apply test.wim out.dir > nul\r
454 echo 1 > tmp1\r
455 type out.dir\junction\file > tmp2\r
456 fc tmp1 tmp2 > nul\r
457 if %errorlevel% neq 0 goto :fail\r
458 rd /s /q out.dir\r
459 del tmp1 tmp2\r
460 md in.dir\r
461 cd in.dir\r
462 \r
463 echo Testing rpfix relative\r
464 echo 1 > file\r
465 mklink relink file > nul\r
466 cd ..\r
467 %WIMLIB_IMAGEX% capture in.dir test.wim > nul\r
468 %WIMLIB_IMAGEX% apply test.wim out.dir > nul\r
469 type out.dir\relink > out.dir\tmp\r
470 if %errorlevel% neq 0 goto :fail\r
471 fc in.dir\file out.dir\tmp > nul\r
472 if %errorlevel% neq 0 goto :fail\r
473 rd /s /q in.dir out.dir\r
474 md in.dir\r
475 cd in.dir\r
476 \r
477 REM\r
478 REM END OF TESTS\r
479 REM\r
480 \r
481 cd ..\r
482 del test.wim\r
483 rd /s /q in.dir\r
484 exit /b 0\r
485 \r
486 :do_test\r
487 cd ..\r
488 %WIMLIB_IMAGEX% capture in.dir test.wim --norpfix > NUL\r
489 if %errorlevel% neq 0 goto :fail\r
490 %WIMLIB_IMAGEX% apply test.wim out.dir > NUL\r
491 if %errorlevel% neq 0 goto :fail\r
492 %WIN32_TREE_CMP% in.dir out.dir\r
493 if %errorlevel% neq 0 goto :fail\r
494 \r
495 REM  apply a second time so we test the case where the files already exist\r
496 %WIMLIB_IMAGEX% apply test.wim out.dir > NUL\r
497 if %errorlevel% neq 0 goto :fail\r
498 %WIN32_TREE_CMP% in.dir out.dir\r
499 if %errorlevel% neq 0 goto :fail\r
500 \r
501 REM Fun fact: Microsoft's WIMGAPI has bugs that make it fail some of our tests.\r
502 REM Even the Windows 8.1 version has incorrect behavior with empty files with\r
503 REM multiple links, or files with named data streams and multiple links.\r
504 rd /S /Q out.dir\r
505 md out.dir\r
506 REM dism /capture-image /capturedir:in.dir /imagefile:test.wim /name:"test" /norpfix > nul\r
507 REM if %errorlevel% neq 0 goto :fail\r
508 dism /apply-image /imagefile:test.wim /index:1 /applydir:out.dir > nul\r
509 if %errorlevel% neq 0 goto :fail\r
510 %WIN32_TREE_CMP% in.dir out.dir\r
511 \r
512 rd /S /Q in.dir out.dir\r
513 md in.dir\r
514 cd in.dir\r
515 goto :eof\r
516 \r
517 :msg\r
518 echo Testing capture and apply of %~1\r
519 goto :eof\r
520 \r
521 :fail\r
522 echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
523 echo            TEST FAILED!!!!!!!\r
524 echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
525 exit %errorlevel%\r