From 87e0316958ab39e52ede17dfd17f68500d153a57 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Wed, 7 Oct 2009 09:40:32 -0600 Subject: [PATCH] areadlink, areadlink-with-size: add tests * modules/areadlink-tests: New test. * modules/areadlink-with-size-tests: Likewise. * tests/test-areadlink.h: New file. * tests/test-areadlink.c: Likewise. * tests/test-areadlink-with-size.c: Likewise. Signed-off-by: Eric Blake --- ChangeLog | 7 ++++ modules/areadlink-tests | 13 ++++++ modules/areadlink-with-size-tests | 13 ++++++ tests/test-areadlink-with-size.c | 55 +++++++++++++++++++++++++ tests/test-areadlink.c | 62 +++++++++++++++++++++++++++++ tests/test-areadlink.h | 84 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 234 insertions(+) create mode 100644 modules/areadlink-tests create mode 100644 modules/areadlink-with-size-tests create mode 100644 tests/test-areadlink-with-size.c create mode 100644 tests/test-areadlink.c create mode 100644 tests/test-areadlink.h diff --git a/ChangeLog b/ChangeLog index d7ba020e2..9a3148e94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2009-10-07 Eric Blake + areadlink, areadlink-with-size: add tests + * modules/areadlink-tests: New test. + * modules/areadlink-with-size-tests: Likewise. + * tests/test-areadlink.h: New file. + * tests/test-areadlink.c: Likewise. + * tests/test-areadlink-with-size.c: Likewise. + maint: minor cleanups * lib/fts.c (ATTRIBUTE_UNUSED): Delete; use gnulib-guaranteed _UNUSED_PARAMETER_ instead. diff --git a/modules/areadlink-tests b/modules/areadlink-tests new file mode 100644 index 000000000..0e7796e6c --- /dev/null +++ b/modules/areadlink-tests @@ -0,0 +1,13 @@ +Files: +tests/test-areadlink.h +tests/test-areadlink.c + +Depends-on: +stdbool +symlink + +configure.ac: + +Makefile.am: +TESTS += test-areadlink +check_PROGRAMS += test-areadlink diff --git a/modules/areadlink-with-size-tests b/modules/areadlink-with-size-tests new file mode 100644 index 000000000..9752034b3 --- /dev/null +++ b/modules/areadlink-with-size-tests @@ -0,0 +1,13 @@ +Files: +tests/test-areadlink.h +tests/test-areadlink-with-size.c + +Depends-on: +stdbool +symlink + +configure.ac: + +Makefile.am: +TESTS += test-areadlink-with-size +check_PROGRAMS += test-areadlink-with-size diff --git a/tests/test-areadlink-with-size.c b/tests/test-areadlink-with-size.c new file mode 100644 index 000000000..2a175a5b1 --- /dev/null +++ b/tests/test-areadlink-with-size.c @@ -0,0 +1,55 @@ +/* Tests of areadlink_with_size. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake , 2009. */ + +#include + +#include "areadlink.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + +#define BASE "test-areadlink-with-size.t" + +#include "test-areadlink.h" + +int +main () +{ + /* Remove any leftovers from a previous partial run. */ + ASSERT (system ("rm -rf " BASE "*") == 0); + + return test_areadlink (areadlink_with_size, true); +} diff --git a/tests/test-areadlink.c b/tests/test-areadlink.c new file mode 100644 index 000000000..657ea6f3c --- /dev/null +++ b/tests/test-areadlink.c @@ -0,0 +1,62 @@ +/* Tests of areadlink. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake , 2009. */ + +#include + +#include "areadlink.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + +#define BASE "test-areadlink.t" + +#include "test-areadlink.h" + +/* Wrapper for testing areadlink. */ +static char * +do_areadlink (char const *name, size_t ignored _UNUSED_PARAMETER_) +{ + return areadlink (name); +} + +int +main () +{ + /* Remove any leftovers from a previous partial run. */ + ASSERT (system ("rm -rf " BASE "*") == 0); + + return test_areadlink (do_areadlink, true); +} diff --git a/tests/test-areadlink.h b/tests/test-areadlink.h new file mode 100644 index 000000000..1da2e1b7d --- /dev/null +++ b/tests/test-areadlink.h @@ -0,0 +1,84 @@ +/* Tests of areadlink and friends. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake , 2009. */ + +/* This file is designed to test areadlink(a), + areadlink_with_size(a,b), and areadlinkat(AT_FDCWD,a). FUNC is the + function to test; a length is always supplied, but may be ignored. + 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. */ + +static int +test_areadlink (char * (*func) (char const *, size_t), bool print) +{ + /* Sanity checks of failures. Mingw lacks symlink, but areadlink can + still distinguish between various errors. */ + errno = 0; + ASSERT (func ("no_such", 1) == NULL); + ASSERT (errno == ENOENT); + errno = 0; + ASSERT (func ("no_such/", 1) == NULL); + ASSERT (errno == ENOENT); + errno = 0; + ASSERT (func ("", 1) == NULL); + ASSERT (errno == ENOENT); + errno = 0; + ASSERT (func (".", 1) == NULL); + ASSERT (errno == EINVAL); + errno = 0; + ASSERT (func ("./", 1) == NULL); + ASSERT (errno == EINVAL); + ASSERT (close (creat (BASE "file", 0600)) == 0); + errno = 0; + ASSERT (func (BASE "file", 1) == NULL); + ASSERT (errno == EINVAL); + errno = 0; + ASSERT (func (BASE "file/", 1) == NULL); + ASSERT (errno == ENOTDIR); + ASSERT (unlink (BASE "file") == 0); + + /* Now test actual symlinks. */ + if (symlink (BASE "dir", BASE "link")) + { + if (print) + fputs ("skipping test: symlinks not supported on this filesystem\n", + stderr); + return 77; + } + ASSERT (mkdir (BASE "dir", 0700) == 0); + errno = 0; + ASSERT (func (BASE "link/", 1) == NULL); + ASSERT (errno == EINVAL); + { + /* Too small a guess is okay. */ + size_t len = strlen (BASE "dir"); + char *buf = func (BASE "link", 1); + ASSERT (buf); + ASSERT (strcmp (buf, BASE "dir") == 0); + free (buf); + /* Too large a guess is okay. */ + buf = func (BASE "link", 10000000); + ASSERT (buf); + ASSERT (strcmp (buf, BASE "dir") == 0); + free (buf); + } + ASSERT (rmdir (BASE "dir") == 0); + ASSERT (unlink (BASE "link") == 0); + + return 0; +} -- 2.11.0