Browse Source

Change RacyGitTests to create a racy git situation in a stable way

By using File#setLastModified, we can create a racy git situation
stably.

Tested with --runs_per_test=100

Bug: 526111
Change-Id: I60b3632d353e19f335668325aa603640be423f58
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
stable-5.1
Masaya Suzuki 6 years ago committed by Matthias Sohn
parent
commit
df637928d2
  1. 53
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RacyGitTests.java

53
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RacyGitTests.java

@ -46,7 +46,6 @@ import static java.lang.Long.valueOf;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -63,8 +62,8 @@ import org.junit.Test;
public class RacyGitTests extends RepositoryTestCase { public class RacyGitTests extends RepositoryTestCase {
@Test @Test
public void testIterator() throws IllegalStateException, IOException, public void testIterator()
InterruptedException { throws IllegalStateException, IOException, InterruptedException {
TreeSet<Long> modTimes = new TreeSet<>(); TreeSet<Long> modTimes = new TreeSet<>();
File lastFile = null; File lastFile = null;
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
@ -128,9 +127,6 @@ public class RacyGitTests extends RepositoryTestCase {
@Test @Test
public void testRacyGitDetection() throws Exception { public void testRacyGitDetection() throws Exception {
TreeSet<Long> modTimes = new TreeSet<>();
File lastFile;
// Reset to force creation of index file // Reset to force creation of index file
try (Git git = new Git(db)) { try (Git git = new Git(db)) {
git.reset().call(); git.reset().call();
@ -138,45 +134,44 @@ public class RacyGitTests extends RepositoryTestCase {
// wait to ensure that modtimes of the file doesn't match last index // wait to ensure that modtimes of the file doesn't match last index
// file modtime // file modtime
modTimes.add(valueOf(fsTick(db.getIndexFile()))); fsTick(db.getIndexFile());
// create two files // create two files
addToWorkDir("a", "a"); File a = addToWorkDir("a", "a");
lastFile = addToWorkDir("b", "b"); File b = addToWorkDir("b", "b");
assertTrue(a.setLastModified(b.lastModified()));
assertTrue(b.setLastModified(b.lastModified()));
// wait to ensure that file-modTimes and therefore index entry modTime // wait to ensure that file-modTimes and therefore index entry modTime
// doesn't match the modtime of index-file after next persistance // doesn't match the modtime of index-file after next persistance
modTimes.add(valueOf(fsTick(lastFile))); fsTick(b);
// now add both files to the index. No racy git expected // now add both files to the index. No racy git expected
resetIndex(new FileTreeIteratorWithTimeControl(db, modTimes)); resetIndex(new FileTreeIterator(db));
assertEquals( assertEquals(
"[a, mode:100644, time:t0, length:1, content:a]" + "[a, mode:100644, time:t0, length:1, content:a]"
"[b, mode:100644, time:t0, length:1, content:b]", + "[b, mode:100644, time:t0, length:1, content:b]",
indexState(SMUDGE | MOD_TIME | LENGTH | CONTENT)); indexState(SMUDGE | MOD_TIME | LENGTH | CONTENT));
// Remember the last modTime of index file. All modifications times of // wait to ensure the file 'a' is updated at t1.
// further modification are translated to this value so it looks that fsTick(db.getIndexFile());
// files have been modified in the same time slot as the index file
long indexMod = db.getIndexFile().lastModified();
modTimes.add(Long.valueOf(indexMod));
// modify one file // Create a racy git situation. This is a situation that the index is
long aMod = addToWorkDir("a", "a2").lastModified(); // updated and then a file is modified within a second. By changing the
assumeTrue(aMod == indexMod); // index file artificially, we create a fake racy situation.
File updatedA = addToWorkDir("a", "a2");
// now update the index the index. 'a' has to be racily clean -- because assertTrue(updatedA.setLastModified(updatedA.lastModified() + 100));
// it's modification time is exactly the same as the previous index file resetIndex(new FileTreeIterator(db));
// mod time. assertTrue(db.getIndexFile()
resetIndex(new FileTreeIteratorWithTimeControl(db, modTimes)); .setLastModified(updatedA.lastModified() + 90));
db.readDirCache(); db.readDirCache();
// although racily clean a should not be reported as being dirty // although racily clean a should not be reported as being dirty
assertEquals( assertEquals(
"[a, mode:100644, time:t1, smudged, length:0, content:a2]" + "[a, mode:100644, time:t1, smudged, length:0, content:a2]"
"[b, mode:100644, time:t0, length:1, content:b]", + "[b, mode:100644, time:t0, length:1, content:b]",
indexState(SMUDGE|MOD_TIME|LENGTH|CONTENT)); indexState(SMUDGE | MOD_TIME | LENGTH | CONTENT));
} }
private File addToWorkDir(String path, String content) throws IOException { private File addToWorkDir(String path, String content) throws IOException {

Loading…
Cancel
Save