Fix FileSnapshotTests for filesystem with high timestamp resolution

When filesystem timestamp resolution is very high some tests don't work
since runtime of the test setup is too long to reach a racily clean
FileSnapshot. Hence skip these tests when timestamp resolution is higher
than 10 millisecond.

Change-Id: Ie47dd10eda22037b5c1ebff6b6becce0654ea807
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
Matthias Sohn 2019-07-10 16:17:21 +02:00
parent bce4ac97fa
commit 9eff45e4f2
1 changed files with 14 additions and 2 deletions

View File

@ -52,7 +52,9 @@
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.FileTime; import java.nio.file.attribute.FileTime;
import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.concurrent.TimeUnit;
import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.FileUtils; import org.eclipse.jgit.util.FileUtils;
@ -66,12 +68,14 @@ public class FileSnapshotTest {
private Path trash; private Path trash;
private Duration fsTimerResolution;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
trash = Files.createTempDirectory("tmp_"); trash = Files.createTempDirectory("tmp_");
// measure timer resolution before the test to avoid time critical tests // measure timer resolution before the test to avoid time critical tests
// are affected by time needed for measurement // are affected by time needed for measurement
FS.getFsTimerResolution(trash.getParent()); fsTimerResolution = FS.getFsTimerResolution(trash.getParent());
} }
@Before @Before
@ -114,10 +118,14 @@ public void testActuallyIsModifiedTrivial() throws Exception {
*/ */
@Test @Test
public void testNewFileWithWait() throws Exception { public void testNewFileWithWait() throws Exception {
// if filesystem timestamp resolution is high the snapshot won't be
// racily clean
Assume.assumeTrue(
fsTimerResolution.compareTo(Duration.ofMillis(10)) > 0);
Path f1 = createFile("newfile"); Path f1 = createFile("newfile");
waitNextTick(f1); waitNextTick(f1);
FileSnapshot save = FileSnapshot.save(f1.toFile()); FileSnapshot save = FileSnapshot.save(f1.toFile());
Thread.sleep(1500); TimeUnit.NANOSECONDS.sleep(fsTimerResolution.dividedBy(2).toNanos());
assertTrue(save.isModified(f1.toFile())); assertTrue(save.isModified(f1.toFile()));
} }
@ -128,6 +136,10 @@ public void testNewFileWithWait() throws Exception {
*/ */
@Test @Test
public void testNewFileNoWait() throws Exception { public void testNewFileNoWait() throws Exception {
// if filesystem timestamp resolution is high the snapshot won't be
// racily clean
Assume.assumeTrue(
fsTimerResolution.compareTo(Duration.ofMillis(10)) > 0);
Path f1 = createFile("newfile"); Path f1 = createFile("newfile");
FileSnapshot save = FileSnapshot.save(f1.toFile()); FileSnapshot save = FileSnapshot.save(f1.toFile());
assertTrue(save.isModified(f1.toFile())); assertTrue(save.isModified(f1.toFile()));