]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Make the touch_file unit test work around FS/system time sync issues
authorNick Mathewson <nickm@torproject.org>
Mon, 11 Jan 2016 15:03:00 +0000 (10:03 -0500)
committerNick Mathewson <nickm@torproject.org>
Mon, 11 Jan 2016 15:03:00 +0000 (10:03 -0500)
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.

src/test/test_util.c

index 863105f002d09d47d3a44586c94174ba65d4c245..37f7d938eafb39e8b29d0de33bb4d0d71aefc3c6 100644 (file)
@@ -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:
   ;