LCOV - code coverage report
Current view: top level - gltests - test-getcwd-lgpl.c (source / functions) Hit Total Coverage
Test: GNU Libidn Lines: 38 44 86.4 %
Date: 2020-07-22 17:53:13 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* Test of getcwd() function.
       2             :    Copyright (C) 2009-2020 Free Software Foundation, Inc.
       3             : 
       4             :    This program is free software: you can redistribute it and/or modify
       5             :    it under the terms of the GNU General Public License as published by
       6             :    the Free Software Foundation; either version 3 of the License, or
       7             :    (at your option) any later version.
       8             : 
       9             :    This program is distributed in the hope that it will be useful,
      10             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12             :    GNU General Public License for more details.
      13             : 
      14             :    You should have received a copy of the GNU General Public License
      15             :    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16             : 
      17             : #include <config.h>
      18             : 
      19             : #include <unistd.h>
      20             : 
      21             : #include "signature.h"
      22             : SIGNATURE_CHECK (getcwd, char *, (char *, size_t));
      23             : 
      24             : #include <errno.h>
      25             : #include <stdio.h>
      26             : #include <stdlib.h>
      27             : #include <string.h>
      28             : 
      29             : #include "macros.h"
      30             : 
      31             : int
      32           1 : main (int argc, char **argv)
      33             : {
      34             :   char *pwd1;
      35             :   char *pwd2;
      36             :   /* If the user provides an argument, attempt to chdir there first.  */
      37           1 :   if (1 < argc)
      38             :     {
      39           0 :       if (chdir (argv[1]) == 0)
      40           0 :         printf ("changed to directory %s\n", argv[1]);
      41             :     }
      42             : 
      43           1 :   pwd1 = getcwd (NULL, 0);
      44           1 :   ASSERT (pwd1 && *pwd1);
      45           1 :   if (1 < argc)
      46           0 :     printf ("cwd=%s\n", pwd1);
      47             : 
      48             :   /* Make sure the result is usable.  */
      49           1 :   ASSERT (chdir (pwd1) == 0);
      50           1 :   ASSERT (chdir (".//./.") == 0);
      51             : 
      52             :   /* Make sure that result is normalized.  */
      53           1 :   pwd2 = getcwd (NULL, 0);
      54           1 :   ASSERT (pwd2);
      55           1 :   ASSERT (strcmp (pwd1, pwd2) == 0);
      56           1 :   free (pwd2);
      57             :   {
      58           1 :     size_t len = strlen (pwd1);
      59           1 :     ssize_t i = len - 10;
      60           1 :     if (i < 1)
      61           0 :       i = 1;
      62           1 :     pwd2 = getcwd (NULL, len + 1);
      63           1 :     ASSERT (pwd2);
      64           1 :     free (pwd2);
      65           1 :     pwd2 = malloc (len + 2);
      66          12 :     for ( ; i <= len; i++)
      67             :       {
      68             :         char *tmp;
      69          11 :         errno = 0;
      70          11 :         ASSERT (getcwd (pwd2, i) == NULL);
      71          11 :         ASSERT (errno == ERANGE);
      72             :         /* Allow either glibc or BSD behavior, since POSIX allows both.  */
      73          11 :         errno = 0;
      74          11 :         tmp = getcwd (NULL, i);
      75          11 :         if (tmp)
      76             :           {
      77           0 :             ASSERT (strcmp (pwd1, tmp) == 0);
      78           0 :             free (tmp);
      79             :           }
      80             :         else
      81             :           {
      82          11 :             ASSERT (errno == ERANGE);
      83             :           }
      84             :       }
      85           1 :     ASSERT (getcwd (pwd2, len + 1) == pwd2);
      86           1 :     pwd2[len] = '/';
      87           1 :     pwd2[len + 1] = '\0';
      88             :   }
      89           1 :   ASSERT (strstr (pwd2, "/./") == NULL);
      90           1 :   ASSERT (strstr (pwd2, "/../") == NULL);
      91           1 :   ASSERT (strstr (pwd2 + 1 + (pwd2[1] == '/'), "//") == NULL);
      92             : 
      93             :   /* Validate a POSIX requirement on size.  */
      94           1 :   errno = 0;
      95           1 :   ASSERT (getcwd(pwd2, 0) == NULL);
      96           1 :   ASSERT (errno == EINVAL);
      97             : 
      98           1 :   free (pwd1);
      99           1 :   free (pwd2);
     100             : 
     101           1 :   return 0;
     102             : }

Generated by: LCOV version 1.13