59fb00ae07
testsuite.exe from path-testsuite.o and testsuite.o. * path.cc: Include testsuite.h. (struct mnt): Change to a mnt_t typedef and don't define mount_table when TESTSUITE is defined. (find2): Don't include when TESTSUITE is defined to avoid warning. (get_cygdrive0): Ditto. (get_cygdrive): Ditto. (read_mounts): Provide empty implementation when TESTSUITE is defined. (vconcat): Use the isslash macro. (unconvert_slashes): New helper to convert to backslashses. (rel_vconcat): Handle relative paths more gracefully. (cygpath): Skip a leading "./" sequence. Avoid double-slashes. Normalize final output to backslashes and remove redundant path sequences. * testsuite.cc: New file implementing testsuite driver. * testsuite.h: New header implementing harness mount table and series of tests.
132 lines
8.1 KiB
C
132 lines
8.1 KiB
C
/* testsuite.h
|
|
|
|
Copyright 2008 Red Hat, Inc.
|
|
|
|
This file is part of Cygwin.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
/* This file implements a test harness for the MinGW implementation of
|
|
POSIX path translation in utils/path.cc. This code is used by strace
|
|
and cygcheck which cannot depend on the Cygwin DLL. The tests below
|
|
are a basic set of sanity checks for translating relative and
|
|
absolute paths from POSIX form to Win32 form based on the contents of
|
|
a mount table. */
|
|
|
|
/* Including this file should be a no-op if TESTSUITE is not defined. */
|
|
#ifdef TESTSUITE
|
|
|
|
/* These definitions are common to both the testsuite mount table
|
|
as well as the testsuite definitions themselves, so define them
|
|
here so that they are only defined in one location. */
|
|
#define TESTSUITE_ROOT "X:\\xyzroot"
|
|
#define TESTSUITE_CYGDRIVE "/testcygdrive"
|
|
|
|
/* Define a mount table in the form that read_mounts() would populate.
|
|
This is used in place of actually reading the host mount
|
|
table from the registry for the duration of the testsuite. This
|
|
table should match the battery of tests below. */
|
|
|
|
#if defined(TESTSUITE_MOUNT_TABLE)
|
|
static mnt_t mount_table[] = {
|
|
/* native posix flags issys */
|
|
{ TESTSUITE_ROOT, (char*)"/", MOUNT_BINARY | MOUNT_SYSTEM, 1 },
|
|
{ "O:\\other", (char*)"/otherdir", MOUNT_BINARY | MOUNT_SYSTEM, 1 },
|
|
{ "S:\\some\\dir", (char*)"/somedir", MOUNT_BINARY | MOUNT_SYSTEM, 1 },
|
|
{ TESTSUITE_ROOT"\\bin", (char*)"/usr/bin", MOUNT_BINARY | MOUNT_SYSTEM, 1 },
|
|
{ TESTSUITE_ROOT"\\lib", (char*)"/usr/lib", MOUNT_BINARY | MOUNT_SYSTEM, 1 },
|
|
{ ".", (char*)TESTSUITE_CYGDRIVE, MOUNT_BINARY | MOUNT_SYSTEM | MOUNT_CYGDRIVE, 1 },
|
|
{ NULL, (char*)NULL, 0, 0 }
|
|
};
|
|
|
|
|
|
/* Define the main set of tests. This is defined here instead of in
|
|
testsuite.cc so that all test harness data is in one place and not
|
|
spread over several files. */
|
|
|
|
#elif defined(TESTSUITE_TESTS)
|
|
#define NO_CWD "N/A"
|
|
static test_t testsuite_tests[] = {
|
|
{ NO_CWD, "/file.ext", TESTSUITE_ROOT"\\file.ext" },
|
|
{ NO_CWD, "/dir/file.ext", TESTSUITE_ROOT"\\dir\\file.ext" },
|
|
{ NO_CWD, "/foo/dir/file.ext", TESTSUITE_ROOT"\\foo\\dir\\file.ext" },
|
|
{ NO_CWD, "/bin/file.ext", TESTSUITE_ROOT"\\bin\\file.ext" },
|
|
{ NO_CWD, "/bin/dir/file.ext", TESTSUITE_ROOT"\\bin\\dir\\file.ext" },
|
|
{ NO_CWD, "/lib/file.ext", TESTSUITE_ROOT"\\lib\\file.ext" },
|
|
{ NO_CWD, "/lib/dir/file.ext", TESTSUITE_ROOT"\\lib\\dir\\file.ext" },
|
|
{ NO_CWD, "/usr/bin/file.ext", TESTSUITE_ROOT"\\bin\\file.ext" },
|
|
{ NO_CWD, "/usr/bin/dir/file.ext", TESTSUITE_ROOT"\\bin\\dir\\file.ext" },
|
|
{ NO_CWD, "/usr/lib/file.ext", TESTSUITE_ROOT"\\lib\\file.ext" },
|
|
{ NO_CWD, "/usr/lib/dir/file.ext", TESTSUITE_ROOT"\\lib\\dir\\file.ext" },
|
|
{ NO_CWD, "/home/file.ext", TESTSUITE_ROOT"\\home\\file.ext" },
|
|
{ NO_CWD, "/home/foo/file.ext", TESTSUITE_ROOT"\\home\\foo\\file.ext" },
|
|
{ NO_CWD, "/home/foo/dir/file.ext", TESTSUITE_ROOT"\\home\\foo\\dir\\file.ext" },
|
|
{ NO_CWD, "/usr/file.ext", TESTSUITE_ROOT"\\usr\\file.ext" },
|
|
{ NO_CWD, "/usr/share/file.ext", TESTSUITE_ROOT"\\usr\\share\\file.ext" },
|
|
{ TESTSUITE_ROOT, "foo", TESTSUITE_ROOT"\\foo" },
|
|
{ TESTSUITE_ROOT, "./foo", TESTSUITE_ROOT"\\foo" },
|
|
{ TESTSUITE_ROOT, "foo/bar", TESTSUITE_ROOT"\\foo\\bar" },
|
|
{ TESTSUITE_ROOT, "./foo/bar", TESTSUITE_ROOT"\\foo\\bar" },
|
|
{ TESTSUITE_ROOT, "foo/./bar", TESTSUITE_ROOT"\\foo\\bar" },
|
|
{ TESTSUITE_ROOT, "./foo/./bar", TESTSUITE_ROOT"\\foo\\bar" },
|
|
{ TESTSUITE_ROOT, "bin/file.ext", TESTSUITE_ROOT"\\bin\\file.ext" },
|
|
{ TESTSUITE_ROOT, "lib/file.ext", TESTSUITE_ROOT"\\lib\\file.ext" },
|
|
{ TESTSUITE_ROOT, "usr/bin/file.ext", TESTSUITE_ROOT"\\bin\\file.ext" },
|
|
{ TESTSUITE_ROOT, "usr/lib/file.ext", TESTSUITE_ROOT"\\lib\\file.ext" },
|
|
{ TESTSUITE_ROOT, "etc/file.ext", TESTSUITE_ROOT"\\etc\\file.ext" },
|
|
{ TESTSUITE_ROOT, "etc/foo/file.ext", TESTSUITE_ROOT"\\etc\\foo\\file.ext" },
|
|
{ TESTSUITE_ROOT"\\bin", "foo", TESTSUITE_ROOT"\\bin\\foo" },
|
|
{ TESTSUITE_ROOT"\\bin", "./foo", TESTSUITE_ROOT"\\bin\\foo" },
|
|
{ TESTSUITE_ROOT"\\bin", "foo/bar", TESTSUITE_ROOT"\\bin\\foo\\bar" },
|
|
{ TESTSUITE_ROOT"\\bin", "./foo/bar", TESTSUITE_ROOT"\\bin\\foo\\bar" },
|
|
{ TESTSUITE_ROOT"\\bin", "foo/./bar", TESTSUITE_ROOT"\\bin\\foo\\bar" },
|
|
{ TESTSUITE_ROOT"\\bin", "./foo/./bar", TESTSUITE_ROOT"\\bin\\foo\\bar" },
|
|
{ TESTSUITE_ROOT"\\bin\\foo", "bar", TESTSUITE_ROOT"\\bin\\foo\\bar" },
|
|
{ TESTSUITE_ROOT"\\bin\\foo", "./bar", TESTSUITE_ROOT"\\bin\\foo\\bar" },
|
|
{ TESTSUITE_ROOT"\\bin\\foo", "bar/baz", TESTSUITE_ROOT"\\bin\\foo\\bar\\baz" },
|
|
{ TESTSUITE_ROOT"\\bin\\foo", "./bar/baz", TESTSUITE_ROOT"\\bin\\foo\\bar\\baz" },
|
|
{ TESTSUITE_ROOT"\\bin\\foo", "bar/./baz", TESTSUITE_ROOT"\\bin\\foo\\bar\\baz" },
|
|
{ TESTSUITE_ROOT"\\bin\\foo", "./bar/./baz", TESTSUITE_ROOT"\\bin\\foo\\bar\\baz" },
|
|
{ TESTSUITE_ROOT"\\tmp", "foo", TESTSUITE_ROOT"\\tmp\\foo" },
|
|
{ TESTSUITE_ROOT"\\tmp", "./foo", TESTSUITE_ROOT"\\tmp\\foo" },
|
|
{ TESTSUITE_ROOT"\\tmp", "foo/bar", TESTSUITE_ROOT"\\tmp\\foo\\bar" },
|
|
{ TESTSUITE_ROOT"\\tmp", "./foo/bar", TESTSUITE_ROOT"\\tmp\\foo\\bar" },
|
|
{ NO_CWD, "/otherdir/file.ext", "O:\\other\\file.ext" },
|
|
{ NO_CWD, "/otherdir/./file.ext", "O:\\other\\file.ext" },
|
|
{ NO_CWD, "/otherdir/foo/file.ext", "O:\\other\\foo\\file.ext" },
|
|
{ "O:\\other", "file.ext", "O:\\other\\file.ext" },
|
|
{ "O:\\other", "./file.ext", "O:\\other\\file.ext" },
|
|
{ "O:\\other", "foo/file.ext", "O:\\other\\foo\\file.ext" },
|
|
{ "O:\\other\\foo", "file.ext", "O:\\other\\foo\\file.ext" },
|
|
{ "O:\\other\\foo", "./file.ext", "O:\\other\\foo\\file.ext" },
|
|
{ "O:\\other\\foo", "bar/file.ext", "O:\\other\\foo\\bar\\file.ext" },
|
|
{ NO_CWD, "/somedir/file.ext", "S:\\some\\dir\\file.ext" },
|
|
{ NO_CWD, "/somedir/./file.ext", "S:\\some\\dir\\file.ext" },
|
|
{ NO_CWD, "/somedir/foo/file.ext", "S:\\some\\dir\\foo\\file.ext" },
|
|
{ "S:\\some\\dir", "file.ext", "S:\\some\\dir\\file.ext" },
|
|
{ "S:\\some\\dir", "./file.ext", "S:\\some\\dir\\file.ext" },
|
|
{ "S:\\some\\dir", "foo/file.ext", "S:\\some\\dir\\foo\\file.ext" },
|
|
{ "S:\\some\\dir\\foo", "file.ext", "S:\\some\\dir\\foo\\file.ext" },
|
|
{ "S:\\some\\dir\\foo", "./file.ext", "S:\\some\\dir\\foo\\file.ext" },
|
|
{ "S:\\some\\dir\\foo", "bar/file.ext", "S:\\some\\dir\\foo\\bar\\file.ext" },
|
|
{ NO_CWD, "//server/share/foo/bar", "\\\\server\\share\\foo\\bar" },
|
|
{ NO_CWD, NULL, NULL }
|
|
};
|
|
|
|
#else
|
|
|
|
/* Redirect calls to GetCurrentDirectory() to the testsuite instead. */
|
|
#ifdef GetCurrentDirectory
|
|
#undef GetCurrentDirectory
|
|
#endif
|
|
#define GetCurrentDirectory testsuite_getcwd
|
|
|
|
DWORD testsuite_getcwd (DWORD, LPSTR);
|
|
|
|
#endif
|
|
|
|
#endif /* TESTSUITE */
|
|
|