Commit 03961e66 authored by Stephane Nicoll's avatar Stephane Nicoll

Polish contribution

Closes gh-7004
parent 7fcb1970
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.jdbc; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.jdbc;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import javax.sql.DataSource; import javax.sql.DataSource;
...@@ -58,9 +59,9 @@ public class DataSourceProperties ...@@ -58,9 +59,9 @@ public class DataSourceProperties
private String name = "testdb"; private String name = "testdb";
/** /**
* If <code>true</code> the database name is randomly generated. * Generate a random datasource name.
*/ */
private boolean generateName = false; private boolean generateUniqueName;
/** /**
* Fully qualified name of the connection pool implementation to use. By default, it * Fully qualified name of the connection pool implementation to use. By default, it
...@@ -153,6 +154,8 @@ public class DataSourceProperties ...@@ -153,6 +154,8 @@ public class DataSourceProperties
private Xa xa = new Xa(); private Xa xa = new Xa();
private String uniqueName;
@Override @Override
public void setBeanClassLoader(ClassLoader classLoader) { public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader; this.classLoader = classLoader;
...@@ -188,12 +191,12 @@ public class DataSourceProperties ...@@ -188,12 +191,12 @@ public class DataSourceProperties
this.name = name; this.name = name;
} }
public boolean isGenerateName() { public boolean isGenerateUniqueName() {
return this.generateName; return this.generateUniqueName;
} }
public void setGenerateName(boolean generateName) { public void setGenerateUniqueName(boolean generateUniqueName) {
this.generateName = generateName; this.generateUniqueName = generateUniqueName;
} }
public Class<? extends DataSource> getType() { public Class<? extends DataSource> getType() {
...@@ -281,7 +284,7 @@ public class DataSourceProperties ...@@ -281,7 +284,7 @@ public class DataSourceProperties
if (StringUtils.hasText(this.url)) { if (StringUtils.hasText(this.url)) {
return this.url; return this.url;
} }
String url = this.embeddedDatabaseConnection.getUrl(this.name); String url = this.embeddedDatabaseConnection.getUrl(determineDatabaseName());
if (!StringUtils.hasText(url)) { if (!StringUtils.hasText(url)) {
throw new DataSourceBeanCreationException(this.embeddedDatabaseConnection, throw new DataSourceBeanCreationException(this.embeddedDatabaseConnection,
this.environment, "url"); this.environment, "url");
...@@ -289,6 +292,16 @@ public class DataSourceProperties ...@@ -289,6 +292,16 @@ public class DataSourceProperties
return url; return url;
} }
private String determineDatabaseName() {
if (this.generateUniqueName) {
if (this.uniqueName == null) {
this.uniqueName = UUID.randomUUID().toString();
}
return this.uniqueName;
}
return this.name;
}
/** /**
* Return the configured username or {@code null} if none was configured. * Return the configured username or {@code null} if none was configured.
* @return the configured username * @return the configured username
......
...@@ -55,13 +55,8 @@ public class EmbeddedDataSourceConfiguration implements BeanClassLoaderAware { ...@@ -55,13 +55,8 @@ public class EmbeddedDataSourceConfiguration implements BeanClassLoaderAware {
public EmbeddedDatabase dataSource() { public EmbeddedDatabase dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder() EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseConnection.get(this.classLoader).getType()); .setType(EmbeddedDatabaseConnection.get(this.classLoader).getType());
if (this.properties.isGenerateName()) { this.database = builder.setName(this.properties.getName())
builder.generateUniqueName(true); .generateUniqueName(this.properties.isGenerateUniqueName()).build();
}
else {
builder.setName(this.properties.getName());
}
this.database = builder.build();
return this.database; return this.database;
} }
......
...@@ -66,6 +66,19 @@ public class DataSourcePropertiesTests { ...@@ -66,6 +66,19 @@ public class DataSourcePropertiesTests {
assertThat(properties.determineUrl()).isEqualTo("jdbc:mysql://mydb"); assertThat(properties.determineUrl()).isEqualTo("jdbc:mysql://mydb");
} }
@Test
public void determineUrlWithGenerateUniqueName() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.setGenerateUniqueName(true);
properties.afterPropertiesSet();
assertThat(properties.determineUrl()).isEqualTo(properties.determineUrl());
DataSourceProperties properties2 = new DataSourceProperties();
properties2.setGenerateUniqueName(true);
properties2.afterPropertiesSet();
assertThat(properties.determineUrl()).isNotEqualTo(properties2.determineUrl());
}
@Test @Test
public void determineUsername() throws Exception { public void determineUsername() throws Exception {
DataSourceProperties properties = new DataSourceProperties(); DataSourceProperties properties = new DataSourceProperties();
......
...@@ -19,14 +19,14 @@ package org.springframework.boot.autoconfigure.jdbc; ...@@ -19,14 +19,14 @@ package org.springframework.boot.autoconfigure.jdbc;
import java.sql.Connection; import java.sql.Connection;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.PropertiesPropertySource;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
...@@ -34,32 +34,40 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -34,32 +34,40 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link EmbeddedDataSourceConfiguration}. * Tests for {@link EmbeddedDataSourceConfiguration}.
* *
* @author Dave Syer * @author Dave Syer
* @author Stephane Nicoll
*/ */
public class EmbeddedDataSourceConfigurationTests { public class EmbeddedDataSourceConfigurationTests {
private AnnotationConfigApplicationContext context; private AnnotationConfigApplicationContext context;
@Test @After
public void testDefaultEmbeddedDatabase() throws Exception { public void closeContext() {
this.context = new AnnotationConfigApplicationContext(); if (this.context != null) {
this.context.register(EmbeddedDataSourceConfiguration.class);
this.context.refresh();
assertThat(this.context.getBean(DataSource.class)).isNotNull();
this.context.close(); this.context.close();
} }
}
@Test @Test
public void generatesUniqueDatabaseName() throws Exception { public void defaultEmbeddedDatabase() {
Properties myProps = new Properties(); this.context = load();
myProps.setProperty("spring.datasource.generate-name", "true"); assertThat(this.context.getBean(DataSource.class)).isNotNull();
}
this.context = new AnnotationConfigApplicationContext(); @Test
this.context.register(EmbeddedDataSourceConfiguration.class); public void generateUniqueName() throws Exception {
this.context.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource("whatever", myProps)); this.context = load("spring.datasource.generate-unique-name=true");
this.context.refresh(); AnnotationConfigApplicationContext context2 =
load("spring.datasource.generate-unique-name=true");
try {
DataSource dataSource = this.context.getBean(DataSource.class); DataSource dataSource = this.context.getBean(DataSource.class);
assertThat(getDatabaseName(dataSource)).isNotEqualToIgnoringCase("testdb"); DataSource dataSource2 = context2.getBean(DataSource.class);
this.context.close(); assertThat(getDatabaseName(dataSource))
.isNotEqualTo(getDatabaseName(dataSource2));
System.out.println(dataSource2);
}
finally {
context2.close();
}
} }
private String getDatabaseName(DataSource dataSource) throws SQLException { private String getDatabaseName(DataSource dataSource) throws SQLException {
...@@ -78,4 +86,12 @@ public class EmbeddedDataSourceConfigurationTests { ...@@ -78,4 +86,12 @@ public class EmbeddedDataSourceConfigurationTests {
} }
} }
private AnnotationConfigApplicationContext load(String... environment) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
EnvironmentTestUtils.addEnvironment(ctx, environment);
ctx.register(EmbeddedDataSourceConfiguration.class);
ctx.refresh();
return ctx;
}
} }
...@@ -620,6 +620,7 @@ content into your application; rather pick only the properties that you need. ...@@ -620,6 +620,7 @@ content into your application; rather pick only the properties that you need.
spring.datasource.dbcp.*= # Commons DBCP specific settings spring.datasource.dbcp.*= # Commons DBCP specific settings
spring.datasource.dbcp2.*= # Commons DBCP2 specific settings spring.datasource.dbcp2.*= # Commons DBCP2 specific settings
spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default. spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
spring.datasource.generate-unique-name=false # Generate a random datasource name.
spring.datasource.hikari.*= # Hikari specific settings spring.datasource.hikari.*= # Hikari specific settings
spring.datasource.initialize=true # Populate the database using 'data.sql'. spring.datasource.initialize=true # Populate the database using 'data.sql'.
spring.datasource.jmx-enabled=false # Enable JMX support (if provided by the underlying pool). spring.datasource.jmx-enabled=false # Enable JMX support (if provided by the underlying pool).
......
...@@ -2655,6 +2655,14 @@ http://hsqldb.org/[HSQL] and http://db.apache.org/derby/[Derby] databases. You d ...@@ -2655,6 +2655,14 @@ http://hsqldb.org/[HSQL] and http://db.apache.org/derby/[Derby] databases. You d
to provide any connection URLs, simply include a build dependency to the embedded database to provide any connection URLs, simply include a build dependency to the embedded database
that you want to use. that you want to use.
[NOTE]
====
If you are using this feature in your tests, you may notice that the same database is
reused by your whole test suite regardless of the number of application contexts that
you use. If you want to make sure that each context has a separate embedded database,
you should set `spring.datasource.generate-unique-name` to `true`.
====
For example, typical POM dependencies would be: For example, typical POM dependencies would be:
[source,xml,indent=0] [source,xml,indent=0]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment