Tests for function fdopen().
[gnulib.git] / tests / test-fsync.c
index b6ffe2a..9565f52 100644 (file)
@@ -1,9 +1,9 @@
 /* Test of fsync() function.
 /* 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
 
    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,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
 #include <config.h>
 
 
 #include <config.h>
 
+#include <unistd.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (fsync, int, (int));
+
 #include <errno.h>
 #include <errno.h>
-#include <stdio.h>
 #include <fcntl.h>
 #include <fcntl.h>
-#include <unistd.h>
 
 
-#define ASSERT(expr) \
-  do                                                                         \
-    {                                                                        \
-      if (!(expr))                                                           \
-        {                                                                    \
-          fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
-          fflush (stderr);                                                   \
-          abort ();                                                          \
-        }                                                                    \
-    }                                                                        \
-  while (0)
+#include "macros.h"
 
 int
 
 int
-main ()
+main (void)
 {
   int fd;
   const char *file = "test-fsync.txt";
 
 {
   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);
   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;
   ASSERT (unlink (file) == 0);
 
   return 0;