From: Bruno Haible Date: Sat, 30 Sep 2023 14:23:28 +0000 (+0200) Subject: wgetcwd-lgpl: Add tests. X-Git-Tag: v1.0~759 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=cbc02d24a5e064f4699939cbb15cce1a448d444a;p=gnulib.git wgetcwd-lgpl: Add tests. * tests/test-wgetcwd-lgpl.c: New file, based on tests/test-getcwd-lgpl.c. * modules/wgetcwd-lgpl-tests: New file, based on modules/getcwd-lgpl-tests. --- diff --git a/ChangeLog b/ChangeLog index cde3af6205..a8b06d31c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2023-09-30 Bruno Haible + wgetcwd-lgpl: Add tests. + * tests/test-wgetcwd-lgpl.c: New file, based on + tests/test-getcwd-lgpl.c. + * modules/wgetcwd-lgpl-tests: New file, based on + modules/getcwd-lgpl-tests. + wgetcwd-lgpl: New module. * lib/wchar.in.h (wgetcwd): New declaration. * lib/wgetcwd-lgpl.c: New file, based on lib/getcwd-lgpl.c. diff --git a/modules/wgetcwd-lgpl-tests b/modules/wgetcwd-lgpl-tests new file mode 100644 index 0000000000..4893da1db2 --- /dev/null +++ b/modules/wgetcwd-lgpl-tests @@ -0,0 +1,13 @@ +Files: +tests/test-wgetcwd-lgpl.c +tests/signature.h +tests/macros.h + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-wgetcwd-lgpl +check_PROGRAMS += test-wgetcwd-lgpl +test_wgetcwd_lgpl_LDADD = $(LDADD) $(LIBINTL) diff --git a/tests/test-wgetcwd-lgpl.c b/tests/test-wgetcwd-lgpl.c new file mode 100644 index 0000000000..382111a65e --- /dev/null +++ b/tests/test-wgetcwd-lgpl.c @@ -0,0 +1,98 @@ +/* Test of wgetcwd() function. + Copyright (C) 2009-2023 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 . */ + +#include + +#include + +#include "signature.h" +#if defined _WIN32 && !defined __CYGWIN__ +SIGNATURE_CHECK (wgetcwd, wchar_t *, (wchar_t *, size_t)); +#endif + +#include +#include +#include + +#include "macros.h" + +int +main () +{ +#if defined _WIN32 && !defined __CYGWIN__ + wchar_t *pwd1; + wchar_t *pwd2; + + pwd1 = wgetcwd (NULL, 0); + ASSERT (pwd1 && *pwd1); + + /* Make sure the result is usable. */ + ASSERT (_wchdir (pwd1) == 0); + ASSERT (_wchdir (L".//./.") == 0); + + /* Make sure that result is normalized. */ + pwd2 = wgetcwd (NULL, 0); + ASSERT (pwd2); + ASSERT (wcscmp (pwd1, pwd2) == 0); + free (pwd2); + { + size_t len = wcslen (pwd1); + ssize_t i = len - 10; + if (i < 1) + i = 1; + pwd2 = wgetcwd (NULL, len + 1); + ASSERT (pwd2); + free (pwd2); + pwd2 = malloc ((len + 3) * sizeof (wchar_t)); + for ( ; i <= len; i++) + { + wchar_t *tmp; + errno = 0; + ASSERT (wgetcwd (pwd2, i) == NULL); + ASSERT (errno == ERANGE); + /* Allow either glibc or BSD behavior, since POSIX allows both. */ + errno = 0; + tmp = wgetcwd (NULL, i); + if (tmp) + { + ASSERT (wcscmp (pwd1, tmp) == 0); + free (tmp); + } + else + { + ASSERT (errno == ERANGE); + } + } + /* The SIZE argument here needs to be len + 3, not len + 1. */ + ASSERT (wgetcwd (pwd2, len + 3) == pwd2); + pwd2[len] = L'/'; + pwd2[len + 1] = L'\0'; + } + ASSERT (wcsstr (pwd2, L"/./") == NULL); + ASSERT (wcsstr (pwd2, L"/../") == NULL); + ASSERT (wcsstr (pwd2 + 1 + (pwd2[1] == L'/'), L"//") == NULL); + + /* Validate a POSIX requirement on size. */ + errno = 0; + ASSERT (wgetcwd (pwd2, 0) == NULL); + ASSERT (errno == EINVAL); + + free (pwd1); + free (pwd2); +#endif + + return 0; +}