Fix detection logic for embedded databases
See gh-23693
This commit is contained in:
committed by
Stephane Nicoll
parent
23073d9e76
commit
ab02084e7b
@@ -322,13 +322,13 @@ public class DataSourceProperties implements BeanClassLoaderAware, InitializingB
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public String determineUsername() {
|
||||
if (StringUtils.hasText(this.username)) {
|
||||
return this.username;
|
||||
}
|
||||
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName())) {
|
||||
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName(), determineUrl())
|
||||
&& !StringUtils.hasText(this.username)) {
|
||||
return "sa";
|
||||
}
|
||||
return null;
|
||||
else {
|
||||
return this.username;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -350,13 +350,13 @@ public class DataSourceProperties implements BeanClassLoaderAware, InitializingB
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public String determinePassword() {
|
||||
if (StringUtils.hasText(this.password)) {
|
||||
return this.password;
|
||||
}
|
||||
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName())) {
|
||||
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName(), determineUrl())
|
||||
&& !StringUtils.hasText(this.password)) {
|
||||
return "";
|
||||
}
|
||||
return null;
|
||||
else {
|
||||
return this.password;
|
||||
}
|
||||
}
|
||||
|
||||
public String getJndiName() {
|
||||
|
||||
@@ -127,7 +127,6 @@ class FlywayAutoConfigurationTests {
|
||||
assertThat(context).hasSingleBean(Flyway.class);
|
||||
DataSource dataSource = context.getBean(Flyway.class).getConfiguration().getDataSource();
|
||||
assertThat(dataSource).isNotNull();
|
||||
assertThat(dataSource).hasFieldOrPropertyWithValue("user", "sa");
|
||||
assertThat(dataSource).hasFieldOrPropertyWithValue("password", "");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -78,6 +78,32 @@ class DataSourcePropertiesTests {
|
||||
assertThat(properties.determineUrl()).isEqualTo("jdbc:mysql://mydb");
|
||||
}
|
||||
|
||||
@Test
|
||||
void determineIsEmbeddedWithExplicitConfigforH2() throws Exception {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
properties.setUrl("jdbc:h2:~/test");
|
||||
properties.setUsername("");
|
||||
properties.setPassword("");
|
||||
properties.afterPropertiesSet();
|
||||
assertThat(properties.getUrl()).isEqualTo("jdbc:h2:~/test");
|
||||
assertThat(properties.determineUrl()).isEqualTo("jdbc:h2:~/test");
|
||||
assertThat(properties.determineUsername()).isEqualTo("");
|
||||
assertThat(properties.determinePassword()).isEqualTo("");
|
||||
}
|
||||
|
||||
@Test
|
||||
void determineWithExplicitConfigforH2WithCustomJdbcUrl() throws Exception {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
properties.setUrl("jdbc:h2:~/test");
|
||||
properties.setUsername("as");
|
||||
properties.setPassword("as");
|
||||
properties.afterPropertiesSet();
|
||||
assertThat(properties.getUrl()).isEqualTo("jdbc:h2:~/test");
|
||||
assertThat(properties.determineUrl()).isEqualTo("jdbc:h2:~/test");
|
||||
assertThat(properties.determineUsername()).isEqualTo("as");
|
||||
assertThat(properties.determinePassword()).isEqualTo("as");
|
||||
}
|
||||
|
||||
@Test
|
||||
void determineUrlWithGenerateUniqueName() throws Exception {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
@@ -98,6 +124,24 @@ class DataSourcePropertiesTests {
|
||||
assertThat(properties.determineUsername()).isEqualTo("sa");
|
||||
}
|
||||
|
||||
@Test
|
||||
void determineUsernameWhenEmpty() throws Exception {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
properties.setUsername("");
|
||||
properties.afterPropertiesSet();
|
||||
assertThat(properties.getUsername());
|
||||
assertThat(properties.determineUsername()).isEqualTo("sa");
|
||||
}
|
||||
|
||||
@Test
|
||||
void determineUsernameWhenNull() throws Exception {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
properties.setUsername(null);
|
||||
properties.afterPropertiesSet();
|
||||
assertThat(properties.getUsername());
|
||||
assertThat(properties.determineUsername()).isEqualTo("sa");
|
||||
}
|
||||
|
||||
@Test
|
||||
void determineUsernameWithExplicitConfig() throws Exception {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
@@ -112,7 +156,6 @@ class DataSourcePropertiesTests {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
properties.afterPropertiesSet();
|
||||
assertThat(properties.getPassword()).isNull();
|
||||
assertThat(properties.determinePassword()).isEqualTo("");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -246,7 +246,6 @@ class LiquibaseAutoConfigurationTests {
|
||||
.run(assertLiquibase((liquibase) -> {
|
||||
DataSource dataSource = liquibase.getDataSource();
|
||||
assertThat(((HikariDataSource) dataSource).isClosed()).isTrue();
|
||||
assertThat(((HikariDataSource) dataSource).getUsername()).isEqualTo("sa");
|
||||
assertThat(((HikariDataSource) dataSource).getPassword()).isEqualTo("");
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@ public class TestDatabaseAutoConfiguration {
|
||||
|
||||
private BeanDefinition createEmbeddedBeanDefinition(boolean primary) {
|
||||
BeanDefinition beanDefinition = new RootBeanDefinition(EmbeddedDataSourceFactoryBean.class);
|
||||
beanDefinition.setPrimary(primary);
|
||||
beanDefinition.setPrimary(true);
|
||||
return beanDefinition;
|
||||
}
|
||||
|
||||
|
||||
@@ -122,11 +122,26 @@ public enum EmbeddedDatabaseConnection {
|
||||
* @param driverClass the driver class
|
||||
* @return true if the driver class is one of the embedded types
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean isEmbedded(String driverClass) {
|
||||
return driverClass != null && (matches(HSQL, driverClass) || matches(H2, driverClass)
|
||||
|| matches(DERBY, driverClass) || matches(HSQLDB, driverClass));
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method to determine if a given driver class name and url represents an
|
||||
* embedded database type.The exception is made for the H2 database for embedded
|
||||
* types.
|
||||
* @param driverClass the driver class
|
||||
* @param url the jdbc url
|
||||
* @return true if the driver class is one of the embedded types
|
||||
*/
|
||||
public static boolean isEmbedded(String driverClass, String url) {
|
||||
return (driverClass != null
|
||||
&& (matches(HSQL, driverClass) || (matches(H2, driverClass) && url.contains(":h2:mem"))
|
||||
|| matches(DERBY, driverClass) || matches(HSQLDB, driverClass)));
|
||||
}
|
||||
|
||||
private static boolean matches(EmbeddedDatabaseConnection candidate, String driverClass) {
|
||||
return driverClass.equals(candidate.driverClass) || driverClass.equals(candidate.alternativeDriverClass);
|
||||
}
|
||||
|
||||
@@ -78,4 +78,15 @@ class EmbeddedDatabaseConnectionTests {
|
||||
.withMessageContaining("DatabaseName must not be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isEmbeddedForh2CustomDatabaseName() {
|
||||
assertThat(EmbeddedDatabaseConnection.isEmbedded("org.h2.Driver", "jdbc:h2:~/test")).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isEmbeddedForh2EmbeddedDatabaseName() {
|
||||
assertThat(EmbeddedDatabaseConnection.isEmbedded("org.h2.Driver",
|
||||
"jdbc:h2:mem:b3c7d078-1362-4be7-a088-e25dcc3aee32;DB_CLOSE_DELAY=-1")).isTrue();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user