Fix detection logic for embedded databases

See gh-23693
pull/23728/head
Asha Somayajula 4 years ago committed by Stephane Nicoll
parent 23073d9e76
commit ab02084e7b

@ -322,13 +322,13 @@ public class DataSourceProperties implements BeanClassLoaderAware, InitializingB
* @since 1.4.0 * @since 1.4.0
*/ */
public String determineUsername() { public String determineUsername() {
if (StringUtils.hasText(this.username)) { if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName(), determineUrl())
return this.username; && !StringUtils.hasText(this.username)) {
}
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName())) {
return "sa"; return "sa";
} }
return null; else {
return this.username;
}
} }
/** /**
@ -350,13 +350,13 @@ public class DataSourceProperties implements BeanClassLoaderAware, InitializingB
* @since 1.4.0 * @since 1.4.0
*/ */
public String determinePassword() { public String determinePassword() {
if (StringUtils.hasText(this.password)) { if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName(), determineUrl())
return this.password; && !StringUtils.hasText(this.password)) {
}
if (EmbeddedDatabaseConnection.isEmbedded(determineDriverClassName())) {
return ""; return "";
} }
return null; else {
return this.password;
}
} }
public String getJndiName() { public String getJndiName() {

@ -127,7 +127,6 @@ class FlywayAutoConfigurationTests {
assertThat(context).hasSingleBean(Flyway.class); assertThat(context).hasSingleBean(Flyway.class);
DataSource dataSource = context.getBean(Flyway.class).getConfiguration().getDataSource(); DataSource dataSource = context.getBean(Flyway.class).getConfiguration().getDataSource();
assertThat(dataSource).isNotNull(); assertThat(dataSource).isNotNull();
assertThat(dataSource).hasFieldOrPropertyWithValue("user", "sa");
assertThat(dataSource).hasFieldOrPropertyWithValue("password", ""); assertThat(dataSource).hasFieldOrPropertyWithValue("password", "");
}); });
} }

@ -78,6 +78,32 @@ class DataSourcePropertiesTests {
assertThat(properties.determineUrl()).isEqualTo("jdbc:mysql://mydb"); 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 @Test
void determineUrlWithGenerateUniqueName() throws Exception { void determineUrlWithGenerateUniqueName() throws Exception {
DataSourceProperties properties = new DataSourceProperties(); DataSourceProperties properties = new DataSourceProperties();
@ -98,6 +124,24 @@ class DataSourcePropertiesTests {
assertThat(properties.determineUsername()).isEqualTo("sa"); 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 @Test
void determineUsernameWithExplicitConfig() throws Exception { void determineUsernameWithExplicitConfig() throws Exception {
DataSourceProperties properties = new DataSourceProperties(); DataSourceProperties properties = new DataSourceProperties();
@ -112,7 +156,6 @@ class DataSourcePropertiesTests {
DataSourceProperties properties = new DataSourceProperties(); DataSourceProperties properties = new DataSourceProperties();
properties.afterPropertiesSet(); properties.afterPropertiesSet();
assertThat(properties.getPassword()).isNull(); assertThat(properties.getPassword()).isNull();
assertThat(properties.determinePassword()).isEqualTo("");
} }
@Test @Test

@ -246,7 +246,6 @@ class LiquibaseAutoConfigurationTests {
.run(assertLiquibase((liquibase) -> { .run(assertLiquibase((liquibase) -> {
DataSource dataSource = liquibase.getDataSource(); DataSource dataSource = liquibase.getDataSource();
assertThat(((HikariDataSource) dataSource).isClosed()).isTrue(); assertThat(((HikariDataSource) dataSource).isClosed()).isTrue();
assertThat(((HikariDataSource) dataSource).getUsername()).isEqualTo("sa");
assertThat(((HikariDataSource) dataSource).getPassword()).isEqualTo(""); assertThat(((HikariDataSource) dataSource).getPassword()).isEqualTo("");
})); }));
} }

@ -101,7 +101,7 @@ public class TestDatabaseAutoConfiguration {
private BeanDefinition createEmbeddedBeanDefinition(boolean primary) { private BeanDefinition createEmbeddedBeanDefinition(boolean primary) {
BeanDefinition beanDefinition = new RootBeanDefinition(EmbeddedDataSourceFactoryBean.class); BeanDefinition beanDefinition = new RootBeanDefinition(EmbeddedDataSourceFactoryBean.class);
beanDefinition.setPrimary(primary); beanDefinition.setPrimary(true);
return beanDefinition; return beanDefinition;
} }

@ -122,11 +122,26 @@ public enum EmbeddedDatabaseConnection {
* @param driverClass the driver class * @param driverClass the driver class
* @return true if the driver class is one of the embedded types * @return true if the driver class is one of the embedded types
*/ */
@Deprecated
public static boolean isEmbedded(String driverClass) { public static boolean isEmbedded(String driverClass) {
return driverClass != null && (matches(HSQL, driverClass) || matches(H2, driverClass) return driverClass != null && (matches(HSQL, driverClass) || matches(H2, driverClass)
|| matches(DERBY, driverClass) || matches(HSQLDB, 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) { private static boolean matches(EmbeddedDatabaseConnection candidate, String driverClass) {
return driverClass.equals(candidate.driverClass) || driverClass.equals(candidate.alternativeDriverClass); return driverClass.equals(candidate.driverClass) || driverClass.equals(candidate.alternativeDriverClass);
} }

@ -78,4 +78,15 @@ class EmbeddedDatabaseConnectionTests {
.withMessageContaining("DatabaseName must not be empty"); .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();
}
} }

Loading…
Cancel
Save