Skip to content

Commit 6b659f1

Browse files
committed
fix some errors and polish the code
1 parent 2eb7a57 commit 6b659f1

18 files changed

+126
-134
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Add the following Maven dependency:
6666
<dependency>
6767
<groupId>io.zonky.test</groupId>
6868
<artifactId>embedded-database-spring-test</artifactId>
69-
<version>2.3.0</version>
69+
<version>2.2.0</version>
7070
<scope>test</scope>
7171
</dependency>
7272
```

build.gradle

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ ext {
1212

1313
testSuites = [
1414
[name: 'default', versions: [
15-
[name: 'suite', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default']
15+
[name: 'suite', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default', 'hsqldb': 'default', 'derby': 'default']
1616
]],
1717
[name: 'spring', versions: [
18-
[name: '4.3.8', spring: '4.3.8.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default'],
19-
[name: '4.3.30', spring: '4.3.30.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default'],
20-
[name: '5.0.20', spring: '5.0.20.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default'],
21-
[name: '5.1.20', spring: '5.1.20.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default'],
22-
[name: '5.2.22', spring: '5.2.22.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default'],
23-
[name: '5.3.23', spring: '5.3.23', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default']
18+
[name: '4.3.8', spring: '4.3.8.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default', 'hsqldb': 'default', 'derby': 'default'],
19+
[name: '4.3.30', spring: '4.3.30.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default', 'hsqldb': 'default', 'derby': 'default'],
20+
[name: '5.0.20', spring: '5.0.20.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default', 'hsqldb': 'default', 'derby': 'default'],
21+
[name: '5.1.20', spring: '5.1.20.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default', 'hsqldb': 'default', 'derby': 'default'],
22+
[name: '5.2.22', spring: '5.2.22.RELEASE', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default', 'hsqldb': 'default', 'derby': 'default'],
23+
[name: '5.3.23', spring: '5.3.23', 'zonky-postgres': 'default', opentable: 'default', yandex: 'default', 'mssql-driver': 'default', 'mysql-driver': 'default', 'mariadb-driver': 'default', 'h2': 'default', 'hsqldb': 'default', 'derby': 'default']
2424
]],
2525
[name: 'flyway', versions: [
2626
[name: '4.0.3', flyway: '4.0.3', 'flyway-test': '4.0.1', spring: '4.3.30.RELEASE', 'spring-boot': '1.5.22.RELEASE', 'zonky-postgres': 'default'],
@@ -81,20 +81,25 @@ ext {
8181
[name: 'hsqldb', versions: [
8282
[name: '2.3.6', 'hsqldb': '2.3.6'],
8383
[name: '2.4.1', 'hsqldb': '2.4.1'],
84-
[name: '2.5.1', 'hsqldb': '2.5.1'],
85-
[name: '2.5.2', 'hsqldb': '2.5.2'],
86-
[name: '2.7.1', 'hsqldb': '2.7.1'],
84+
[name: '2.5.2', 'hsqldb': '2.5.2']
8785
]],
8886
[name: 'derby', versions: [
8987
[name: '10.13.1.1', 'derby': '10.13.1.1'],
90-
[name: '10.14.2.0', 'derby': '10.14.2.0'],
91-
[name: '10.15.1.3', 'derby': '10.15.1.3'],
92-
[name: '10.15.2.0', 'derby': '10.15.2.0'],
93-
[name: '10.16.1.1', 'derby': '10.16.1.1']
88+
[name: '10.14.2.0', 'derby': '10.14.2.0']
9489
]]
9590
]
9691
}
9792

93+
if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) {
94+
testSuites.find { it.name == 'hsqldb' }.versions << [name: '2.7.1', 'hsqldb': '2.7.1']
95+
}
96+
if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_1_9)) {
97+
testSuites.find { it.name == 'derby' }.versions << [name: '10.15.2.0', 'derby': '10.15.2.0']
98+
}
99+
if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) {
100+
testSuites.find { it.name == 'derby' }.versions << [name: '10.16.1.1', 'derby': '10.16.1.1']
101+
}
102+
98103
allprojects {
99104
group 'io.zonky.test'
100105
}
@@ -228,7 +233,8 @@ project(':embedded-database-spring-test') {
228233
compile 'org.mariadb.jdbc:mariadb-java-client:3.1.0', optional
229234
compile 'com.h2database:h2:2.1.214', optional
230235
compile 'org.hsqldb:hsqldb:2.5.2', optional
231-
compile 'org.apache.derby:derbynet:10.14.2.0', optional
236+
compile 'org.apache.derby:derby:10.14.2.0', optional
237+
compile 'org.apache.derby:derbytools:10.14.2.0', optional
232238

233239
compile 'org.flywaydb:flyway-core:9.8.2', optional
234240
compile 'org.flywaydb.flyway-test-extensions:flyway-spring-test:7.0.0', optional
@@ -398,7 +404,7 @@ project(':embedded-database-spring-test') {
398404
}
399405

400406
if (version.derby == null) { // optional dependencies are implicitly excluded
401-
exclude group: 'org.apache.derby', module: 'derby'
407+
exclude group: 'org.apache.derby'
402408
} else if (version.derby != 'default') {
403409
eachDependency { details ->
404410
if (details.requested.group == 'org.apache.derby') {
@@ -450,7 +456,7 @@ project(':embedded-database-spring-test') {
450456
excludeCategories 'io.zonky.test.category.MySQLTestSuite'
451457
excludeCategories 'io.zonky.test.category.MariaDBTestSuite'
452458
excludeCategories 'io.zonky.test.category.H2TestSuite'
453-
excludeCategories 'io.zonky.test.category.HSQLDBTestSuite'
459+
excludeCategories 'io.zonky.test.category.HSQLTestSuite'
454460
excludeCategories 'io.zonky.test.category.DerbyTestSuite'
455461
}
456462
}
@@ -495,7 +501,7 @@ project(':embedded-database-spring-test') {
495501
} else if (suite.name == 'h2') {
496502
includeCategories 'io.zonky.test.category.H2TestSuite'
497503
} else if (suite.name == 'hsqldb') {
498-
includeCategories 'io.zonky.test.category.HSQLDBTestSuite'
504+
includeCategories 'io.zonky.test.category.HSQLTestSuite'
499505
} else if (suite.name == 'derby') {
500506
includeCategories 'io.zonky.test.category.DerbyTestSuite'
501507
}

embedded-database-spring-test/src/main/java/io/zonky/test/db/AutoConfigureEmbeddedDatabase.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,8 @@ enum DatabaseType {
165165
/**
166166
* Apache Derby
167167
*/
168-
DERBY;
168+
DERBY
169169

170-
public static boolean canBeEmbedded(String databaseType) {
171-
return DatabaseType.H2.name().equalsIgnoreCase(databaseType) ||
172-
DatabaseType.HSQL.name().equalsIgnoreCase(databaseType) ||
173-
DatabaseType.DERBY.name().equalsIgnoreCase(databaseType);
174-
}
175170
}
176171

177172
/**

embedded-database-spring-test/src/main/java/io/zonky/test/db/config/EmbeddedDatabaseAutoConfiguration.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import io.zonky.test.db.liquibase.LiquibaseDatabaseExtension;
2222
import io.zonky.test.db.liquibase.LiquibasePropertiesPostProcessor;
2323
import io.zonky.test.db.provider.DatabaseProvider;
24+
import io.zonky.test.db.provider.derby.DerbyDatabaseProvider;
2425
import io.zonky.test.db.provider.h2.H2DatabaseProvider;
26+
import io.zonky.test.db.provider.hsqldb.HSQLDatabaseProvider;
2527
import io.zonky.test.db.provider.mariadb.DockerMariaDBDatabaseProvider;
2628
import io.zonky.test.db.provider.mssql.DockerMSSQLDatabaseProvider;
2729
import io.zonky.test.db.provider.mysql.DockerMySQLDatabaseProvider;
@@ -123,6 +125,26 @@ public DatabaseProvider h2DatabaseProvider(DatabaseProviderFactory h2DatabasePro
123125
return h2DatabaseProviderFactory.createProvider(H2DatabaseProvider.class);
124126
}
125127

128+
@Bean
129+
@Provider(type = "embedded", database = "hsql")
130+
@ConditionalOnMissingBean(name = "hsqlDatabaseProvider")
131+
public DatabaseProvider hsqlDatabaseProvider(DatabaseProviderFactory hsqlDatabaseProviderFactory) {
132+
checkDependency("org.hsqldb", "hsqldb", "org.hsqldb.jdbcDriver");
133+
return hsqlDatabaseProviderFactory.createProvider(HSQLDatabaseProvider.class);
134+
}
135+
136+
@Bean
137+
@Provider(type = "embedded", database = "derby")
138+
@ConditionalOnMissingBean(name = "derbyDatabaseProvider")
139+
public DatabaseProvider derbyDatabaseProvider(DatabaseProviderFactory derbyDatabaseProviderFactory) {
140+
if (!ClassUtils.isPresent("org.apache.derby.info.engine.DerbyModule", classLoader)) {
141+
checkDependency("org.apache.derby", "derby", "org.apache.derby.jdbc.EmbeddedDriver");
142+
} else {
143+
checkDependency("org.apache.derby", "derbytools", "org.apache.derby.jdbc.EmbeddedDriver");
144+
}
145+
return derbyDatabaseProviderFactory.createProvider(DerbyDatabaseProvider.class);
146+
}
147+
126148
@Bean
127149
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
128150
@ConditionalOnMissingBean(name = "postgresDatabaseProviderFactory")
@@ -168,6 +190,24 @@ public DatabaseProviderFactory h2DatabaseProviderFactory(DatabaseProviderFactory
168190
builder.prefetchingProvider(provider)));
169191
}
170192

193+
@Bean
194+
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
195+
@ConditionalOnMissingBean(name = "hsqlDatabaseProviderFactory")
196+
public DatabaseProviderFactory hsqlDatabaseProviderFactory(DatabaseProviderFactory defaultDatabaseProviderFactory) {
197+
return defaultDatabaseProviderFactory.customizeProvider((builder, provider) ->
198+
builder.optimizingProvider(
199+
builder.prefetchingProvider(provider)));
200+
}
201+
202+
@Bean
203+
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
204+
@ConditionalOnMissingBean(name = "derbyDatabaseProviderFactory")
205+
public DatabaseProviderFactory derbyDatabaseProviderFactory(DatabaseProviderFactory defaultDatabaseProviderFactory) {
206+
return defaultDatabaseProviderFactory.customizeProvider((builder, provider) ->
207+
builder.optimizingProvider(
208+
builder.prefetchingProvider(provider)));
209+
}
210+
171211
@Bean
172212
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
173213
@ConditionalOnMissingBean(name = "defaultDatabaseProviderFactory")

embedded-database-spring-test/src/main/java/io/zonky/test/db/event/EventPublishingTestExecutionListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class EventPublishingTestExecutionListener extends AbstractTestExecutionL
1313
private static final Logger logger = LoggerFactory.getLogger(EventPublishingTestExecutionListener.class);
1414

1515
private static final boolean TEST_EXECUTION_METHODS_SUPPORTED = ClassUtils.getMethodIfAvailable(
16-
TestExecutionListener.class, "beforeTestExecution") != null;
16+
TestExecutionListener.class, "beforeTestExecution", null) != null;
1717

1818
@Override
1919
public void beforeTestMethod(TestContext testContext) {

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/derby/DerbyDatabaseProvider.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,26 @@
2020
import io.zonky.test.db.provider.DatabaseProvider;
2121
import io.zonky.test.db.provider.EmbeddedDatabase;
2222
import io.zonky.test.db.provider.ProviderException;
23-
import org.slf4j.Logger;
24-
import org.slf4j.LoggerFactory;
23+
import org.apache.derby.jdbc.EmbeddedDriver ;
2524
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
2625

27-
import java.sql.DriverManager;
2826
import java.sql.SQLException;
2927
import java.util.Objects;
28+
import java.util.Properties;
3029
import java.util.UUID;
3130
import java.util.concurrent.CompletableFuture;
3231

3332
public class DerbyDatabaseProvider implements DatabaseProvider {
3433

35-
private static final Logger logger = LoggerFactory.getLogger(DerbyDatabaseProvider.class);
36-
private static final String URL_TEMPLATE = "jdbc:derby:memory:%s";
34+
private static final String URL_TEMPLATE = "jdbc:derby:memory:%s;%s";
3735

3836
@Override
3937
public EmbeddedDatabase createDatabase(DatabasePreparer preparer) throws ProviderException {
4038
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
4139
String databaseName = UUID.randomUUID().toString();
4240

43-
dataSource.setDriverClass(org.h2.Driver.class);
44-
dataSource.setUrl(String.format(URL_TEMPLATE + ";drop=true", databaseName));
41+
dataSource.setDriverClass(EmbeddedDriver.class);
42+
dataSource.setUrl(String.format(URL_TEMPLATE, databaseName, "create=true"));
4543
dataSource.setUsername("sa");
4644
dataSource.setPassword("");
4745

@@ -71,14 +69,9 @@ public int hashCode() {
7169
private static void shutdownDatabase(String dbName) {
7270
CompletableFuture.runAsync(() -> {
7371
try {
74-
DriverManager.getConnection(String.format(URL_TEMPLATE + ";shutdown=true", dbName));
72+
new EmbeddedDriver().connect(String.format(URL_TEMPLATE, dbName, "drop=true"), new Properties());
7573
} catch (SQLException e) {
76-
// it seems that there is no error for database in use condition
77-
if (logger.isTraceEnabled()) {
78-
logger.warn("Unable to release '{}' database", dbName, e);
79-
} else {
80-
logger.warn("Unable to release '{}' database", dbName);
81-
}
74+
// nothing to do
8275
}
8376
});
8477
}

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/derby/DerbyEmbeddedDatabase.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package io.zonky.test.db.provider.derby;
1818

1919
import io.zonky.test.db.provider.support.AbstractEmbeddedDatabase;
20-
import org.apache.derby.drda.NetworkServerControl;
2120

2221
import javax.sql.DataSource;
2322

@@ -39,7 +38,7 @@ protected DataSource getDataSource() {
3938

4039
@Override
4140
public String getJdbcUrl() {
42-
return String.format("jdbc:derby:mem:%s;USER=sa", dbName);
41+
return String.format("jdbc:derby:memory:%s;user=sa", dbName);
4342
}
4443

4544
public String getDatabaseName() {

embedded-database-spring-test/src/main/java/io/zonky/test/db/provider/h2/H2DatabaseProvider.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import io.zonky.test.db.provider.ProviderException;
2323
import io.zonky.test.db.util.ReflectionUtils;
2424
import org.h2.tools.Server;
25-
import org.slf4j.Logger;
26-
import org.slf4j.LoggerFactory;
2725
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
2826
import org.springframework.util.ClassUtils;
2927

@@ -37,7 +35,6 @@
3735

3836
public class H2DatabaseProvider implements DatabaseProvider {
3937

40-
private static final Logger logger = LoggerFactory.getLogger(H2DatabaseProvider.class);
4138
private static final Server server = startServer();
4239

4340
private static Server startServer() {
@@ -85,8 +82,7 @@ public EmbeddedDatabase createDatabase(DatabasePreparer preparer) throws Provide
8582
@Override
8683
public boolean equals(Object o) {
8784
if (this == o) return true;
88-
if (o == null || getClass() != o.getClass()) return false;
89-
return true;
85+
return o != null && getClass() == o.getClass();
9086
}
9187

9288
@Override
@@ -99,12 +95,7 @@ private static void shutdownDatabase(DataSource dataSource, String dbName) {
9995
try {
10096
executeStatement(dataSource, "SHUTDOWN");
10197
} catch (SQLException e) {
102-
// it seems that there is no error for database in use condition
103-
// if (logger.isTraceEnabled()) {
104-
// logger.warn("Unable to release '{}' database", dbName, e);
105-
// } else {
106-
// logger.warn("Unable to release '{}' database", dbName);
107-
// }
98+
// nothing to do
10899
}
109100
});
110101
}
Lines changed: 6 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,7 @@
2020
import io.zonky.test.db.provider.DatabaseProvider;
2121
import io.zonky.test.db.provider.EmbeddedDatabase;
2222
import io.zonky.test.db.provider.ProviderException;
23-
import io.zonky.test.db.util.ReflectionUtils;
24-
import org.hsqldb.server.HsqlServerFactory;
25-
import org.hsqldb.server.Server;
26-
import org.slf4j.Logger;
27-
import org.slf4j.LoggerFactory;
2823
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
29-
import org.springframework.util.ClassUtils;
3024

3125
import javax.sql.DataSource;
3226
import java.sql.Connection;
@@ -36,44 +30,19 @@
3630
import java.util.UUID;
3731
import java.util.concurrent.CompletableFuture;
3832

39-
public class HSQLDBDatabaseProvider implements DatabaseProvider {
40-
41-
private static final Logger logger = LoggerFactory.getLogger(HSQLDBDatabaseProvider.class);
42-
43-
private static final Server server = startServer();
44-
45-
private static Server startServer() {
46-
try {
47-
Server server = (Server) HsqlServerFactory.createHsqlServer("mem:testdb", true, false);
48-
server.start();
49-
registerShutdownHook(server);
50-
return server;
51-
} catch (SQLException e) {
52-
return null;
53-
}
54-
}
55-
56-
private static void registerShutdownHook(Server server) {
57-
try {
58-
Class<?> applicationType = ClassUtils.forName("org.springframework.boot.SpringApplication", null);
59-
Object shutdownHandlers = ReflectionUtils.invokeStaticMethod(applicationType, "getShutdownHandlers");
60-
ReflectionUtils.invokeMethod(shutdownHandlers, "add", (Runnable) server::shutdown);
61-
} catch (Throwable ex) {
62-
Runtime.getRuntime().addShutdownHook(new Thread(server::shutdown));
63-
}
64-
}
33+
public class HSQLDatabaseProvider implements DatabaseProvider {
6534

6635
@Override
6736
public EmbeddedDatabase createDatabase(DatabasePreparer preparer) throws ProviderException {
6837
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
6938
String databaseName = UUID.randomUUID().toString();
7039

71-
dataSource.setDriverClass(org.h2.Driver.class);
72-
dataSource.setUrl(String.format("jdbc:hsqldb:mem:%s;DB_CLOSE_DELAY=-1", databaseName));
40+
dataSource.setDriverClass(org.hsqldb.jdbcDriver.class);
41+
dataSource.setUrl(String.format("jdbc:hsqldb:mem:%s", databaseName));
7342
dataSource.setUsername("sa");
7443
dataSource.setPassword("");
7544

76-
HSQLDBEmbeddedDatabase database = new HSQLDBEmbeddedDatabase(server, dataSource, databaseName,
45+
HSQLEmbeddedDatabase database = new HSQLEmbeddedDatabase(dataSource, databaseName,
7746
() -> shutdownDatabase(dataSource, databaseName));
7847
try {
7948
if (preparer != null) {
@@ -93,20 +62,15 @@ public boolean equals(Object o) {
9362

9463
@Override
9564
public int hashCode() {
96-
return Objects.hash(HSQLDBDatabaseProvider.class);
65+
return Objects.hash(HSQLDatabaseProvider.class);
9766
}
9867

9968
private static void shutdownDatabase(DataSource dataSource, String dbName) {
10069
CompletableFuture.runAsync(() -> {
10170
try {
10271
executeStatement(dataSource, "SHUTDOWN");
10372
} catch (SQLException e) {
104-
// it seems that there is no error for database in use condition
105-
if (logger.isTraceEnabled()) {
106-
logger.warn("Unable to release '{}' database", dbName, e);
107-
} else {
108-
logger.warn("Unable to release '{}' database", dbName);
109-
}
73+
// nothing to do
11074
}
11175
});
11276
}

0 commit comments

Comments
 (0)