X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-fsync.c;h=9565f5228ff4a1bee6dadced9cf824814e326f19;hb=d6e564567eb4ab3033d8e08c8467e3d1a3f51c0d;hp=b6ffe2a4c6496171b42935bab1f59724c35aeefa;hpb=a49d3dade57695086cbf6a4030ed03c739c74d80;p=gnulib.git diff --git a/tests/test-fsync.c b/tests/test-fsync.c index b6ffe2a4c..9565f5228 100644 --- a/tests/test-fsync.c +++ b/tests/test-fsync.c @@ -1,9 +1,9 @@ /* Test of fsync() function. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2011 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 2 of the License, or + 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, @@ -16,36 +16,62 @@ #include +#include + +#include "signature.h" +SIGNATURE_CHECK (fsync, int, (int)); + #include -#include #include -#include -#define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) +#include "macros.h" int -main () +main (void) { int fd; const char *file = "test-fsync.txt"; - if (fsync (0) != 0) - ASSERT (errno == EINVAL); + /* Assuming stdin and stdout are ttys, fsync is allowed to fail, but + may succeed as an extension. */ + for (fd = 0; fd < 2; fd++) + if (fsync (fd) != 0) + { + ASSERT (errno == EINVAL /* POSIX */ + || errno == ENOTSUP /* seen on MacOS X 10.5 */ + || errno == EBADF /* seen on AIX 7.1 */ + ); + } + + /* fsync must fail on invalid fd. */ + { + errno = 0; + ASSERT (fsync (-1) == -1); + ASSERT (errno == EBADF); + } + { + errno = 0; + ASSERT (fsync (99) == -1); + ASSERT (errno == EBADF); + } + fd = open (file, O_WRONLY|O_CREAT|O_TRUNC, 0644); ASSERT (0 <= fd); ASSERT (write (fd, "hello", 5) == 5); ASSERT (fsync (fd) == 0); ASSERT (close (fd) == 0); + + /* For a read-only regular file input file descriptor, fsync should + succeed (since at least atime changes can be synchronized). */ + fd = open (file, O_RDONLY); + ASSERT (0 <= fd); + { + char buf[1]; + ASSERT (read (fd, buf, sizeof buf) == sizeof buf); + } + ASSERT (fsync (fd) == 0); + ASSERT (close (fd) == 0); + ASSERT (unlink (file) == 0); return 0;