summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2009-09-29 11:40:49 -0600
committerEric Blake <ebb9@byu.net>2009-10-01 05:34:12 -0600
commit0f4fd7f4782907e0a308a077118c6578fff4e49f (patch)
treeb513b039b277282f8adc2015e3180792baf99745 /tests
parent1c233a6b61e3aca04d0edd02ad31a276d35bfcf4 (diff)
downloadgnulib-0f4fd7f4782907e0a308a077118c6578fff4e49f.tar.gz
tests: tighten link, rmdir, and remove tests
Catch cygwin bug where rmdir("a/./") failed but rmdir("a/.//") succeeded. Be kinder if a Solaris root user runs the test. * tests/test-link.h (includes): No need to use <config.h> here. Clean up if directory hard link was created, otherwise test for trailing '.'. * tests/test-linkat.c (main): Simplify. * tests/test-remove.c (main): Enhance test for trailing '.'. * tests/test-rmdir.h (test_rmdir_func): Likewise. Signed-off-by: Eric Blake <ebb9@byu.net>
Diffstat (limited to 'tests')
-rw-r--r--tests/test-link.h39
-rw-r--r--tests/test-linkat.c40
-rw-r--r--tests/test-remove.c2
-rw-r--r--tests/test-rmdir.h2
4 files changed, 50 insertions, 33 deletions
diff --git a/tests/test-link.h b/tests/test-link.h
index 9ce1894588..4d08e7b462 100644
--- a/tests/test-link.h
+++ b/tests/test-link.h
@@ -14,13 +14,12 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#include <config.h>
-
/* This file is designed to test both link(a,b) and
- linkat(AT_FDCWD,a,AT_FDCWD,b). FUNC is the function to test.
+ linkat(AT_FDCWD,a,AT_FDCWD,b,0). FUNC is the function to test.
Assumes that BASE and ASSERT are already defined, and that
appropriate headers are already included. If PRINT, warn before
- skipping symlink tests with status 77. */
+ skipping tests with status 77. This test does not exercise link on
+ symlinks. */
static int
test_link (int (*func) (char const *, char const *), bool print)
@@ -93,8 +92,7 @@ test_link (int (*func) (char const *, char const *), bool print)
ASSERT (close (fd) == 0);
}
- /* Test for various error conditions. Assumes hard links to
- directories are not permitted. */
+ /* Test for various error conditions. */
ASSERT (mkdir (BASE "d", 0700) == 0);
errno = 0;
ASSERT (func (BASE "a", ".") == -1);
@@ -121,9 +119,32 @@ test_link (int (*func) (char const *, char const *), bool print)
errno = 0;
ASSERT (func (BASE "a", BASE "c/") == -1);
ASSERT (errno == ENOTDIR || errno == ENOENT);
- errno = 0;
- ASSERT (func (BASE "d", BASE "c") == -1);
- ASSERT (errno == EPERM || errno == EACCES);
+
+ /* Most platforms reject hard links to directories, and even on
+ those that do permit it, most users can't create them. We assume
+ that if this test is run as root and we managed to create a hard
+ link, then unlink better be able to clean it up. */
+ {
+ int result;
+ errno = 0;
+ result = func (BASE "d", BASE "c");
+ if (result == 0)
+ {
+ /* Probably root on Solaris. */
+ ASSERT (unlink (BASE "c") == 0);
+ }
+ else
+ {
+ /* Most everyone else. */
+ ASSERT (errno == EPERM || errno == EACCES);
+ errno = 0;
+ ASSERT (func (BASE "d/.", BASE "c") == -1);
+ ASSERT (errno == EPERM || errno == EACCES || errno == EINVAL);
+ errno = 0;
+ ASSERT (func (BASE "d/.//", BASE "c") == -1);
+ ASSERT (errno == EPERM || errno == EACCES || errno == EINVAL);
+ }
+ }
/* Clean up. */
ASSERT (unlink (BASE "a") == 0);
diff --git a/tests/test-linkat.c b/tests/test-linkat.c
index f5c4c77619..6aa3ca71d1 100644
--- a/tests/test-linkat.c
+++ b/tests/test-linkat.c
@@ -92,32 +92,28 @@ main ()
ASSERT (system ("rm -rf " BASE "*") == 0);
/* Test basic link functionality, without mentioning symlinks. */
- {
- result = test_link (do_link, false);
- dfd1 = open (".", O_RDONLY);
- ASSERT (0 <= dfd1);
- ASSERT (test_link (do_link, false) == result);
- dfd2 = dfd1;
- ASSERT (test_link (do_link, false) == result);
- dfd1 = AT_FDCWD;
- ASSERT (test_link (do_link, false) == result);
- flag = 0;
- ASSERT (test_link (do_link, false) == result);
- dfd1 = dfd2;
- ASSERT (test_link (do_link, false) == result);
- dfd2 = AT_FDCWD;
- ASSERT (test_link (do_link, false) == result);
- ASSERT (close (dfd1) == 0);
- dfd1 = AT_FDCWD;
- ASSERT (test_link (do_link, false) == result);
- }
+ result = test_link (do_link, false);
+ dfd1 = open (".", O_RDONLY);
+ ASSERT (0 <= dfd1);
+ ASSERT (test_link (do_link, false) == result);
+ dfd2 = dfd1;
+ ASSERT (test_link (do_link, false) == result);
+ dfd1 = AT_FDCWD;
+ ASSERT (test_link (do_link, false) == result);
+ flag = 0;
+ ASSERT (test_link (do_link, false) == result);
+ dfd1 = dfd2;
+ ASSERT (test_link (do_link, false) == result);
+ dfd2 = AT_FDCWD;
+ ASSERT (test_link (do_link, false) == result);
+ ASSERT (close (dfd1) == 0);
+ dfd1 = AT_FDCWD;
+ ASSERT (test_link (do_link, false) == result);
/* Create locations to manipulate. */
ASSERT (mkdir (BASE "sub1", 0700) == 0);
ASSERT (mkdir (BASE "sub2", 0700) == 0);
- dfd = creat (BASE "00", 0600);
- ASSERT (0 <= dfd);
- ASSERT (close (dfd) == 0);
+ ASSERT (close (creat (BASE "00", 0600)) == 0);
cwd = xgetcwd ();
dfd = open (BASE "sub1", O_RDONLY);
diff --git a/tests/test-remove.c b/tests/test-remove.c
index 99edb0c14f..c084d8c656 100644
--- a/tests/test-remove.c
+++ b/tests/test-remove.c
@@ -83,7 +83,7 @@ main ()
/* Empty directory. */
errno = 0;
- ASSERT (remove (BASE "dir/./") == -1);
+ ASSERT (remove (BASE "dir/.//") == -1);
ASSERT (errno == EINVAL || errno == EBUSY);
ASSERT (remove (BASE "dir") == 0);
diff --git a/tests/test-rmdir.h b/tests/test-rmdir.h
index bb7b344729..94636ddad9 100644
--- a/tests/test-rmdir.h
+++ b/tests/test-rmdir.h
@@ -68,7 +68,7 @@ test_rmdir_func (int (*func) (char const *name), bool print)
/* Empty directory. */
ASSERT (unlink (BASE "dir/file") == 0);
errno = 0;
- ASSERT (func (BASE "dir/./") == -1);
+ ASSERT (func (BASE "dir/.//") == -1);
ASSERT (errno == EINVAL || errno == EBUSY);
ASSERT (func (BASE "dir") == 0);