Use a mock timer to test the database cleaner.

This commit is contained in:
akwizgran
2014-01-16 20:17:26 +00:00
parent 44bb9134d4
commit 468db2a97b

View File

@@ -1,67 +1,49 @@
package org.briarproject.db; package org.briarproject.db;
import static java.util.concurrent.TimeUnit.SECONDS; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.CountDownLatch;
import org.briarproject.BriarTestCase; import org.briarproject.BriarTestCase;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.system.Timer; import org.briarproject.api.system.Timer;
import org.briarproject.db.DatabaseCleaner.Callback; import org.briarproject.db.DatabaseCleaner.Callback;
import org.briarproject.system.SystemTimer; import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Test; import org.junit.Test;
// FIXME: Use a mock timer
public class DatabaseCleanerImplTest extends BriarTestCase { public class DatabaseCleanerImplTest extends BriarTestCase {
@Test @Test
public void testCleanerRunsPeriodically() throws Exception { public void testCleanerRunsPeriodically() throws Exception {
final CountDownLatch latch = new CountDownLatch(5); final AtomicInteger cleans = new AtomicInteger(0);
Callback callback = new Callback() { Callback callback = new Callback() {
boolean check = true;
public void checkFreeSpaceAndClean() throws DbException { public void checkFreeSpaceAndClean() throws DbException {
latch.countDown(); cleans.incrementAndGet();
} }
public boolean shouldCheckFreeSpace() { public boolean shouldCheckFreeSpace() {
return true; // Alternate between true and false
check = !check;
return !check;
} }
}; };
Timer timer = new SystemTimer(); Mockery context = new Mockery();
DatabaseCleanerImpl cleaner = new DatabaseCleanerImpl(timer); final Timer timer = context.mock(Timer.class);
// Start the cleaner final DatabaseCleanerImpl cleaner = new DatabaseCleanerImpl(timer);
context.checking(new Expectations() {{
oneOf(timer).scheduleAtFixedRate(cleaner, 0, 10);
oneOf(timer).cancel();
}});
// Start the cleaner - it should schedule itself with the timer
cleaner.startCleaning(callback, 10); cleaner.startCleaning(callback, 10);
// The database should be cleaned five times (allow 5s for system load) // Call the cleaner's run method six times
assertTrue(latch.await(5, SECONDS)); for(int i = 0; i < 6; i++) cleaner.run();
// Stop the cleaner // Stop the cleaner - it should cancel the timer
cleaner.stopCleaning(); cleaner.stopCleaning();
} // The database should have been cleaned three times
assertEquals(3, cleans.get());
@Test context.assertIsSatisfied();
public void testStoppingCleanerWakesItUp() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
Callback callback = new Callback() {
public void checkFreeSpaceAndClean() throws DbException {
latch.countDown();
}
public boolean shouldCheckFreeSpace() {
return true;
}
};
Timer timer = new SystemTimer();
DatabaseCleanerImpl cleaner = new DatabaseCleanerImpl(timer);
long start = System.currentTimeMillis();
// Start the cleaner
cleaner.startCleaning(callback, 10 * 1000);
// The database should be cleaned once at startup
assertTrue(latch.await(5, SECONDS));
// Stop the cleaner (it should be waiting between sweeps)
cleaner.stopCleaning();
long end = System.currentTimeMillis();
// Check that much less than 10 seconds expired
assertTrue(end - start < 10 * 1000);
} }
} }