Merge "Push control of time into MockSystemReader"

This commit is contained in:
Jonathan Nieder 2015-10-20 19:07:18 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit ce525a0a62
6 changed files with 61 additions and 31 deletions

View File

@ -51,7 +51,6 @@
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEntry;
@ -92,11 +91,12 @@ public abstract class LocalDiskRepositoryTestCase {
/** A fake (but stable) identity for committer fields in the test. */
protected PersonIdent committer;
/** A {@link SystemReader} used to coordinate time, envars, etc. */
protected MockSystemReader mockSystemReader;
private final List<Repository> toClose = new ArrayList<Repository>();
private File tmp;
private MockSystemReader mockSystemReader;
@Before
public void setUp() throws Exception {
tmp = File.createTempFile("jgit_test_", "_tmp");
@ -171,9 +171,8 @@ public void tearDown() throws Exception {
/** Increment the {@link #author} and {@link #committer} times. */
protected void tick() {
final long delta = TimeUnit.MILLISECONDS.convert(5 * 60,
TimeUnit.SECONDS);
final long now = author.getWhen().getTime() + delta;
mockSystemReader.tick(5 * 60);
final long now = mockSystemReader.getCurrentTime();
final int tz = mockSystemReader.getTimezone(now);
author = new PersonIdent(author, now, tz);
@ -278,11 +277,10 @@ public static String indexState(Repository repo, int includedOptions)
throws IllegalStateException, IOException {
DirCache dc = repo.readDirCache();
StringBuilder sb = new StringBuilder();
TreeSet<Long> timeStamps = null;
TreeSet<Long> timeStamps = new TreeSet<Long>();
// iterate once over the dircache just to collect all time stamps
if (0 != (includedOptions & MOD_TIME)) {
timeStamps = new TreeSet<Long>();
for (int i=0; i<dc.getEntryCount(); ++i)
timeStamps.add(Long.valueOf(dc.getEntry(i).getLastModified()));
}

View File

@ -62,6 +62,9 @@
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.SystemReader;
/**
* Mock {@link SystemReader} for tests.
*/
public class MockSystemReader extends SystemReader {
private final class MockConfig extends FileBasedConfig {
private MockConfig(File cfgLocation, FS fs) {
@ -79,6 +82,8 @@ public boolean isOutdated() {
}
}
long now = 1250379778668L; // Sat Aug 15 20:12:58 GMT-03:30 2009
final Map<String, String> values = new HashMap<String, String>();
FileBasedConfig userGitConfig;
@ -138,7 +143,17 @@ public String getHostname() {
@Override
public long getCurrentTime() {
return 1250379778668L; // Sat Aug 15 20:12:58 GMT-03:30 2009
return now;
}
/**
* Adjusts the current time in seconds.
*
* @param secDelta
* number of seconds to add to the current time.
*/
public void tick(final int secDelta) {
now += secDelta * 1000L;
}
@Override

View File

@ -138,7 +138,7 @@ public class TestRepository<R extends Repository> {
private final ObjectInserter inserter;
private long now;
private final MockSystemReader mockSystemReader;
/**
* Wrap a repository with test building tools.
@ -148,7 +148,7 @@ public class TestRepository<R extends Repository> {
* @throws IOException
*/
public TestRepository(R db) throws IOException {
this(db, new RevWalk(db));
this(db, new RevWalk(db), new MockSystemReader());
}
/**
@ -161,11 +161,28 @@ public TestRepository(R db) throws IOException {
* @throws IOException
*/
public TestRepository(R db, RevWalk rw) throws IOException {
this(db, rw, new MockSystemReader());
}
/**
* Wrap a repository with test building tools.
*
* @param db
* the test repository to write into.
* @param rw
* the RevObject pool to use for object lookup.
* @param reader
* the MockSystemReader to use for clock and other system
* operations.
* @throws IOException
*/
public TestRepository(R db, RevWalk rw, MockSystemReader reader)
throws IOException {
this.db = db;
this.git = Git.wrap(db);
this.pool = rw;
this.inserter = db.newObjectInserter();
this.now = 1236977987000L;
this.mockSystemReader = reader;
}
/** @return the repository this helper class operates against. */
@ -186,14 +203,14 @@ public Git git() {
return git;
}
/** @return current time adjusted by {@link #tick(int)}. */
public Date getClock() {
return new Date(now);
/** @return current date. */
public Date getDate() {
return new Date(mockSystemReader.getCurrentTime());
}
/** @return timezone used for default identities. */
public TimeZone getTimeZone() {
return defaultCommitter.getTimeZone();
return mockSystemReader.getTimeZone();
}
/**
@ -203,18 +220,18 @@ public TimeZone getTimeZone() {
* number of seconds to add to the current time.
*/
public void tick(final int secDelta) {
now += secDelta * 1000L;
mockSystemReader.tick(secDelta);
}
/**
* Set the author and committer using {@link #getClock()}.
* Set the author and committer using {@link #getDate()}.
*
* @param c
* the commit builder to store.
*/
public void setAuthorAndCommitter(org.eclipse.jgit.lib.CommitBuilder c) {
c.setAuthor(new PersonIdent(defaultAuthor, new Date(now)));
c.setCommitter(new PersonIdent(defaultCommitter, new Date(now)));
c.setAuthor(new PersonIdent(defaultAuthor, getDate()));
c.setCommitter(new PersonIdent(defaultCommitter, getDate()));
}
/**
@ -392,8 +409,8 @@ public RevCommit commit(final int secDelta, final RevTree tree,
c = new org.eclipse.jgit.lib.CommitBuilder();
c.setTreeId(tree);
c.setParentIds(parents);
c.setAuthor(new PersonIdent(defaultAuthor, new Date(now)));
c.setCommitter(new PersonIdent(defaultCommitter, new Date(now)));
c.setAuthor(new PersonIdent(defaultAuthor, getDate()));
c.setCommitter(new PersonIdent(defaultCommitter, getDate()));
c.setMessage("");
ObjectId id;
try (ObjectInserter ins = inserter) {
@ -428,7 +445,7 @@ public RevTag tag(final String name, final RevObject dst) throws Exception {
final TagBuilder t = new TagBuilder();
t.setObjectId(dst);
t.setTag(name);
t.setTagger(new PersonIdent(defaultCommitter, new Date(now)));
t.setTagger(new PersonIdent(defaultCommitter, getDate()));
t.setMessage("");
ObjectId id;
try (ObjectInserter ins = inserter) {
@ -663,7 +680,7 @@ public RevCommit cherryPick(AnyObjectId id) throws Exception {
b.setParentId(head);
b.setTreeId(merger.getResultTreeId());
b.setAuthor(commit.getAuthorIdent());
b.setCommitter(new PersonIdent(defaultCommitter, new Date(now)));
b.setCommitter(new PersonIdent(defaultCommitter, getDate()));
b.setMessage(commit.getFullMessage());
ObjectId result;
try (ObjectInserter ins = inserter) {
@ -1100,7 +1117,7 @@ public RevCommit create() throws Exception {
c.setAuthor(author);
if (committer != null) {
if (updateCommitterTime)
committer = new PersonIdent(committer, new Date(now));
committer = new PersonIdent(committer, getDate());
c.setCommitter(committer);
}

View File

@ -307,9 +307,9 @@ public void cherryPick() throws Exception {
RevCommit toPick = tr.commit()
.parent(tr.commit().create()) // Can't cherry-pick root.
.author(new PersonIdent("Cherrypick Author", "cpa@example.com",
tr.getClock(), tr.getTimeZone()))
tr.getDate(), tr.getTimeZone()))
.author(new PersonIdent("Cherrypick Committer", "cpc@example.com",
tr.getClock(), tr.getTimeZone()))
tr.getDate(), tr.getTimeZone()))
.message("message to cherry-pick")
.add("bar", "bar contents\n")
.create();

View File

@ -250,14 +250,14 @@ public void testCommitTimeRevFilter() throws Exception {
final RevCommit b = commit(a);
tick(100);
Date since = getClock();
Date since = getDate();
final RevCommit c1 = commit(b);
tick(100);
final RevCommit c2 = commit(b);
tick(100);
Date until = getClock();
Date until = getDate();
final RevCommit d = commit(c1, c2);
tick(100);

View File

@ -70,8 +70,8 @@ protected RevWalk createRevWalk() {
return new RevWalk(db);
}
protected Date getClock() {
return util.getClock();
protected Date getDate() {
return util.getDate();
}
protected void tick(final int secDelta) {