/* Common f{truncate} tests definitions.
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

static void do_prepare (void);
#define PREPARE(argc, argv)     do_prepare ()
static int do_test (void);
#define TEST_FUNCTION           do_test ()

#include <test-skeleton.c>

static char *temp_filename;
static int temp_fd;

static void
do_prepare (void)
{
  temp_fd = create_temp_file ("tst-trucate.", &temp_filename);
  if (temp_fd == -1)
    {
      printf ("cannot create temporary file: %m\n");
      exit (1);
    }
}

#define FAIL(str) \
  do { printf ("error: %s (line %d)\n", str, __LINE__); return 1; } while (0)

static int
do_test_with_offset (off_t offset)
{
  struct stat st;
  char buf[1000];

  memset (buf, 0xcf, sizeof (buf));

  if (pwrite (temp_fd, buf, sizeof (buf), offset) != sizeof (buf))
    FAIL ("write failed");
  if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + sizeof (buf)))
    FAIL ("initial size wrong");

  if (ftruncate (temp_fd, offset + 800) < 0)
    FAIL ("size reduction with ftruncate failed");
  if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 800))
    FAIL ("size after reduction with ftruncate is incorrect");

  /* The following test covers more than POSIX.  POSIX does not require
     that ftruncate() can increase the file size.  But we are testing
     Unix systems.  */
  if (ftruncate (temp_fd, offset + 1200) < 0)
    FAIL ("size increate with ftruncate failed");
  if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 1200))
    FAIL ("size after increase is incorrect");

  if (truncate (temp_filename, offset + 800) < 0)
    FAIL ("size reduction with truncate failed");
  if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 800))
    FAIL ("size after reduction with truncate incorrect");

  /* The following test covers more than POSIX.  POSIX does not require
     that truncate() can increase the file size.  But we are testing
     Unix systems.  */
  if (truncate (temp_filename, (offset + 1200)) < 0)
    FAIL ("size increase with truncate failed");
  if (fstat (temp_fd, &st) < 0 || st.st_size != (offset + 1200))
    FAIL ("size increase with truncate is incorrect");

  return 0;
}
