]> Savannah Git Hosting - gnulib.git/commitdiff
wgetcwd-lgpl: Add tests.
authorBruno Haible <bruno@clisp.org>
Sat, 30 Sep 2023 14:23:28 +0000 (16:23 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 30 Sep 2023 17:31:49 +0000 (19:31 +0200)
* 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.

ChangeLog
modules/wgetcwd-lgpl-tests [new file with mode: 0644]
tests/test-wgetcwd-lgpl.c [new file with mode: 0644]

index cde3af62050d93824860ed941c96fb4c267f1a25..a8b06d31c6efc52f4d45972de3fe853fd5ae4c66 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2023-09-30  Bruno Haible  <bruno@clisp.org>
 
+       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 (file)
index 0000000..4893da1
--- /dev/null
@@ -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 (file)
index 0000000..382111a
--- /dev/null
@@ -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 <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include <wchar.h>
+
+#include "signature.h"
+#if defined _WIN32 && !defined __CYGWIN__
+SIGNATURE_CHECK (wgetcwd, wchar_t *, (wchar_t *, size_t));
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#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;
+}