Make test-stat-time pass on mingw.
authorBruno Haible <bruno@clisp.org>
Sun, 27 Apr 2008 22:12:56 +0000 (00:12 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 27 Apr 2008 22:12:56 +0000 (00:12 +0200)
ChangeLog
modules/stat-time-tests
tests/test-stat-time.c

index dfd8ca3ad4a655850d994478685787f117a5e9c3..5be5a26462d1021658d712a8d92eeb1f84dc619f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-04-27  Bruno Haible  <bruno@clisp.org>
+
+       * modules/stat-time-tests (Depends-on): Add sleep.
+       * tests/test-stat-time.c (force_unlink): New function.
+       (cleanup): Use it.
+       (test_mtime): Remove the ctime related tests.
+       (test_ctime): New function, containing the ctime related tests.
+       (main): Call test_ctime, except on native Windows platforms.
+
 2008-04-27  Bruno Haible  <bruno@clisp.org>
 
        * lib/rpmatch.c (rpmatch): Add some comments.
index 8c6147bb901ea691a3ae828550394c2d97b24046..d4f6041a2aae67be8593fd333d7a7caf12c962d8 100644 (file)
@@ -3,6 +3,7 @@ tests/test-stat-time.c
 
 Depends-on:
 time
+sleep
 
 configure.ac:
 
index 0289531789c69c69a8859071dc2679216d1f8727..ac86945249cac8f3e99e039777597ffee57d2ff3 100644 (file)
 
 enum { NFILES = 4 };
 
+static void
+force_unlink (const char *filename)
+{
+  /* This chmod is necessary on mingw, where unlink() of a read-only file
+     fails with EPERM.  */
+  chmod (filename, 0600);
+  unlink (filename);
+}
+
 static void
 cleanup (int sig)
 {
   /* Remove temporary files.  */
-  unlink ("t-stt-stamp1");
-  unlink ("t-stt-testfile");
-  unlink ("t-stt-stamp2");
-  unlink ("t-stt-renamed");
-  unlink ("t-stt-stamp3");
+  force_unlink ("t-stt-stamp1");
+  force_unlink ("t-stt-testfile");
+  force_unlink ("t-stt-stamp2");
+  force_unlink ("t-stt-renamed");
+  force_unlink ("t-stt-stamp3");
 
   if (sig != 0)
     _exit (1);
@@ -117,7 +126,6 @@ test_mtime (const struct stat *statinfo, struct timespec *modtimes)
   /* Use the struct stat fields directly. */
   ASSERT (statinfo[0].st_mtime < statinfo[2].st_mtime); /* mtime(stamp1) < mtime(stamp2) */
   ASSERT (statinfo[2].st_mtime < statinfo[3].st_mtime); /* mtime(stamp2) < mtime(stamp3) */
-  ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime); /* mtime(stamp2) < ctime(renamed) */
 
   /* Now check the result of the access functions. */
   ASSERT (modtimes[0].tv_sec < modtimes[2].tv_sec); /* mtime(stamp1) < mtime(stamp2) */
@@ -130,6 +138,12 @@ test_mtime (const struct stat *statinfo, struct timespec *modtimes)
       ts = get_stat_mtime (&statinfo[i]);
       ASSERT (ts.tv_sec == statinfo[i].st_mtime);
     }
+}
+
+static void
+test_ctime (const struct stat *statinfo)
+{
+  ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime); /* mtime(stamp2) < ctime(renamed) */
 
   ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime); /* mtime(stamp2) < ctime(renamed) */
 }
@@ -176,6 +190,12 @@ main ()
   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);