From: Bruno Haible Date: Sat, 13 May 2017 00:55:24 +0000 (+0200) Subject: truncate-tests: New module. X-Git-Tag: v1.0~6160 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=63e26828e0f25abb7510a221c229a2e8a6b6de81;p=gnulib.git truncate-tests: New module. * tests/test-truncate.c: New file. * modules/truncate-tests: New file. --- diff --git a/ChangeLog b/ChangeLog index c8556f38ab..a9564f27cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,9 @@ * tests/test-unistd-c++.cc (truncate): Test signature. * doc/posix-functions/truncate.texi: Mention the new module. + * tests/test-truncate.c: New file. + * modules/truncate-tests: New file. + 2017-05-13 Bruno Haible windows-stat-timespec: New module. diff --git a/modules/truncate-tests b/modules/truncate-tests new file mode 100644 index 0000000000..9c1125f1e1 --- /dev/null +++ b/modules/truncate-tests @@ -0,0 +1,12 @@ +Files: +tests/test-truncate.c +tests/signature.h +tests/macros.h + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-truncate +check_PROGRAMS += test-truncate diff --git a/tests/test-truncate.c b/tests/test-truncate.c new file mode 100644 index 0000000000..f5b72e19f5 --- /dev/null +++ b/tests/test-truncate.c @@ -0,0 +1,110 @@ +/* Test truncating a file. + Copyright (C) 2017 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" +SIGNATURE_CHECK (truncate, int, (const char *, off_t)); + +#include +#include + +#include "ignore-value.h" +#include "macros.h" + +#define BASE "test-truncate.t" + +int +main (int argc, char *argv[]) +{ + /* Clean up any trash from prior testsuite runs. */ + ignore_value (system ("rm -rf " BASE "*")); + + { + int fd = open (BASE "file", O_RDWR | O_TRUNC | O_CREAT, 0600); + ASSERT (fd >= 0); + ASSERT (write (fd, "Hello", 5) == 5); + close (fd); + } + + { + int fd = open (BASE "file", O_RDONLY); + ASSERT (fd >= 0); + ASSERT (lseek (fd, 0, SEEK_END) == 5); + close (fd); + } + + /* Test increasing the size. */ + ASSERT (truncate (BASE "file", 314159) == 0); + { + int fd = open (BASE "file", O_RDONLY); + ASSERT (fd >= 0); + ASSERT (lseek (fd, 0, SEEK_END) == 314159); + close (fd); + } + + /* Test reducing the size. */ + ASSERT (truncate (BASE "file", 3) == 0); + { + int fd = open (BASE "file", O_RDONLY); + ASSERT (fd >= 0); + ASSERT (lseek (fd, 0, SEEK_END) == 3); + close (fd); + } + + /* Test reducing the size to 0. */ + ASSERT (truncate (BASE "file", 0) == 0); + { + int fd = open (BASE "file", O_RDONLY); + ASSERT (fd >= 0); + ASSERT (lseek (fd, 0, SEEK_END) == 0); + close (fd); + } + + /* Test behaviour for nonexistent files. */ + { + errno = 0; + ASSERT (truncate ("/nonexistent", 0) == -1); + ASSERT (errno == ENOENT); + } + /* Test behaviour for directories. */ + { + errno = 0; + ASSERT (truncate (".", 0) == -1); + ASSERT (errno == EISDIR + || /* on native Windows */ errno == EACCES); + } + /* Test behaviour for trailing slashes. */ + { + errno = 0; + ASSERT (truncate (BASE "file/", 0) == -1); + ASSERT (errno == ENOTDIR + || /* on native Windows */ errno == EINVAL); + } + /* Test behaviour for invalid lengths. */ + { + errno = 0; + ASSERT (truncate (BASE "file", -3) == -1); + ASSERT (errno == EINVAL); + } + + /* Cleanup. */ + ASSERT (unlink (BASE "file") == 0); + + return 0; +}