Merge branch 'master' into wip/EntityBeanIntercept-interface

This commit is contained in:
Rob Bygrave
2022-04-12 21:09:58 +12:00
committed by GitHub
140 changed files with 1072 additions and 1581 deletions
@@ -68,6 +68,8 @@ public abstract class BaseTestCase {
DB_CLOCK_DELTA = 100;
}
try {
String propsFile = System.getProperty("props.file");
System.out.println("BaseTestCase: -Dprops.file=" + propsFile); // help debug CI
// First try, if we get the default server. If this fails, all tests will fail.
DB.getDefault();
} catch (Throwable e) {
@@ -1,202 +0,0 @@
package io.ebean.xtest.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.ebean.annotation.MutationDetection;
import io.ebean.annotation.PersistBatch;
import io.ebean.config.DatabaseConfig;
import io.ebean.config.JsonConfig;
import io.ebean.config.MatchingNamingConvention;
import io.ebean.config.PlatformConfig;
import io.ebean.config.dbplatform.IdType;
import io.ebean.datasource.DataSourceConfig;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
public class DatabaseConfigTest {
@Test
public void testLoadFromEbeanProperties() {
DatabaseConfig config = new DatabaseConfig();
config.loadFromProperties();
assertEquals(PersistBatch.NONE, config.getPersistBatch());
assertNotNull(config.getProperties());
}
@Test
public void evalPropertiesInput() {
String home = System.getProperty("user.home");
String fileSeparator = System.getProperty("file.separator");
Properties props = new Properties();
props.setProperty("ddl.initSql", "${user.home}" + fileSeparator + "initSql");
DatabaseConfig config = new DatabaseConfig();
config.loadFromProperties(props);
String ddlInitSql = config.getDdlInitSql();
assertThat(ddlInitSql).isEqualTo(home + fileSeparator + "initSql");
}
@Test
public void testLoadWithProperties() {
DatabaseConfig config = new DatabaseConfig();
config.setPersistBatch(PersistBatch.NONE);
config.setPersistBatchOnCascade(PersistBatch.NONE);
config.setAutoReadOnlyDataSource(false);
config.setReadOnlyDataSource(null);
config.setReadOnlyDataSourceConfig(new DataSourceConfig());
Properties props = new Properties();
props.setProperty("persistBatch", "ALL");
props.setProperty("persistBatchOnCascade", "ALL");
props.setProperty("dbuuid", "binary");
props.setProperty("jdbcFetchSizeFindEach", "42");
props.setProperty("jdbcFetchSizeFindList", "43");
props.setProperty("backgroundExecutorShutdownSecs", "98");
props.setProperty("backgroundExecutorSchedulePoolSize", "4");
props.setProperty("dbOffline", "true");
props.setProperty("jsonDateTime", "MILLIS");
props.setProperty("jsonDate", "MILLIS");
props.setProperty("jsonMutationDetection", "NONE");
props.setProperty("autoReadOnlyDataSource", "true");
props.setProperty("disableL2Cache", "true");
props.setProperty("notifyL2CacheInForeground", "true");
props.setProperty("idType", "SEQUENCE");
props.setProperty("mappingLocations", "classpath:/foo;bar");
props.setProperty("namingConvention", "io.ebean.config.MatchingNamingConvention");
props.setProperty("idGeneratorAutomatic", "true");
props.setProperty("enabledL2Regions", "r0,users,orgs");
props.setProperty("caseSensitiveCollation", "false");
props.setProperty("loadModuleInfo", "true");
props.setProperty("forUpdateNoKey", "true");
props.setProperty("defaultServer", "false");
props.setProperty("skipDataSourceCheck", "true");
props.setProperty("queryPlan.enable", "true");
props.setProperty("queryPlan.thresholdMicros", "10000");
props.setProperty("queryPlan.capture", "true");
props.setProperty("queryPlan.capturePeriodSecs", "42");
props.setProperty("queryPlan.captureMaxTimeMillis", "560");
props.setProperty("queryPlan.captureMaxCount", "7");
config.loadFromProperties(props);
assertFalse(config.isDefaultServer());
assertTrue(config.isDisableL2Cache());
assertTrue(config.isNotifyL2CacheInForeground());
assertTrue(config.isDbOffline());
assertTrue(config.isAutoReadOnlyDataSource());
assertTrue(config.isAutoLoadModuleInfo());
assertTrue(config.skipDataSourceCheck());
assertTrue(config.isIdGeneratorAutomatic());
assertFalse(config.getPlatformConfig().isCaseSensitiveCollation());
assertTrue(config.getPlatformConfig().isForUpdateNoKey());
assertThat(config.getNamingConvention()).isInstanceOf(MatchingNamingConvention.class);
assertEquals(MutationDetection.NONE, config.getJsonMutationDetection());
config.setJsonMutationDetection(MutationDetection.SOURCE);
assertEquals(MutationDetection.SOURCE, config.getJsonMutationDetection());
assertEquals(IdType.SEQUENCE, config.getIdType());
assertEquals(PersistBatch.ALL, config.getPersistBatch());
assertEquals(PersistBatch.ALL, config.getPersistBatchOnCascade());
Assertions.assertEquals(PlatformConfig.DbUuid.BINARY, config.getPlatformConfig().getDbUuid());
Assertions.assertEquals(JsonConfig.DateTime.MILLIS, config.getJsonDateTime());
assertEquals(JsonConfig.Date.MILLIS, config.getJsonDate());
assertEquals("r0,users,orgs", config.getEnabledL2Regions());
assertEquals(42, config.getJdbcFetchSizeFindEach());
assertEquals(43, config.getJdbcFetchSizeFindList());
assertEquals(4, config.getBackgroundExecutorSchedulePoolSize());
assertEquals(98, config.getBackgroundExecutorShutdownSecs());
assertTrue(config.isQueryPlanEnable());
assertEquals(10000, config.getQueryPlanThresholdMicros());
assertTrue(config.isQueryPlanCapture());
assertEquals(42, config.getQueryPlanCapturePeriodSecs());
assertEquals(560, config.getQueryPlanCaptureMaxTimeMillis());
assertEquals(7, config.getQueryPlanCaptureMaxCount());
assertThat(config.getMappingLocations()).containsExactly("classpath:/foo","bar");
config.setPersistBatch(PersistBatch.NONE);
config.setPersistBatchOnCascade(PersistBatch.NONE);
Properties props1 = new Properties();
props1.setProperty("ebean.persistBatch", "ALL");
props1.setProperty("ebean.persistBatchOnCascade", "ALL");
config.setNotifyL2CacheInForeground(true);
config.setDisableL2Cache(true);
props1.setProperty("ebean.disableL2Cache", "false");
props1.setProperty("ebean.notifyL2CacheInForeground", "false");
config.loadFromProperties(props1);
assertFalse(config.isDisableL2Cache());
assertFalse(config.isNotifyL2CacheInForeground());
assertEquals(PersistBatch.ALL, config.getPersistBatch());
assertEquals(PersistBatch.ALL, config.getPersistBatchOnCascade());
config.setEnabledL2Regions("r0,orgs");
assertEquals("r0,orgs", config.getEnabledL2Regions());
}
@Test
public void test_defaults() {
DatabaseConfig config = new DatabaseConfig();
assertTrue(config.isIdGeneratorAutomatic());
assertTrue(config.isDefaultServer());
assertFalse(config.isAutoPersistUpdates());
assertFalse(config.skipDataSourceCheck());
config.setIdGeneratorAutomatic(false);
assertFalse(config.isIdGeneratorAutomatic());
assertEquals(JsonConfig.DateTime.ISO8601, config.getJsonDateTime());
assertEquals(JsonConfig.Date.ISO8601, config.getJsonDate());
assertEquals(MutationDetection.HASH, config.getJsonMutationDetection());
assertTrue(config.getPlatformConfig().isCaseSensitiveCollation());
assertTrue(config.isAutoLoadModuleInfo());
assertFalse(config.isQueryPlanEnable());
assertEquals(Long.MAX_VALUE, config.getQueryPlanThresholdMicros());
assertFalse(config.isQueryPlanCapture());
assertEquals(600, config.getQueryPlanCapturePeriodSecs());
assertEquals(10000L, config.getQueryPlanCaptureMaxTimeMillis());
assertEquals(10, config.getQueryPlanCaptureMaxCount());
config.setLoadModuleInfo(false);
assertFalse(config.isAutoLoadModuleInfo());
config.setAutoPersistUpdates(true);
assertTrue(config.isAutoPersistUpdates());
config.setSkipDataSourceCheck(true);
assertTrue(config.skipDataSourceCheck());
}
@Test
public void test_putServiceObject() {
ObjectMapper objectMapper = new ObjectMapper();
DatabaseConfig config = new DatabaseConfig();
config.putServiceObject(objectMapper);
ObjectMapper mapper0 = config.getServiceObject(ObjectMapper.class);
ObjectMapper mapper1 = (ObjectMapper)config.getServiceObject("objectMapper");
assertThat(objectMapper).isSameAs(mapper0);
assertThat(objectMapper).isSameAs(mapper1);
}
}
@@ -495,21 +495,11 @@ public class TDSpiEbeanServer extends TDSpiServer implements SpiEbeanServer {
return null;
}
@Override
public SqlQuery createSqlQuery(String sql) {
return sqlQuery(sql);
}
@Override
public SqlUpdate sqlUpdate(String sql) {
return null;
}
@Override
public SqlUpdate createSqlUpdate(String sql) {
return sqlUpdate(sql);
}
@Override
public CallableSql createCallableSql(String callableSql) {
return null;
@@ -653,11 +643,6 @@ public class TDSpiEbeanServer extends TDSpiServer implements SpiEbeanServer {
return null;
}
@Override
public <T> Stream<T> findLargeStream(Query<T> query, Transaction transaction) {
return null;
}
@Override
public <T> void findEach(Query<T> query, Consumer<T> consumer, Transaction transaction) {
}
@@ -177,21 +177,11 @@ public class TDSpiServer implements SpiServer {
return null;
}
@Override
public SqlQuery createSqlQuery(String sql) {
return null;
}
@Override
public SqlUpdate sqlUpdate(String sql) {
return null;
}
@Override
public SqlUpdate createSqlUpdate(String sql) {
return null;
}
@Override
public CallableSql createCallableSql(String callableSql) {
return null;
@@ -1,7 +1,5 @@
package org.tests.model;
import io.ebean.annotation.CreatedTimestamp;
import io.ebean.annotation.UpdatedTimestamp;
import io.ebean.annotation.WhenCreated;
import io.ebean.annotation.WhenModified;
@@ -31,40 +29,40 @@ public class EGenProps {
@WhenModified
Timestamp whenModified;
@CreatedTimestamp
@WhenCreated
Timestamp tsCreated;
@UpdatedTimestamp
@WhenModified
Timestamp tsUpdated;
@CreatedTimestamp
@WhenCreated
LocalDateTime ldtCreated;
@UpdatedTimestamp
@WhenModified
LocalDateTime ldtUpdated;
@CreatedTimestamp
@WhenCreated
OffsetDateTime odtCreated;
@UpdatedTimestamp
@WhenModified
OffsetDateTime odtUpdated;
@CreatedTimestamp
@WhenCreated
ZonedDateTime zdtCreated;
@UpdatedTimestamp
@WhenModified
ZonedDateTime zdtUpdated;
@CreatedTimestamp
@WhenCreated
Instant instantCreated;
@UpdatedTimestamp
@WhenModified
Instant instantUpdated;
@CreatedTimestamp
@WhenCreated
long longCreated;
@UpdatedTimestamp
@WhenModified
long longUpdated;
public Long getId() {
@@ -40,7 +40,7 @@ public class Contact {
@OneToMany(cascade = CascadeType.ALL)
List<ContactNote> notes;
@CreatedTimestamp
@WhenCreated
Timestamp cretime;
@Version
@@ -33,7 +33,7 @@ public class Product implements Serializable {
String name;
@CreatedTimestamp
@WhenCreated
Timestamp cretime;
@Version
@@ -117,9 +117,9 @@ public class TestNatKeyCacheWithForeignKey extends BaseTestCase {
@Test
public void findSimple() {
setupData();
clearAllL2Cache();
appStats();
OCachedApp app0 = findAppByName("app0");
assertThat(app0).isNotNull();
@@ -192,6 +192,6 @@ public class TestElementCollectionBasicMap extends BaseTestCase {
final EcmPerson fromJson = DB.json().toBean(EcmPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanMap size[2] map{home=021 1234, work=021 4321}");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("{home=021 1234, work=021 4321}");
}
}
@@ -183,6 +183,6 @@ class TestElementCollectionBasicSet extends BaseTestCase {
final EcsPerson fromJson = DB.json().toBean(EcsPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanSet size[2] set[021 1234, 021 4321]");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("[021 1234, 021 4321]");
}
}
@@ -190,6 +190,6 @@ public class TestElementCollectionEmbeddedList extends BaseTestCase {
final EcblPerson fromJson = DB.json().toBean(EcblPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona64021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanList size[2] list[64-021-1234, 64-021-4321]");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("[64-021-1234, 64-021-4321]");
}
}
@@ -181,6 +181,6 @@ public class TestElementCollectionEmbeddedMap extends BaseTestCase {
final EcbmPerson fromJson = DB.json().toBean(EcbmPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona64021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanMap size[2] map{home=64-021-1234, work=64-021-4321}");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("{home=64-021-1234, work=64-021-4321}");
}
}
@@ -45,6 +45,6 @@ public class TestElementCollectionEnumSet extends BaseTestCase {
final EcEnumPerson fromJson = DB.json().toBean(EcEnumPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Enum Person");
assertThat(fromJson.getTags()).hasSize(2);
assertThat(fromJson.getTags().toString()).isEqualTo("BeanSet size[2] set[BLUE, RED]");
assertThat(fromJson.getTags().toString()).isEqualTo("[BLUE, RED]");
}
}
@@ -37,27 +37,6 @@ public class TestQueryFindStream extends BaseTestCase {
}
}
@Test
public void findLargeStream_basic() {
ResetBasicData.reset();
try (Stream<Customer> stream = DB.find(Customer.class)
.findLargeStream()) {
// bad example, don't use a stream like this when we can
// use findSingleAttributeList() instead
final List<String> namesStream = stream
.map(Customer::getName)
.collect(toList());
final List<String> namesQuery = DB.find(Customer.class)
.select("name")
.findSingleAttributeList();
assertThat(namesStream).hasSize(namesQuery.size());
assertThat(namesStream).containsAll(namesQuery);
}
}
@Test
public void manualTest_findSteam_when_closeWithResources() {
// confirm manually the stream is closed via try with resources block