Blame gl/tests/test-stat.h

Packit Service 4684c1
/* Tests of stat.
Packit Service 4684c1
   Copyright (C) 2009-2020 Free Software Foundation, Inc.
Packit Service 4684c1
Packit Service 4684c1
   This program is free software: you can redistribute it and/or modify
Packit Service 4684c1
   it under the terms of the GNU General Public License as published by
Packit Service 4684c1
   the Free Software Foundation; either version 3 of the License, or
Packit Service 4684c1
   (at your option) any later version.
Packit Service 4684c1
Packit Service 4684c1
   This program is distributed in the hope that it will be useful,
Packit Service 4684c1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 4684c1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 4684c1
   GNU General Public License for more details.
Packit Service 4684c1
Packit Service 4684c1
   You should have received a copy of the GNU General Public License
Packit Service 4684c1
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
Packit Service 4684c1
Packit Service 4684c1
/* Written by Eric Blake <ebb9@byu.net>, 2009.  */
Packit Service 4684c1
Packit Service 4684c1
/* This file is designed to test both stat(n,buf) and
Packit Service 4684c1
   fstatat(AT_FDCWD,n,buf,0).  FUNC is the function to test.  Assumes
Packit Service 4684c1
   that BASE and ASSERT are already defined, and that appropriate
Packit Service 4684c1
   headers are already included.  If PRINT, warn before skipping
Packit Service 4684c1
   symlink tests with status 77.  */
Packit Service 4684c1
Packit Service 4684c1
static int
Packit Service 4684c1
test_stat_func (int (*func) (char const *, struct stat *), bool print)
Packit Service 4684c1
{
Packit Service 4684c1
  struct stat st1;
Packit Service 4684c1
  struct stat st2;
Packit Service 4684c1
  char *cwd = getcwd (NULL, 0);
Packit Service 4684c1
Packit Service 4684c1
  ASSERT (cwd);
Packit Service 4684c1
  ASSERT (func (".", &st1) == 0);
Packit Service 4684c1
  ASSERT (func ("./", &st2) == 0);
Packit Service 4684c1
#if !(defined _WIN32 && !defined __CYGWIN__ && !_GL_WINDOWS_STAT_INODES)
Packit Service 4684c1
  ASSERT (SAME_INODE (st1, st2));
Packit Service 4684c1
#endif
Packit Service 4684c1
  ASSERT (func (cwd, &st2) == 0);
Packit Service 4684c1
#if !(defined _WIN32 && !defined __CYGWIN__ && !_GL_WINDOWS_STAT_INODES)
Packit Service 4684c1
  ASSERT (SAME_INODE (st1, st2));
Packit Service 4684c1
#endif
Packit Service 4684c1
  ASSERT (func ("/", &st1) == 0);
Packit Service 4684c1
  ASSERT (func ("///", &st2) == 0);
Packit Service 4684c1
#if !(defined _WIN32 && !defined __CYGWIN__ && !_GL_WINDOWS_STAT_INODES)
Packit Service 4684c1
  ASSERT (SAME_INODE (st1, st2));
Packit Service 4684c1
#endif
Packit Service 4684c1
Packit Service 4684c1
  errno = 0;
Packit Service 4684c1
  ASSERT (func ("", &st1) == -1);
Packit Service 4684c1
  ASSERT (errno == ENOENT);
Packit Service 4684c1
  errno = 0;
Packit Service 4684c1
  ASSERT (func ("nosuch", &st1) == -1);
Packit Service 4684c1
  ASSERT (errno == ENOENT);
Packit Service 4684c1
  errno = 0;
Packit Service 4684c1
  ASSERT (func ("nosuch/", &st1) == -1);
Packit Service 4684c1
  ASSERT (errno == ENOENT);
Packit Service 4684c1
Packit Service 4684c1
  ASSERT (close (creat (BASE "file", 0600)) == 0);
Packit Service 4684c1
  ASSERT (func (BASE "file", &st1) == 0);
Packit Service 4684c1
  errno = 0;
Packit Service 4684c1
  ASSERT (func (BASE "file/", &st1) == -1);
Packit Service 4684c1
  ASSERT (errno == ENOTDIR);
Packit Service 4684c1
Packit Service 4684c1
  /* Now for some symlink tests, where supported.  We set up:
Packit Service 4684c1
     link1 -> directory
Packit Service 4684c1
     link2 -> file
Packit Service 4684c1
     link3 -> dangling
Packit Service 4684c1
     link4 -> loop
Packit Service 4684c1
     then test behavior with trailing slash.
Packit Service 4684c1
  */
Packit Service 4684c1
  if (symlink (".", BASE "link1") != 0)
Packit Service 4684c1
    {
Packit Service 4684c1
      ASSERT (unlink (BASE "file") == 0);
Packit Service 4684c1
      if (print)
Packit Service 4684c1
        fputs ("skipping test: symlinks not supported on this file system\n",
Packit Service 4684c1
               stderr);
Packit Service 4684c1
      return 77;
Packit Service 4684c1
    }
Packit Service 4684c1
  ASSERT (symlink (BASE "file", BASE "link2") == 0);
Packit Service 4684c1
  ASSERT (symlink (BASE "nosuch", BASE "link3") == 0);
Packit Service 4684c1
  ASSERT (symlink (BASE "link4", BASE "link4") == 0);
Packit Service 4684c1
Packit Service 4684c1
  ASSERT (func (BASE "link1/", &st1) == 0);
Packit Service 4684c1
  ASSERT (S_ISDIR (st1.st_mode));
Packit Service 4684c1
Packit Service 4684c1
  errno = 0;
Packit Service 4684c1
  ASSERT (func (BASE "link2/", &st1) == -1);
Packit Service 4684c1
  ASSERT (errno == ENOTDIR);
Packit Service 4684c1
Packit Service 4684c1
  errno = 0;
Packit Service 4684c1
  ASSERT (func (BASE "link3/", &st1) == -1);
Packit Service 4684c1
  ASSERT (errno == ENOENT);
Packit Service 4684c1
Packit Service 4684c1
  errno = 0;
Packit Service 4684c1
  ASSERT (func (BASE "link4/", &st1) == -1);
Packit Service 4684c1
  ASSERT (errno == ELOOP);
Packit Service 4684c1
Packit Service 4684c1
  /* Cleanup.  */
Packit Service 4684c1
  ASSERT (unlink (BASE "file") == 0);
Packit Service 4684c1
  ASSERT (unlink (BASE "link1") == 0);
Packit Service 4684c1
  ASSERT (unlink (BASE "link2") == 0);
Packit Service 4684c1
  ASSERT (unlink (BASE "link3") == 0);
Packit Service 4684c1
  ASSERT (unlink (BASE "link4") == 0);
Packit Service 4684c1
  free (cwd);
Packit Service 4684c1
Packit Service 4684c1
  return 0;
Packit Service 4684c1
}