tests: add TimestampGranularityUtils

Add a new test utility class
TimestampGranularityUtils which offers methods to
wait for the filesystem timestamp granularity to
pass.

Such waiting is necessary if a test asserts
changes in a file's mtime or ctime.

This is a follow-up to comments on https://github.com/bazelbuild/bazel/commit/a31e035fb42aa8db9fd248ef2ebd665a411053b8.

PiperOrigin-RevId: 188847729
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 801043a..0edfea3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -33,7 +33,6 @@
 import com.google.devtools.build.lib.actions.util.TestAction;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.ServerDirectories;
-import com.google.devtools.build.lib.clock.JavaClock;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.events.NullEventHandler;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
@@ -42,6 +41,7 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
+import com.google.devtools.build.lib.testutil.TimestampGranularityUtils;
 import com.google.devtools.build.lib.util.io.OutErr;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.BatchStat;
@@ -271,8 +271,6 @@
 
   @Test
   public void testExplicitFiles() throws Exception {
-    TimestampGranularityMonitor tsgm = new TimestampGranularityMonitor(new JavaClock());
-    tsgm.setCommandStartTime();
     FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
 
     Path path1 = fs.getPath("/foo1");
@@ -297,8 +295,8 @@
 
     // Wait for the timestamp granularity to elapse, so updating the files will observably advance
     // their ctime.
-    tsgm.notifyDependenceOnFileTime(PathFragment.create("dummy"), System.currentTimeMillis());
-    tsgm.waitForTimestampGranularity(OutErr.SYSTEM_OUT_ERR);
+    TimestampGranularityUtils.waitForTimestampGranularity(
+        System.currentTimeMillis(), OutErr.SYSTEM_OUT_ERR);
     // Update path1's contents and mtime. This will update the file's ctime.
     FileSystemUtils.writeContentAsLatin1(path1, "hello1");
     path1.setLastModifiedTime(27);