From cb3baab306e5951dc3a176fd9061f596a05b4729 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 15 Nov 2009 18:32:03 +0100 Subject: Rebase libarchive to 2.7.1 --- .../libarchive-2.7.1/tar/test/test_windows.c | 322 +++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 libarchive/libarchive-2.7.1/tar/test/test_windows.c (limited to 'libarchive/libarchive-2.7.1/tar/test/test_windows.c') diff --git a/libarchive/libarchive-2.7.1/tar/test/test_windows.c b/libarchive/libarchive-2.7.1/tar/test/test_windows.c new file mode 100644 index 0000000..5295e5e --- /dev/null +++ b/libarchive/libarchive-2.7.1/tar/test/test_windows.c @@ -0,0 +1,322 @@ +/*- + * Copyright (c) 2009 Michihiro NAKAJIMA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) +static void +mkfile(const char *name) +{ + int fd; + + fd = open(name, O_CREAT | O_WRONLY, 0644); + assert(fd >= 0); + assertEqualInt(5, write(fd, "01234", 5)); + close(fd); +} + +static void +mkfullpath(char **path1, char **path2, const char *tpath, int type) +{ + char *fp1, *fp2, *p1, *p2; + size_t l; + + /* + * Get full path name of "tpath" + */ + l = GetFullPathNameA(tpath, 0, NULL, NULL); + assert(0 != l); + fp1 = malloc(l); + assert(NULL != fp1); + fp2 = malloc(l*2); + assert(NULL != fp2); + l = GetFullPathNameA(tpath, l, fp1, NULL); + if ((type & 0x01) == 0) { + for (p1 = fp1; *p1 != '\0'; p1++) + if (*p1 == '\\') + *p1 = '/'; + } + + switch(type) { + case 0: /* start with "/" */ + case 1: /* start with "\" */ + /* strip "c:" */ + memmove(fp1, fp1 + 2, l - 2); + fp1[l -2] = '\0'; + p1 = fp1 + 1; + break; + case 2: /* start with "c:/" */ + case 3: /* start with "c:\" */ + p1 = fp1 + 3; + break; + case 4: /* start with "//./c:/" */ + case 5: /* start with "\\.\c:\" */ + case 6: /* start with "//?/c:/" */ + case 7: /* start with "\\?\c:\" */ + p1 = malloc(l + 4 + 1); + assert(NULL != p1); + if (type & 0x1) + memcpy(p1, "\\\\.\\", 4); + else + memcpy(p1, "//./", 4); + if (type == 6 || type == 7) + p1[2] = '?'; + memcpy(p1 + 4, fp1, l); + p1[l + 4] = '\0'; + free(fp1); + fp1 = p1; + p1 = fp1 + 7; + break; + } + + /* + * Strip leading drive names and converting "\" to "\\" + */ + p2 = fp2; + while (*p1 != '\0') { + if (*p1 == '\\') + *p2++ = *p1; + *p2++ = *p1++; + } + *p2++ = '\r'; + *p2++ = '\n'; + *p2 = '\0'; + + *path1 = fp1; + *path2 = fp2; +} + +static const char list1[] = + "aaa/\r\naaa/file1\r\naaa/xxa/\r\naaa/xxb/\r\naaa/zzc/\r\n" + "aaa/zzc/file1\r\naaa/xxb/file1\r\naaa/xxa/file1\r\naab/\r\n" + "aac/\r\nabb/\r\nabc/\r\nabd/\r\n"; +static const char list2[] = + "bbb/\r\nbbb/file1\r\nbbb/xxa/\r\nbbb/xxb/\r\nbbb/zzc/\r\n" + "bbb/zzc/file1\r\nbbb/xxb/file1\r\nbbb/xxa/file1\r\nbbc/\r\n" + "bbd/\r\nbcc/\r\nbcd/\r\nbce/\r\n"; +static const char list3[] = + "aac/\r\nabc/\r\nbbc/\r\nbcc/\r\nccc/\r\n"; +static const char list4[] = + "fff/abca\r\nfff/acca\r\n"; +static const char list5[] = + "aaa\\\\file1\r\naaa\\\\xxa/\r\naaa\\\\xxa/file1\r\naaa\\\\xxb/\r\n" + "aaa\\\\xxb/file1\r\naaa\\\\zzc/\r\naaa\\\\zzc/file1\r\n"; +static const char list6[] = + "fff\\\\abca\r\nfff\\\\acca\r\naaa\\\\xxa/\r\naaa\\\\xxa/file1\r\n" + "aaa\\\\xxb/\r\naaa\\\\xxb/file1\r\n"; +#endif /* _WIN32 && !__CYGWIN__ */ + +DEFINE_TEST(test_windows) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + char *fp1, *fp2; + + /* + * Preparre tests. + * Create directories and files. + */ + assertEqualInt(0, mkdir("tmp", 0775)); + assertEqualInt(0, chdir("tmp")); + + assertEqualInt(0, mkdir("aaa", 0775)); + assertEqualInt(0, mkdir("aaa/xxa", 0775)); + assertEqualInt(0, mkdir("aaa/xxb", 0775)); + assertEqualInt(0, mkdir("aaa/zzc", 0775)); + mkfile("aaa/file1"); + mkfile("aaa/xxa/file1"); + mkfile("aaa/xxb/file1"); + mkfile("aaa/zzc/file1"); + assertEqualInt(0, mkdir("aab", 0775)); + assertEqualInt(0, mkdir("aac", 0775)); + assertEqualInt(0, mkdir("abb", 0775)); + assertEqualInt(0, mkdir("abc", 0775)); + assertEqualInt(0, mkdir("abd", 0775)); + assertEqualInt(0, mkdir("bbb", 0775)); + assertEqualInt(0, mkdir("bbb/xxa", 0775)); + assertEqualInt(0, mkdir("bbb/xxb", 0775)); + assertEqualInt(0, mkdir("bbb/zzc", 0775)); + mkfile("bbb/file1"); + mkfile("bbb/xxa/file1"); + mkfile("bbb/xxb/file1"); + mkfile("bbb/zzc/file1"); + assertEqualInt(0, mkdir("bbc", 0775)); + assertEqualInt(0, mkdir("bbd", 0775)); + assertEqualInt(0, mkdir("bcc", 0775)); + assertEqualInt(0, mkdir("bcd", 0775)); + assertEqualInt(0, mkdir("bce", 0775)); + assertEqualInt(0, mkdir("ccc", 0775)); + assertEqualInt(0, mkdir("fff", 0775)); + mkfile("fff/aaaa"); + mkfile("fff/abba"); + mkfile("fff/abca"); + mkfile("fff/acba"); + mkfile("fff/acca"); + + /* + * Test1: Command line pattern matching. + */ + assertEqualInt(0, + systemf("%s -cf ../archive.tar a*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + assertFileContents(list1, sizeof(list1)-1, "../list"); + + assertEqualInt(0, + systemf("%s -cf ../archive.tar b*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + assertFileContents(list2, sizeof(list2)-1, "../list"); + + assertEqualInt(0, + systemf("%s -cf ../archive.tar ??c", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + assertFileContents(list3, sizeof(list3)-1, "../list"); + + assertEqualInt(0, + systemf("%s -cf ../archive.tar *c", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + assertFileContents(list3, sizeof(list3)-1, "../list"); + + assertEqualInt(0, + systemf("%s -cf ../archive.tar fff/a?ca", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + assertFileContents(list4, sizeof(list4)-1, "../list"); + + assertEqualInt(0, + systemf("%s -cf ../archive.tar aaa\\*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + assertFileContents(list5, sizeof(list5)-1, "../list"); + + assertEqualInt(0, + systemf("%s -cf ../archive.tar fff\\a?ca aaa\\xx*", testprog)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + assertFileContents(list6, sizeof(list6)-1, "../list"); + + /* + * Test2: Archive the file start with drive letters. + */ + /* Test2a: start with "/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 0); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); + + /* Test2b: start with "\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 1); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); + + /* Test2c: start with "c:/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 2); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); + + /* Test2d: start with "c:\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 3); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); + + /* Test2e: start with "//./c:/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 4); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); + + /* Test2f: start with "\\.\c:\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 5); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); + + /* Test2g: start with "//?/c:/" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 6); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); + + /* Test2h: start with "\\?\c:\" */ + mkfullpath(&fp1, &fp2, "aaa/file1", 7); + assertEqualInt(0, + systemf("%s -cf ../archive.tar %s > ../out 2> ../err", + testprog, fp1)); + assertEqualInt(0, + systemf("%s -tf ../archive.tar > ../list", testprog)); + /* Check drive letters have been striped. */ + assertFileContents(fp2, strlen(fp2), "../list"); + free(fp1); + free(fp2); +#else + skipping("Windows specific test"); +#endif /* _WIN32 && !__CYGWIN__ */ +} -- cgit v1.2.3