Wrap java.util.Timer in an interface so it can be mocked.

This commit is contained in:
akwizgran
2012-10-31 14:26:59 +00:00
parent 8ed68f36e4
commit 38ed9d69bf
6 changed files with 76 additions and 8 deletions

View File

@@ -0,0 +1,29 @@
package net.sf.briar.api.clock;
import java.util.TimerTask;
/** Default timer implementation. */
public class SystemTimer implements Timer {
private final java.util.Timer timer = new java.util.Timer();
public void cancel() {
timer.cancel();
}
public int purge() {
return timer.purge();
}
public void schedule(TimerTask task, long delay) {
timer.schedule(task, delay);
}
public void schedule(TimerTask task, long delay, long period) {
timer.schedule(task, delay, period);
}
public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
timer.scheduleAtFixedRate(task, delay, period);
}
}

View File

@@ -0,0 +1,27 @@
package net.sf.briar.api.clock;
import java.util.TimerTask;
/**
* A wrapper around a {@link java.util.Timer} that allows it to be replaced for
* testing.
*/
public interface Timer {
/** @see {@link java.util.Timer#cancel()} */
void cancel();
/** @see {@link java.util.Timer#purge()} */
int purge();
/** @see {@link java.util.Timer#schedule(TimerTask, long)} */
void schedule(TimerTask task, long delay);
/** @see {@link java.util.Timer#schedule(TimerTask, long, long)} */
void schedule(TimerTask task, long delay, long period);
/**
* @see {@link java.util.Timer#scheduleAtFixedRate(TimerTask, long, long)}
*/
void scheduleAtFixedRate(TimerTask task, long delay, long period);
}

View File

@@ -1,6 +1,9 @@
package net.sf.briar.api.crypto; package net.sf.briar.api.crypto;
/** An interface that allows a java.security.MessageDigest to be wrapped. */ /**
* A wrapper around a {@link java.security.MessageDigest} that allows it to be
* replaced for testing.
*/
public interface MessageDigest { public interface MessageDigest {
/** @see {@link java.security.MessageDigest#digest()} */ /** @see {@link java.security.MessageDigest#digest()} */

View File

@@ -2,6 +2,8 @@ package net.sf.briar.clock;
import net.sf.briar.api.clock.Clock; import net.sf.briar.api.clock.Clock;
import net.sf.briar.api.clock.SystemClock; import net.sf.briar.api.clock.SystemClock;
import net.sf.briar.api.clock.SystemTimer;
import net.sf.briar.api.clock.Timer;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
@@ -10,5 +12,6 @@ public class ClockModule extends AbstractModule {
@Override @Override
protected void configure() { protected void configure() {
bind(Clock.class).to(SystemClock.class); bind(Clock.class).to(SystemClock.class);
bind(Timer.class).to(SystemTimer.class);
} }
} }

View File

@@ -3,29 +3,35 @@ package net.sf.briar.db;
import static java.util.logging.Level.INFO; import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.api.clock.Timer;
import net.sf.briar.api.db.DbClosedException; import net.sf.briar.api.db.DbClosedException;
import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.DbException;
import com.google.inject.Inject;
class DatabaseCleanerImpl extends TimerTask implements DatabaseCleaner { class DatabaseCleanerImpl extends TimerTask implements DatabaseCleaner {
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(DatabaseCleanerImpl.class.getName()); Logger.getLogger(DatabaseCleanerImpl.class.getName());
private final Timer timer;
private volatile Callback callback = null; private volatile Callback callback = null;
private volatile Timer timer = null;
@Inject
DatabaseCleanerImpl(Timer timer) {
this.timer = timer;
}
public void startCleaning(Callback callback, long msBetweenSweeps) { public void startCleaning(Callback callback, long msBetweenSweeps) {
this.callback = callback; this.callback = callback;
timer = new Timer();
timer.scheduleAtFixedRate(this, 0L, msBetweenSweeps); timer.scheduleAtFixedRate(this, 0L, msBetweenSweeps);
} }
public void stopCleaning() { public void stopCleaning() {
if(timer == null) throw new IllegalStateException();
timer.cancel(); timer.cancel();
} }

View File

@@ -8,11 +8,11 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.sf.briar.api.ContactId; import net.sf.briar.api.ContactId;
import net.sf.briar.api.clock.Timer;
import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.crypto.CryptoComponent;
import net.sf.briar.api.crypto.KeyManager; import net.sf.briar.api.crypto.KeyManager;
import net.sf.briar.api.db.DatabaseComponent; import net.sf.briar.api.db.DatabaseComponent;
@@ -49,11 +49,11 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
@Inject @Inject
public KeyManagerImpl(CryptoComponent crypto, DatabaseComponent db, public KeyManagerImpl(CryptoComponent crypto, DatabaseComponent db,
ConnectionRecogniser recogniser) { ConnectionRecogniser recogniser, Timer timer) {
this.crypto = crypto; this.crypto = crypto;
this.db = db; this.db = db;
this.recogniser = recogniser; this.recogniser = recogniser;
timer = new Timer(); this.timer = timer;
outgoing = new HashMap<ContactTransportKey, TemporarySecret>(); outgoing = new HashMap<ContactTransportKey, TemporarySecret>();
incomingOld = new HashMap<ContactTransportKey, TemporarySecret>(); incomingOld = new HashMap<ContactTransportKey, TemporarySecret>();
incomingNew = new HashMap<ContactTransportKey, TemporarySecret>(); incomingNew = new HashMap<ContactTransportKey, TemporarySecret>();