changeset 12147:a620bedbe958

test-stat-time: port to buggy NFS clients On darwin, the NFS client reports mtime with st_sec==INT_MAX and st_nsec monotonically increasing per transaction until the next sync(); but sync() is expensive, so it is easier to just skip this part of the test if mtime is nowhere near ctime. * tests/test-stat-time.c (main) [W32]: Reduce ifdefs. (test_ctime): Also skip test if mtime and ctime are skewed. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Fri, 09 Oct 2009 21:09:38 -0600
parents e076a06bae48
children 3c9981d0d9c3
files ChangeLog tests/test-stat-time.c
diffstat 2 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2009-10-09  Eric Blake  <ebb9@byu.net>
 
+	test-stat-time: port to buggy NFS clients
+	* tests/test-stat-time.c (main) [W32]: Reduce ifdefs.
+	(test_ctime): Also skip test if mtime and ctime are skewed.
+
 	maint: prefer 'file system' over 'filesystem'
 	* doc/posix-functions/fstatat.texi (fstatat): Likewise.
 	* doc/posix-functions/lstat.texi (lstat): Likewise.
--- a/tests/test-stat-time.c
+++ b/tests/test-stat-time.c
@@ -186,10 +186,21 @@
     }
 }
 
-#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+/* Skip the ctime tests on native Windows platforms, because their
+   st_ctime is either the same as st_mtime (plus or minus an offset)
+   or set to the file _creation_ time, and is not influenced by rename
+   or chmod.  */
+# define test_ctime ((void) 0)
+#else
 static void
 test_ctime (const struct stat *statinfo)
 {
+  /* On some buggy NFS clients, mtime and ctime are disproportionately
+     skewed from one another.  Skip this test in that case.  */
+  if (statinfo[0].st_mtime != statinfo[0].st_ctime)
+    return;
+
   /* mtime(stamp2) < ctime(renamed) */
   ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime
           || (statinfo[2].st_mtime == statinfo[1].st_ctime
@@ -246,12 +257,7 @@
   cleanup (0);
   prepare_test (statinfo, modtimes);
   test_mtime (statinfo, modtimes);
-  /* Skip the ctime tests on native Windows platforms, because there st_ctime
-     is either the same as st_mtime (plus or minus an offset) or set to the
-     file _creation_ time, and is not influenced by rename or chmod.  */
-#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
   test_ctime (statinfo);
-#endif
   test_birthtime (statinfo, modtimes, birthtimes);
 
   cleanup (0);