/* Test of <stat-time.h>.
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007-2008 Free Software Foundation, Inc.
- This program is free software; you can redistribute it and/or modify
+ 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, or (at your option)
- any later version.
+ 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
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, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by James Youngman <jay@gnu.org>, 2007. */
if (!(expr)) \
{ \
fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
+ fflush (stderr); \
abort (); \
} \
} \
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);
/* 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) */
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) */
}
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);