summaryrefslogtreecommitdiffstats
path: root/winsup/utils/testsuite.h
diff options
context:
space:
mode:
authorBrian Dessent <brian@dessent.net>2008-03-09 04:10:10 +0000
committerBrian Dessent <brian@dessent.net>2008-03-09 04:10:10 +0000
commit59fb00ae07d9cfbfac3735f541149bed2c7625cb (patch)
treede577bf100b29e165aaddd3c7a2076b422feb7f7 /winsup/utils/testsuite.h
parent68d2dd03a33cfa5c0feff6ce5618062a6ea3b613 (diff)
downloadcygnal-59fb00ae07d9cfbfac3735f541149bed2c7625cb.tar.gz
cygnal-59fb00ae07d9cfbfac3735f541149bed2c7625cb.tar.bz2
cygnal-59fb00ae07d9cfbfac3735f541149bed2c7625cb.zip
* Makefile.in: Add a 'check' target that builds and runs
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.
Diffstat (limited to 'winsup/utils/testsuite.h')
-rw-r--r--winsup/utils/testsuite.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/winsup/utils/testsuite.h b/winsup/utils/testsuite.h
new file mode 100644
index 000000000..3bc360ab5
--- /dev/null
+++ b/winsup/utils/testsuite.h
@@ -0,0 +1,131 @@
+/* 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 */
+