xref: /minix3/external/bsd/libarchive/dist/tar/test/test_windows.c (revision 543adbed3a3a783ed36434adafbc258b6bde442d)
1*543adbedSBen Gras /*-
2*543adbedSBen Gras  * Copyright (c) 2009 Michihiro NAKAJIMA
3*543adbedSBen Gras  * All rights reserved.
4*543adbedSBen Gras  *
5*543adbedSBen Gras  * Redistribution and use in source and binary forms, with or without
6*543adbedSBen Gras  * modification, are permitted provided that the following conditions
7*543adbedSBen Gras  * are met:
8*543adbedSBen Gras  * 1. Redistributions of source code must retain the above copyright
9*543adbedSBen Gras  *    notice, this list of conditions and the following disclaimer.
10*543adbedSBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
11*543adbedSBen Gras  *    notice, this list of conditions and the following disclaimer in the
12*543adbedSBen Gras  *    documentation and/or other materials provided with the distribution.
13*543adbedSBen Gras  *
14*543adbedSBen Gras  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15*543adbedSBen Gras  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16*543adbedSBen Gras  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17*543adbedSBen Gras  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18*543adbedSBen Gras  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19*543adbedSBen Gras  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20*543adbedSBen Gras  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21*543adbedSBen Gras  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22*543adbedSBen Gras  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23*543adbedSBen Gras  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24*543adbedSBen Gras  */
25*543adbedSBen Gras #include "test.h"
26*543adbedSBen Gras 
27*543adbedSBen Gras #if defined(_WIN32) && !defined(__CYGWIN__)
28*543adbedSBen Gras #include <windows.h>
29*543adbedSBen Gras 
30*543adbedSBen Gras static void
mkfile(const char * name)31*543adbedSBen Gras mkfile(const char *name)
32*543adbedSBen Gras {
33*543adbedSBen Gras 	FILE *f;
34*543adbedSBen Gras 
35*543adbedSBen Gras 	f = fopen(name, "wb");
36*543adbedSBen Gras 	assert(f != NULL);
37*543adbedSBen Gras 	assertEqualInt(5, fwrite("01234", 1, 5, f));
38*543adbedSBen Gras 	fclose(f);
39*543adbedSBen Gras }
40*543adbedSBen Gras 
41*543adbedSBen Gras static void
mkfullpath(char ** path1,char ** path2,const char * tpath,int type)42*543adbedSBen Gras mkfullpath(char **path1, char **path2, const char *tpath, int type)
43*543adbedSBen Gras {
44*543adbedSBen Gras 	char *fp1 = NULL, *fp2 = NULL, *p1 = NULL, *p2 = NULL;
45*543adbedSBen Gras 	size_t l;
46*543adbedSBen Gras 
47*543adbedSBen Gras 	/*
48*543adbedSBen Gras 	 * Get full path name of "tpath"
49*543adbedSBen Gras 	 */
50*543adbedSBen Gras 	l = GetFullPathNameA(tpath, 0, NULL, NULL);
51*543adbedSBen Gras 	assert(0 != l);
52*543adbedSBen Gras 	fp1 = malloc(l);
53*543adbedSBen Gras 	assert(NULL != fp1);
54*543adbedSBen Gras 	fp2 = malloc(l*2);
55*543adbedSBen Gras 	assert(NULL != fp2);
56*543adbedSBen Gras 	l = GetFullPathNameA(tpath, l, fp1, NULL);
57*543adbedSBen Gras 	if ((type & 0x01) == 0) {
58*543adbedSBen Gras 		for (p1 = fp1; *p1 != '\0'; p1++)
59*543adbedSBen Gras 			if (*p1 == '\\')
60*543adbedSBen Gras 				*p1 = '/';
61*543adbedSBen Gras 	}
62*543adbedSBen Gras 
63*543adbedSBen Gras 	switch(type) {
64*543adbedSBen Gras 	case 0: /* start with "/" */
65*543adbedSBen Gras 	case 1: /* start with "\" */
66*543adbedSBen Gras 		/* strip "c:" */
67*543adbedSBen Gras 		memmove(fp1, fp1 + 2, l - 2);
68*543adbedSBen Gras 		fp1[l -2] = '\0';
69*543adbedSBen Gras 		p1 = fp1 + 1;
70*543adbedSBen Gras 		break;
71*543adbedSBen Gras 	case 2: /* start with "c:/" */
72*543adbedSBen Gras 	case 3: /* start with "c:\" */
73*543adbedSBen Gras 		p1 = fp1 + 3;
74*543adbedSBen Gras 		break;
75*543adbedSBen Gras 	case 4: /* start with "//./c:/" */
76*543adbedSBen Gras 	case 5: /* start with "\\.\c:\" */
77*543adbedSBen Gras 	case 6: /* start with "//?/c:/" */
78*543adbedSBen Gras 	case 7: /* start with "\\?\c:\" */
79*543adbedSBen Gras 		p1 = malloc(l + 4 + 1);
80*543adbedSBen Gras 		assert(NULL != p1);
81*543adbedSBen Gras 		if (type & 0x1)
82*543adbedSBen Gras 			memcpy(p1, "\\\\.\\", 4);
83*543adbedSBen Gras 		else
84*543adbedSBen Gras 			memcpy(p1, "//./", 4);
85*543adbedSBen Gras 		if (type == 6 || type == 7)
86*543adbedSBen Gras 			p1[2] = '?';
87*543adbedSBen Gras 		memcpy(p1 + 4, fp1, l);
88*543adbedSBen Gras 		p1[l + 4] = '\0';
89*543adbedSBen Gras 		free(fp1);
90*543adbedSBen Gras 		fp1 = p1;
91*543adbedSBen Gras 		p1 = fp1 + 7;
92*543adbedSBen Gras 		break;
93*543adbedSBen Gras 	}
94*543adbedSBen Gras 
95*543adbedSBen Gras 	/*
96*543adbedSBen Gras 	 * Strip leading drive names and converting "\" to "\\"
97*543adbedSBen Gras 	 */
98*543adbedSBen Gras 	p2 = fp2;
99*543adbedSBen Gras 	while (*p1 != '\0') {
100*543adbedSBen Gras 		if (*p1 == '\\')
101*543adbedSBen Gras 			*p2 = '/';
102*543adbedSBen Gras 		else
103*543adbedSBen Gras 			*p2 = *p1;
104*543adbedSBen Gras 		++p1;
105*543adbedSBen Gras 		++p2;
106*543adbedSBen Gras 	}
107*543adbedSBen Gras 	*p2++ = '\r';
108*543adbedSBen Gras 	*p2++ = '\n';
109*543adbedSBen Gras 	*p2 = '\0';
110*543adbedSBen Gras 
111*543adbedSBen Gras 	*path1 = fp1;
112*543adbedSBen Gras 	*path2 = fp2;
113*543adbedSBen Gras }
114*543adbedSBen Gras 
115*543adbedSBen Gras static const char *list1[] = {"aaa/", "aaa/file1", "aaa/xxa/", "aaa/xxb/",
116*543adbedSBen Gras 	"aaa/zzc/", "aaa/zzc/file1", "aaa/xxb/file1", "aaa/xxa/file1",
117*543adbedSBen Gras 	"aab/", "aac/", "abb/", "abc/", "abd/", NULL};
118*543adbedSBen Gras static const char *list2[] = {"bbb/", "bbb/file1", "bbb/xxa/", "bbb/xxb/",
119*543adbedSBen Gras 	"bbb/zzc/", "bbb/zzc/file1", "bbb/xxb/file1", "bbb/xxa/file1", "bbc/",
120*543adbedSBen Gras 	"bbd/", "bcc/", "bcd/", "bce/", NULL};
121*543adbedSBen Gras static const char *list3[] = {"aac/", "abc/", "bbc/", "bcc/", "ccc/", NULL};
122*543adbedSBen Gras static const char *list4[] = {"fff/abca", "fff/acca", NULL};
123*543adbedSBen Gras static const char *list5[] = {"aaa/file1", "aaa/xxa/", "aaa/xxa/file1",
124*543adbedSBen Gras 	"aaa/xxb/", "aaa/xxb/file1", "aaa/zzc/", "aaa/zzc/file1", NULL};
125*543adbedSBen Gras static const char *list6[] = {"fff/abca", "fff/acca", "aaa/xxa/",
126*543adbedSBen Gras 	"aaa/xxa/file1", "aaa/xxb/", "aaa/xxb/file1", NULL};
127*543adbedSBen Gras #endif /* _WIN32 && !__CYGWIN__ */
128*543adbedSBen Gras 
DEFINE_TEST(test_windows)129*543adbedSBen Gras DEFINE_TEST(test_windows)
130*543adbedSBen Gras {
131*543adbedSBen Gras #if defined(_WIN32) && !defined(__CYGWIN__)
132*543adbedSBen Gras 	char *fp1, *fp2;
133*543adbedSBen Gras 
134*543adbedSBen Gras 	/*
135*543adbedSBen Gras 	 * Preparre tests.
136*543adbedSBen Gras 	 * Create directories and files.
137*543adbedSBen Gras 	 */
138*543adbedSBen Gras 	assertMakeDir("tmp", 0775);
139*543adbedSBen Gras 	assertChdir("tmp");
140*543adbedSBen Gras 
141*543adbedSBen Gras 	assertMakeDir("aaa", 0775);
142*543adbedSBen Gras 	assertMakeDir("aaa/xxa", 0775);
143*543adbedSBen Gras 	assertMakeDir("aaa/xxb", 0775);
144*543adbedSBen Gras 	assertMakeDir("aaa/zzc", 0775);
145*543adbedSBen Gras 	mkfile("aaa/file1");
146*543adbedSBen Gras 	mkfile("aaa/xxa/file1");
147*543adbedSBen Gras 	mkfile("aaa/xxb/file1");
148*543adbedSBen Gras 	mkfile("aaa/zzc/file1");
149*543adbedSBen Gras 	assertMakeDir("aab", 0775);
150*543adbedSBen Gras 	assertMakeDir("aac", 0775);
151*543adbedSBen Gras 	assertMakeDir("abb", 0775);
152*543adbedSBen Gras 	assertMakeDir("abc", 0775);
153*543adbedSBen Gras 	assertMakeDir("abd", 0775);
154*543adbedSBen Gras 	assertMakeDir("bbb", 0775);
155*543adbedSBen Gras 	assertMakeDir("bbb/xxa", 0775);
156*543adbedSBen Gras 	assertMakeDir("bbb/xxb", 0775);
157*543adbedSBen Gras 	assertMakeDir("bbb/zzc", 0775);
158*543adbedSBen Gras 	mkfile("bbb/file1");
159*543adbedSBen Gras 	mkfile("bbb/xxa/file1");
160*543adbedSBen Gras 	mkfile("bbb/xxb/file1");
161*543adbedSBen Gras 	mkfile("bbb/zzc/file1");
162*543adbedSBen Gras 	assertMakeDir("bbc", 0775);
163*543adbedSBen Gras 	assertMakeDir("bbd", 0775);
164*543adbedSBen Gras 	assertMakeDir("bcc", 0775);
165*543adbedSBen Gras 	assertMakeDir("bcd", 0775);
166*543adbedSBen Gras 	assertEqualInt(0, _mkdir("bce"));
167*543adbedSBen Gras 	assertEqualInt(0, _mkdir("ccc"));
168*543adbedSBen Gras 	assertEqualInt(0, _mkdir("fff"));
169*543adbedSBen Gras 	mkfile("fff/aaaa");
170*543adbedSBen Gras 	mkfile("fff/abba");
171*543adbedSBen Gras 	mkfile("fff/abca");
172*543adbedSBen Gras 	mkfile("fff/acba");
173*543adbedSBen Gras 	mkfile("fff/acca");
174*543adbedSBen Gras 
175*543adbedSBen Gras 	/*
176*543adbedSBen Gras 	 * Test1: Command line pattern matching.
177*543adbedSBen Gras 	 */
178*543adbedSBen Gras 	assertEqualInt(0,
179*543adbedSBen Gras 	    systemf("%s -cf ../archive1.tar a*", testprog));
180*543adbedSBen Gras 	assertEqualInt(0,
181*543adbedSBen Gras 	    systemf("%s -tf ../archive1.tar > ../list1", testprog));
182*543adbedSBen Gras 	assertFileContainsLinesAnyOrder("../list1", list1);
183*543adbedSBen Gras 
184*543adbedSBen Gras 	assertEqualInt(0,
185*543adbedSBen Gras 	    systemf("%s -cf ../archive2.tar b*", testprog));
186*543adbedSBen Gras 	assertEqualInt(0,
187*543adbedSBen Gras 	    systemf("%s -tf ../archive2.tar > ../list2", testprog));
188*543adbedSBen Gras 	assertFileContainsLinesAnyOrder("../list2", list2);
189*543adbedSBen Gras 
190*543adbedSBen Gras 	assertEqualInt(0,
191*543adbedSBen Gras 	    systemf("%s -cf ../archive3.tar ??c", testprog));
192*543adbedSBen Gras 	assertEqualInt(0,
193*543adbedSBen Gras 	    systemf("%s -tf ../archive3.tar > ../list3", testprog));
194*543adbedSBen Gras 	assertFileContainsLinesAnyOrder("../list3", list3);
195*543adbedSBen Gras 
196*543adbedSBen Gras 	assertEqualInt(0,
197*543adbedSBen Gras 	    systemf("%s -cf ../archive3b.tar *c", testprog));
198*543adbedSBen Gras 	assertEqualInt(0,
199*543adbedSBen Gras 	    systemf("%s -tf ../archive3b.tar > ../list3b", testprog));
200*543adbedSBen Gras 	assertFileContainsLinesAnyOrder("../list3b", list3);
201*543adbedSBen Gras 
202*543adbedSBen Gras 	assertEqualInt(0,
203*543adbedSBen Gras 	    systemf("%s -cf ../archive4.tar fff/a?ca", testprog));
204*543adbedSBen Gras 	assertEqualInt(0,
205*543adbedSBen Gras 	    systemf("%s -tf ../archive4.tar > ../list4", testprog));
206*543adbedSBen Gras 	assertFileContainsLinesAnyOrder("../list4", list4);
207*543adbedSBen Gras 
208*543adbedSBen Gras 	assertEqualInt(0,
209*543adbedSBen Gras 	    systemf("%s -cf ../archive5.tar aaa\\*", testprog));
210*543adbedSBen Gras 	assertEqualInt(0,
211*543adbedSBen Gras 	    systemf("%s -tf ../archive5.tar > ../list5", testprog));
212*543adbedSBen Gras 	assertFileContainsLinesAnyOrder("../list5", list5);
213*543adbedSBen Gras 
214*543adbedSBen Gras 	assertEqualInt(0,
215*543adbedSBen Gras 	    systemf("%s -cf ../archive6.tar fff\\a?ca aaa\\xx*", testprog));
216*543adbedSBen Gras 	assertEqualInt(0,
217*543adbedSBen Gras 	    systemf("%s -tf ../archive6.tar > ../list6", testprog));
218*543adbedSBen Gras 	assertFileContainsLinesAnyOrder("../list6", list6);
219*543adbedSBen Gras 
220*543adbedSBen Gras 	/*
221*543adbedSBen Gras 	 * Test2: Archive the file start with drive letters.
222*543adbedSBen Gras 	 */
223*543adbedSBen Gras 	/* Test2a: start with "/" */
224*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 0);
225*543adbedSBen Gras 	assertEqualInt(0,
226*543adbedSBen Gras 	    systemf("%s -cf ../archive10.tar %s > ../out10 2> ../err10",
227*543adbedSBen Gras 	        testprog, fp1));
228*543adbedSBen Gras 	assertEqualInt(0,
229*543adbedSBen Gras 	    systemf("%s -tf ../archive10.tar > ../list10", testprog));
230*543adbedSBen Gras 	/* Check drive letters have been stripped. */
231*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list10");
232*543adbedSBen Gras 	free(fp1);
233*543adbedSBen Gras 	free(fp2);
234*543adbedSBen Gras 
235*543adbedSBen Gras 	/* Test2b: start with "\" */
236*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 1);
237*543adbedSBen Gras 	assertEqualInt(0,
238*543adbedSBen Gras 	    systemf("%s -cf ../archive11.tar %s > ../out11 2> ../err11",
239*543adbedSBen Gras 	        testprog, fp1));
240*543adbedSBen Gras 	assertEqualInt(0,
241*543adbedSBen Gras 	    systemf("%s -tf ../archive11.tar > ../list11", testprog));
242*543adbedSBen Gras 	/* Check drive letters have been stripped. */
243*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list11");
244*543adbedSBen Gras 	free(fp1);
245*543adbedSBen Gras 	free(fp2);
246*543adbedSBen Gras 
247*543adbedSBen Gras 	/* Test2c: start with "c:/" */
248*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 2);
249*543adbedSBen Gras 	assertEqualInt(0,
250*543adbedSBen Gras 	    systemf("%s -cf ../archive12.tar %s > ../out12 2> ../err12",
251*543adbedSBen Gras 	        testprog, fp1));
252*543adbedSBen Gras 	assertEqualInt(0,
253*543adbedSBen Gras 	    systemf("%s -tf ../archive12.tar > ../list12", testprog));
254*543adbedSBen Gras 	/* Check drive letters have been stripped. */
255*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list12");
256*543adbedSBen Gras 	free(fp1);
257*543adbedSBen Gras 	free(fp2);
258*543adbedSBen Gras 
259*543adbedSBen Gras 	/* Test2d: start with "c:\" */
260*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 3);
261*543adbedSBen Gras 	assertEqualInt(0,
262*543adbedSBen Gras 	    systemf("%s -cf ../archive13.tar %s > ../out13 2> ../err13",
263*543adbedSBen Gras 	        testprog, fp1));
264*543adbedSBen Gras 	assertEqualInt(0,
265*543adbedSBen Gras 	    systemf("%s -tf ../archive13.tar > ../list13", testprog));
266*543adbedSBen Gras 	/* Check drive letters have been stripped. */
267*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list13");
268*543adbedSBen Gras 	free(fp1);
269*543adbedSBen Gras 	free(fp2);
270*543adbedSBen Gras 
271*543adbedSBen Gras 	/* Test2e: start with "//./c:/" */
272*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 4);
273*543adbedSBen Gras 	assertEqualInt(0,
274*543adbedSBen Gras 	    systemf("%s -cf ../archive14.tar %s > ../out14 2> ../err14",
275*543adbedSBen Gras 	        testprog, fp1));
276*543adbedSBen Gras 	assertEqualInt(0,
277*543adbedSBen Gras 	    systemf("%s -tf ../archive14.tar > ../list14", testprog));
278*543adbedSBen Gras 	/* Check drive letters have been stripped. */
279*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list14");
280*543adbedSBen Gras 	free(fp1);
281*543adbedSBen Gras 	free(fp2);
282*543adbedSBen Gras 
283*543adbedSBen Gras 	/* Test2f: start with "\\.\c:\" */
284*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 5);
285*543adbedSBen Gras 	assertEqualInt(0,
286*543adbedSBen Gras 	    systemf("%s -cf ../archive15.tar %s > ../out15 2> ../err15",
287*543adbedSBen Gras 	        testprog, fp1));
288*543adbedSBen Gras 	assertEqualInt(0,
289*543adbedSBen Gras 	    systemf("%s -tf ../archive15.tar > ../list15", testprog));
290*543adbedSBen Gras 	/* Check drive letters have been stripped. */
291*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list15");
292*543adbedSBen Gras 	free(fp1);
293*543adbedSBen Gras 	free(fp2);
294*543adbedSBen Gras 
295*543adbedSBen Gras 	/* Test2g: start with "//?/c:/" */
296*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 6);
297*543adbedSBen Gras 	failure("fp1=%s, fp2=%s", fp1, fp2);
298*543adbedSBen Gras 	assertEqualInt(0,
299*543adbedSBen Gras 	    systemf("%s -cf ../archive16.tar %s > ../out16 2> ../err16",
300*543adbedSBen Gras 	        testprog, fp1));
301*543adbedSBen Gras 	assertEqualInt(0,
302*543adbedSBen Gras 	    systemf("%s -tf ../archive16.tar > ../list16", testprog));
303*543adbedSBen Gras 	/* Check drive letters have been stripped. */
304*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list16");
305*543adbedSBen Gras 	free(fp1);
306*543adbedSBen Gras 	free(fp2);
307*543adbedSBen Gras 
308*543adbedSBen Gras 	/* Test2h: start with "\\?\c:\" */
309*543adbedSBen Gras 	mkfullpath(&fp1, &fp2, "aaa/file1", 7);
310*543adbedSBen Gras 	failure("fp1=%s, fp2=%s", fp1, fp2);
311*543adbedSBen Gras 	assertEqualInt(0,
312*543adbedSBen Gras 	    systemf("%s -cf ../archive17.tar %s > ../out17 2> ../err17",
313*543adbedSBen Gras 	        testprog, fp1));
314*543adbedSBen Gras 	assertEqualInt(0,
315*543adbedSBen Gras 	    systemf("%s -tf ../archive17.tar > ../list17", testprog));
316*543adbedSBen Gras 	/* Check drive letters have been stripped. */
317*543adbedSBen Gras 	assertFileContents(fp2, strlen(fp2), "../list17");
318*543adbedSBen Gras 	free(fp1);
319*543adbedSBen Gras 	free(fp2);
320*543adbedSBen Gras #else
321*543adbedSBen Gras 	skipping("Windows specific test");
322*543adbedSBen Gras #endif /* _WIN32 && !__CYGWIN__ */
323*543adbedSBen Gras }
324