blob: 5295e5e68ebb262957bb04594f11c2dc91b7719b [file] [log] [blame]
/*-
* 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__ */
}