Browse Source

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>
stable-5.1
Matthias Sohn 5 years ago
parent
commit
9eff45e4f2
  1. 16
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileSnapshotTest.java

16
org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileSnapshotTest.java

@ -52,7 +52,9 @@ import java.nio.file.Path;
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 class FileSnapshotTest {
*/ */
@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 class FileSnapshotTest {
*/ */
@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()));

Loading…
Cancel
Save