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>
This commit is contained in:
parent
f18b5010fc
commit
df637928d2
|
@ -46,7 +46,6 @@
|
||||||
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 @@
|
||||||
|
|
||||||
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 void testIterator() throws IllegalStateException, IOException,
|
||||||
|
|
||||||
@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 void testRacyGitDetection() throws Exception {
|
||||||
|
|
||||||
// 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…
Reference in New Issue