Browse Source

Make the touch_file unit test work around FS/system time sync issues

Sometimes you can call time() and then touch a file, and have the
second come out a little before the first.  See #18025 for way more
information than you necessarily wanted.
Nick Mathewson 8 years ago
parent
commit
16840e52e5
1 changed files with 7 additions and 2 deletions
  1. 7 2
      src/test/test_util.c

+ 7 - 2
src/test/test_util.c

@@ -4612,18 +4612,23 @@ test_util_touch_file(void *arg)
   struct stat st;
   write_bytes_to_file(fname, "abc", 3, 1);
   tt_int_op(0, OP_EQ, stat(fname, &st));
-  tt_i64_op(st.st_mtime, OP_GE, now);
+  /* A subtle point: the filesystem time is not necessarily equal to the
+   * system clock time, since one can be using a monotonic clock, or coarse
+   * monotonic clock, or whatever.  So we might wind up with an mtime a few
+   * microseconds ago.  Let's just give it a lot of wiggle room. */
+  tt_i64_op(st.st_mtime, OP_GE, now - 1);
 
   const time_t five_sec_ago = now - 5;
   struct utimbuf u = { five_sec_ago, five_sec_ago };
   tt_int_op(0, OP_EQ, utime(fname, &u));
   tt_int_op(0, OP_EQ, stat(fname, &st));
+  /* Let's hope that utime/stat give the same second as a round-trip? */
   tt_i64_op(st.st_mtime, OP_EQ, five_sec_ago);
 
   /* Finally we can touch the file */
   tt_int_op(0, OP_EQ, touch_file(fname));
   tt_int_op(0, OP_EQ, stat(fname, &st));
-  tt_i64_op(st.st_mtime, OP_GE, now);
+  tt_i64_op(st.st_mtime, OP_GE, now-1);
 
  done:
   ;