summaryrefslogtreecommitdiffstats
path: root/contrib/libarchive/tar/test/test_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libarchive/tar/test/test_windows.c')
-rw-r--r--contrib/libarchive/tar/test/test_windows.c323
1 files changed, 323 insertions, 0 deletions
diff --git a/contrib/libarchive/tar/test/test_windows.c b/contrib/libarchive/tar/test/test_windows.c
new file mode 100644
index 0000000..a2d0c21
--- /dev/null
+++ b/contrib/libarchive/tar/test/test_windows.c
@@ -0,0 +1,323 @@
+/*-
+ * 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__)
+#include <windows.h>
+
+static void
+mkfile(const char *name)
+{
+ FILE *f;
+
+ f = fopen(name, "wb");
+ assert(f != NULL);
+ assertEqualInt(5, fwrite("01234", 1, 5, f));
+ fclose(f);
+}
+
+static void
+mkfullpath(char **path1, char **path2, const char *tpath, int type)
+{
+ char *fp1 = NULL, *fp2 = NULL, *p1 = NULL, *p2 = NULL;
+ 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 = '/';
+ else
+ *p2 = *p1;
+ ++p1;
+ ++p2;
+ }
+ *p2++ = '\r';
+ *p2++ = '\n';
+ *p2 = '\0';
+
+ *path1 = fp1;
+ *path2 = fp2;
+}
+
+static const char *list1[] = {"aaa/", "aaa/file1", "aaa/xxa/", "aaa/xxb/",
+ "aaa/zzc/", "aaa/zzc/file1", "aaa/xxb/file1", "aaa/xxa/file1",
+ "aab/", "aac/", "abb/", "abc/", "abd/", NULL};
+static const char *list2[] = {"bbb/", "bbb/file1", "bbb/xxa/", "bbb/xxb/",
+ "bbb/zzc/", "bbb/zzc/file1", "bbb/xxb/file1", "bbb/xxa/file1", "bbc/",
+ "bbd/", "bcc/", "bcd/", "bce/", NULL};
+static const char *list3[] = {"aac/", "abc/", "bbc/", "bcc/", "ccc/", NULL};
+static const char *list4[] = {"fff/abca", "fff/acca", NULL};
+static const char *list5[] = {"aaa/file1", "aaa/xxa/", "aaa/xxa/file1",
+ "aaa/xxb/", "aaa/xxb/file1", "aaa/zzc/", "aaa/zzc/file1", NULL};
+static const char *list6[] = {"fff/abca", "fff/acca", "aaa/xxa/",
+ "aaa/xxa/file1", "aaa/xxb/", "aaa/xxb/file1", NULL};
+#endif /* _WIN32 && !__CYGWIN__ */
+
+DEFINE_TEST(test_windows)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ char *fp1, *fp2;
+
+ /*
+ * Preparre tests.
+ * Create directories and files.
+ */
+ assertMakeDir("tmp", 0775);
+ assertChdir("tmp");
+
+ assertMakeDir("aaa", 0775);
+ assertMakeDir("aaa/xxa", 0775);
+ assertMakeDir("aaa/xxb", 0775);
+ assertMakeDir("aaa/zzc", 0775);
+ mkfile("aaa/file1");
+ mkfile("aaa/xxa/file1");
+ mkfile("aaa/xxb/file1");
+ mkfile("aaa/zzc/file1");
+ assertMakeDir("aab", 0775);
+ assertMakeDir("aac", 0775);
+ assertMakeDir("abb", 0775);
+ assertMakeDir("abc", 0775);
+ assertMakeDir("abd", 0775);
+ assertMakeDir("bbb", 0775);
+ assertMakeDir("bbb/xxa", 0775);
+ assertMakeDir("bbb/xxb", 0775);
+ assertMakeDir("bbb/zzc", 0775);
+ mkfile("bbb/file1");
+ mkfile("bbb/xxa/file1");
+ mkfile("bbb/xxb/file1");
+ mkfile("bbb/zzc/file1");
+ assertMakeDir("bbc", 0775);
+ assertMakeDir("bbd", 0775);
+ assertMakeDir("bcc", 0775);
+ assertMakeDir("bcd", 0775);
+ assertEqualInt(0, _mkdir("bce"));
+ assertEqualInt(0, _mkdir("ccc"));
+ assertEqualInt(0, _mkdir("fff"));
+ 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 ../archive1.tar a*", testprog));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive1.tar > ../list1", testprog));
+ assertFileContainsLinesAnyOrder("../list1", list1);
+
+ assertEqualInt(0,
+ systemf("%s -cf ../archive2.tar b*", testprog));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive2.tar > ../list2", testprog));
+ assertFileContainsLinesAnyOrder("../list2", list2);
+
+ assertEqualInt(0,
+ systemf("%s -cf ../archive3.tar ??c", testprog));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive3.tar > ../list3", testprog));
+ assertFileContainsLinesAnyOrder("../list3", list3);
+
+ assertEqualInt(0,
+ systemf("%s -cf ../archive3b.tar *c", testprog));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive3b.tar > ../list3b", testprog));
+ assertFileContainsLinesAnyOrder("../list3b", list3);
+
+ assertEqualInt(0,
+ systemf("%s -cf ../archive4.tar fff/a?ca", testprog));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive4.tar > ../list4", testprog));
+ assertFileContainsLinesAnyOrder("../list4", list4);
+
+ assertEqualInt(0,
+ systemf("%s -cf ../archive5.tar aaa\\*", testprog));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive5.tar > ../list5", testprog));
+ assertFileContainsLinesAnyOrder("../list5", list5);
+
+ assertEqualInt(0,
+ systemf("%s -cf ../archive6.tar fff\\a?ca aaa\\xx*", testprog));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive6.tar > ../list6", testprog));
+ assertFileContainsLinesAnyOrder("../list6", list6);
+
+ /*
+ * Test2: Archive the file start with drive letters.
+ */
+ /* Test2a: start with "/" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 0);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive10.tar %s > ../out10 2> ../err10",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive10.tar > ../list10", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list10");
+ free(fp1);
+ free(fp2);
+
+ /* Test2b: start with "\" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 1);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive11.tar %s > ../out11 2> ../err11",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive11.tar > ../list11", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list11");
+ free(fp1);
+ free(fp2);
+
+ /* Test2c: start with "c:/" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 2);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive12.tar %s > ../out12 2> ../err12",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive12.tar > ../list12", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list12");
+ free(fp1);
+ free(fp2);
+
+ /* Test2d: start with "c:\" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 3);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive13.tar %s > ../out13 2> ../err13",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive13.tar > ../list13", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list13");
+ free(fp1);
+ free(fp2);
+
+ /* Test2e: start with "//./c:/" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 4);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive14.tar %s > ../out14 2> ../err14",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive14.tar > ../list14", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list14");
+ free(fp1);
+ free(fp2);
+
+ /* Test2f: start with "\\.\c:\" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 5);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive15.tar %s > ../out15 2> ../err15",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive15.tar > ../list15", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list15");
+ free(fp1);
+ free(fp2);
+
+ /* Test2g: start with "//?/c:/" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 6);
+ failure("fp1=%s, fp2=%s", fp1, fp2);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive16.tar %s > ../out16 2> ../err16",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive16.tar > ../list16", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list16");
+ free(fp1);
+ free(fp2);
+
+ /* Test2h: start with "\\?\c:\" */
+ mkfullpath(&fp1, &fp2, "aaa/file1", 7);
+ failure("fp1=%s, fp2=%s", fp1, fp2);
+ assertEqualInt(0,
+ systemf("%s -cf ../archive17.tar %s > ../out17 2> ../err17",
+ testprog, fp1));
+ assertEqualInt(0,
+ systemf("%s -tf ../archive17.tar > ../list17", testprog));
+ /* Check drive letters have been stripped. */
+ assertFileContents(fp2, strlen(fp2), "../list17");
+ free(fp1);
+ free(fp2);
+#else
+ skipping("Windows specific test");
+#endif /* _WIN32 && !__CYGWIN__ */
+}
OpenPOWER on IntegriCloud