Replaceable clock (#1428)

ENH: Use java.time.Clock for @WhenModified and @WhenCreated and allow it to be Replaceable for testing
This commit is contained in:
tobias-
2018-06-15 20:34:11 +12:00
committed by Rob Bygrave
parent 59537227b6
commit f86f1b2647
3 changed files with 74 additions and 1 deletions
@@ -33,6 +33,7 @@ import io.ebean.util.StringHelper;
import org.avaje.datasource.DataSourceConfig;
import javax.sql.DataSource;
import java.time.Clock;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -362,6 +363,11 @@ public class ServerConfig {
*/
private String uuidStateFile = "ebean-uuid.state";
/**
* The clock used for setting the timestamps (e.g. @UpdatedTimestamp) on objects.
*/
private Clock clock = Clock.systemUTC();
private List<IdGenerator> idGenerators = new ArrayList<>();
private List<BeanFindController> findControllers = new ArrayList<>();
private List<BeanPersistController> persistControllers = new ArrayList<>();
@@ -507,6 +513,20 @@ public class ServerConfig {
}
/**
* Get the clock used for setting the timestamps (e.g. @UpdatedTimestamp) on objects.
*/
public Clock getClock() {
return clock;
}
/**
* Set the clock used for setting the timestamps (e.g. @UpdatedTimestamp) on objects.
*/
public void setClock(final Clock clock) {
this.clock = clock;
}
/**
* Return the slow query time in millis.
*/
@@ -1275,7 +1275,7 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
*/
public long now() {
if (now == 0) {
now = System.currentTimeMillis();
now = ebeanServer.getServerConfig().getClock().millis();
}
return now;
}
@@ -1,15 +1,27 @@
package io.ebean;
import io.ebeaninternal.api.SpiEbeanServer;
import org.junit.After;
import org.junit.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
import java.time.Clock;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class ExtendedServerTest extends BaseTestCase {
@After
public void cleanup() {
((SpiEbeanServer) Ebean.getDefaultServer())
.getServerConfig()
.setClock(Clock.systemUTC());
}
@Test
public void findList() {
@@ -38,4 +50,45 @@ public class ExtendedServerTest extends BaseTestCase {
}
}
@Test
public void mockClock() {
SpiEbeanServer server = (SpiEbeanServer) Ebean.getDefaultServer();
final Instant snapshot = Instant.now();
Instant backedSnapshot = snapshot.minus(1, ChronoUnit.DAYS);
Clock snapshotClock = Clock.fixed(backedSnapshot, Clock.systemUTC().getZone());
server.getServerConfig().setClock(snapshotClock);
ResetBasicData.reset();
int count = server
.find(Customer.class)
.where()
.gt("cretime", snapshot)
.findCount();
assertThat(count).isEqualTo(0);
int count2 = server
.find(Customer.class)
.where()
.ge("cretime", backedSnapshot)
.findCount();
assertThat(count2).isGreaterThan(0);
int count3 = server
.find(Customer.class)
.where()
.gt("updtime", snapshot)
.findCount();
assertThat(count3).isEqualTo(0);
int count4 = server
.find(Customer.class)
.where()
.ge("updtime", backedSnapshot)
.findCount();
assertThat(count4).isGreaterThan(0);
}
}