Skip to content

Commit

Permalink
Polish contribution
Browse files Browse the repository at this point in the history
  • Loading branch information
snicoll committed Oct 6, 2016
1 parent 7fcb197 commit 03961e6
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.nio.charset.Charset;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;

import javax.sql.DataSource;

Expand Down Expand Up @@ -58,9 +59,9 @@ public class DataSourceProperties
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
Expand Down Expand Up @@ -153,6 +154,8 @@ public class DataSourceProperties

private Xa xa = new Xa();

private String uniqueName;

@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
Expand Down Expand Up @@ -188,12 +191,12 @@ public void setName(String name) {
this.name = name;
}

public boolean isGenerateName() {
return this.generateName;
public boolean isGenerateUniqueName() {
return this.generateUniqueName;
}

public void setGenerateName(boolean generateName) {
this.generateName = generateName;
public void setGenerateUniqueName(boolean generateUniqueName) {
this.generateUniqueName = generateUniqueName;
}

public Class<? extends DataSource> getType() {
Expand Down Expand Up @@ -281,14 +284,24 @@ public String determineUrl() {
if (StringUtils.hasText(this.url)) {
return this.url;
}
String url = this.embeddedDatabaseConnection.getUrl(this.name);
String url = this.embeddedDatabaseConnection.getUrl(determineDatabaseName());
if (!StringUtils.hasText(url)) {
throw new DataSourceBeanCreationException(this.embeddedDatabaseConnection,
this.environment, "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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,8 @@ public void setBeanClassLoader(ClassLoader classLoader) {
public EmbeddedDatabase dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseConnection.get(this.classLoader).getType());
if (this.properties.isGenerateName()) {
builder.generateUniqueName(true);
}
else {
builder.setName(this.properties.getName());
}
this.database = builder.build();
this.database = builder.setName(this.properties.getName())
.generateUniqueName(this.properties.isGenerateUniqueName()).build();
return this.database;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,19 @@ public void determineUrlWithExplicitConfig() throws Exception {
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
public void determineUsername() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,47 +19,55 @@
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.junit.After;
import org.junit.Test;

import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.PropertiesPropertySource;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Tests for {@link EmbeddedDataSourceConfiguration}.
*
* @author Dave Syer
* @author Stephane Nicoll
*/
public class EmbeddedDataSourceConfigurationTests {

private AnnotationConfigApplicationContext context;

@After
public void closeContext() {
if (this.context != null) {
this.context.close();
}
}

@Test
public void testDefaultEmbeddedDatabase() throws Exception {
this.context = new AnnotationConfigApplicationContext();
this.context.register(EmbeddedDataSourceConfiguration.class);
this.context.refresh();
public void defaultEmbeddedDatabase() {
this.context = load();
assertThat(this.context.getBean(DataSource.class)).isNotNull();
this.context.close();
}

@Test
public void generatesUniqueDatabaseName() throws Exception {
Properties myProps = new Properties();
myProps.setProperty("spring.datasource.generate-name", "true");

this.context = new AnnotationConfigApplicationContext();
this.context.register(EmbeddedDataSourceConfiguration.class);
this.context.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource("whatever", myProps));
this.context.refresh();
DataSource dataSource = this.context.getBean(DataSource.class);
assertThat(getDatabaseName(dataSource)).isNotEqualToIgnoringCase("testdb");
this.context.close();
public void generateUniqueName() throws Exception {
this.context = load("spring.datasource.generate-unique-name=true");
AnnotationConfigApplicationContext context2 =
load("spring.datasource.generate-unique-name=true");
try {
DataSource dataSource = this.context.getBean(DataSource.class);
DataSource dataSource2 = context2.getBean(DataSource.class);
assertThat(getDatabaseName(dataSource))
.isNotEqualTo(getDatabaseName(dataSource2));
System.out.println(dataSource2);
}
finally {
context2.close();
}
}

private String getDatabaseName(DataSource dataSource) throws SQLException {
Expand All @@ -78,4 +86,12 @@ private String getDatabaseName(DataSource dataSource) throws SQLException {
}
}

private AnnotationConfigApplicationContext load(String... environment) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
EnvironmentTestUtils.addEnvironment(ctx, environment);
ctx.register(EmbeddedDataSourceConfiguration.class);
ctx.refresh();
return ctx;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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.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.generate-unique-name=false # Generate a random datasource name.
spring.datasource.hikari.*= # Hikari specific settings
spring.datasource.initialize=true # Populate the database using 'data.sql'.
spring.datasource.jmx-enabled=false # Enable JMX support (if provided by the underlying pool).
Expand Down
8 changes: 8 additions & 0 deletions spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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
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:

[source,xml,indent=0]
Expand Down

0 comments on commit 03961e6

Please sign in to comment.