diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index e19593aa..3cbd362f 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -6,7 +6,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- java: [8, 11, 13, 14]
+ java: [8, 11, 13, 14, 15]
steps:
- name: Checkout project
uses: actions/checkout@v1
diff --git a/pom.xml b/pom.xml
index f1b54be6..4ec34632 100644
--- a/pom.xml
+++ b/pom.xml
@@ -158,10 +158,22 @@
org.junit.jupiter
junit-jupiter-api
- 5.6.2
+ 5.7.0
provided
true
+
+ org.junit.vintage
+ junit-vintage-engine
+ 5.7.0
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.7.0
+ test
+
org.slf4j
@@ -179,6 +191,10 @@
+
+ maven-surefire-plugin
+ 2.22.2
+
maven-pmd-plugin
3.13.0
@@ -239,7 +255,7 @@
- -Xdoclint:none
+ none
diff --git a/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java b/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java
index 5f525ff8..2cb49ce0 100644
--- a/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java
+++ b/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java
@@ -14,7 +14,7 @@
package io.zonky.test.db.postgres.junit5;
import io.zonky.test.db.postgres.embedded.DatabasePreparer;
-import org.junit.rules.TestRule;
+import org.junit.jupiter.api.extension.Extension;
public final class EmbeddedPostgresExtension {
@@ -28,7 +28,7 @@ public static SingleInstancePostgresExtension singleInstance() {
}
/**
- * Returns a {@link TestRule} to create a Postgres cluster, shared amongst all test cases in this JVM.
+ * Returns a {@link Extension} to create a Postgres cluster, shared amongst all test cases in this JVM.
* The rule contributes Config switches to configure each test case to get its own database.
*/
public static PreparedDbExtension preparedDatabase(DatabasePreparer preparer)
diff --git a/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java b/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java
index 70c108e1..81cf457f 100644
--- a/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java
+++ b/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java
@@ -17,18 +17,17 @@
import io.zonky.test.db.postgres.embedded.DatabasePreparer;
import io.zonky.test.db.postgres.embedded.EmbeddedPostgres;
import io.zonky.test.db.postgres.embedded.PreparedDbProvider;
-import org.junit.jupiter.api.extension.AfterAllCallback;
-import org.junit.jupiter.api.extension.BeforeAllCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.*;
import javax.sql.DataSource;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
-public class PreparedDbExtension implements BeforeAllCallback, AfterAllCallback {
+public class PreparedDbExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback {
private final DatabasePreparer preparer;
+ private boolean perClass = false;
private volatile DataSource dataSource;
private volatile PreparedDbProvider provider;
private volatile ConnectionInfo connectionInfo;
@@ -55,6 +54,7 @@ public void beforeAll(ExtensionContext extensionContext) throws Exception {
provider = PreparedDbProvider.forPreparer(preparer, builderCustomizers);
connectionInfo = provider.createNewDatabase();
dataSource = provider.createDataSourceFromConnectionInfo(connectionInfo);
+ perClass = true;
}
@Override
@@ -62,6 +62,25 @@ public void afterAll(ExtensionContext extensionContext) {
dataSource = null;
connectionInfo = null;
provider = null;
+ perClass = false;
+ }
+
+ @Override
+ public void beforeEach(ExtensionContext extensionContext) throws Exception {
+ if (!perClass) {
+ provider = PreparedDbProvider.forPreparer(preparer, builderCustomizers);
+ connectionInfo = provider.createNewDatabase();
+ dataSource = provider.createDataSourceFromConnectionInfo(connectionInfo);
+ }
+ }
+
+ @Override
+ public void afterEach(ExtensionContext extensionContext) {
+ if (!perClass) {
+ dataSource = null;
+ connectionInfo = null;
+ provider = null;
+ }
}
public DataSource getTestDatabase() {
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java b/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java
index 3ec8f921..b752dc5b 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java
@@ -13,22 +13,23 @@
*/
package io.zonky.test.db.postgres.embedded;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
public class EmbeddedPostgresTest
{
- @Rule
- public TemporaryFolder tf = new TemporaryFolder();
+ @TempDir
+ public Path tf;
@Test
public void testEmbeddedPg() throws Exception
@@ -47,7 +48,7 @@ public void testEmbeddedPg() throws Exception
public void testEmbeddedPgCreationWithNestedDataDirectory() throws Exception
{
try (EmbeddedPostgres pg = EmbeddedPostgres.builder()
- .setDataDirectory(tf.newFolder("data-dir-parent") + "/data-dir")
+ .setDataDirectory(Files.createDirectories(tf.resolve("data-dir-parent").resolve("data-dir")))
.start()) {
// nothing to do
}
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/ConnectConfigTest.java b/src/test/java/io/zonky/test/db/postgres/junit/ConnectConfigTest.java
similarity index 90%
rename from src/test/java/io/zonky/test/db/postgres/embedded/ConnectConfigTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/ConnectConfigTest.java
index a159b8df..22aa3b3e 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/ConnectConfigTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/ConnectConfigTest.java
@@ -1,7 +1,7 @@
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.PreparedDbRule;
+import io.zonky.test.db.postgres.embedded.ConnectionInfo;
+import io.zonky.test.db.postgres.embedded.DatabasePreparer;
import org.junit.Rule;
import org.junit.Test;
import org.postgresql.ds.common.BaseDataSource;
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/FlywayPreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit/FlywayPreparerTest.java
similarity index 88%
rename from src/test/java/io/zonky/test/db/postgres/embedded/FlywayPreparerTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/FlywayPreparerTest.java
index 69c54e29..ff765eef 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/FlywayPreparerTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/FlywayPreparerTest.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
import static org.junit.Assert.assertEquals;
@@ -19,12 +19,10 @@
import java.sql.ResultSet;
import java.sql.Statement;
+import io.zonky.test.db.postgres.embedded.FlywayPreparer;
import org.junit.Rule;
import org.junit.Test;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.PreparedDbRule;
-
public class FlywayPreparerTest {
@Rule
public PreparedDbRule db = EmbeddedPostgresRules.preparedDatabase(FlywayPreparer.forClasspathLocation("db/testing"));
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/IsolationTest.java b/src/test/java/io/zonky/test/db/postgres/junit/IsolationTest.java
similarity index 89%
rename from src/test/java/io/zonky/test/db/postgres/embedded/IsolationTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/IsolationTest.java
index b665684e..7184d23a 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/IsolationTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/IsolationTest.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
import java.sql.Connection;
import java.sql.SQLException;
@@ -20,9 +20,6 @@
import org.junit.Rule;
import org.junit.Test;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.SingleInstancePostgresRule;
-
public class IsolationTest
{
@Rule
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerContextTest.java b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerContextTest.java
similarity index 89%
rename from src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerContextTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerContextTest.java
index a633b774..d9b9908f 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerContextTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerContextTest.java
@@ -11,10 +11,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.PreparedDbRule;
+import io.zonky.test.db.postgres.embedded.LiquibasePreparer;
import liquibase.Contexts;
import org.junit.Rule;
import org.junit.Test;
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerTest.java
similarity index 88%
rename from src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerTest.java
index 395025dc..4c646ca5 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerTest.java
@@ -11,10 +11,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.PreparedDbRule;
+import io.zonky.test.db.postgres.embedded.LiquibasePreparer;
import org.junit.Rule;
import org.junit.Test;
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbCustomizerTest.java b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbCustomizerTest.java
similarity index 92%
rename from src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbCustomizerTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/PreparedDbCustomizerTest.java
index dbd1a484..41c0542c 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbCustomizerTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbCustomizerTest.java
@@ -11,10 +11,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.PreparedDbRule;
+import io.zonky.test.db.postgres.embedded.DatabasePreparer;
import org.junit.Rule;
import org.junit.Test;
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbTest.java b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbTest.java
similarity index 93%
rename from src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/PreparedDbTest.java
index 486b2871..7b01c181 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbTest.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
import static org.junit.Assert.assertEquals;
@@ -24,12 +24,12 @@
import javax.sql.DataSource;
+import io.zonky.test.db.postgres.embedded.ConnectionInfo;
+import io.zonky.test.db.postgres.embedded.DatabaseConnectionPreparer;
+import io.zonky.test.db.postgres.embedded.DatabasePreparer;
import org.junit.Rule;
import org.junit.Test;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.PreparedDbRule;
-
public class PreparedDbTest {
private final DatabasePreparer prepA = new SimplePreparer("a");
diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/SingleInstanceRuleTest.java b/src/test/java/io/zonky/test/db/postgres/junit/SingleInstanceRuleTest.java
similarity index 88%
rename from src/test/java/io/zonky/test/db/postgres/embedded/SingleInstanceRuleTest.java
rename to src/test/java/io/zonky/test/db/postgres/junit/SingleInstanceRuleTest.java
index a11e5da4..d8ec7f21 100644
--- a/src/test/java/io/zonky/test/db/postgres/embedded/SingleInstanceRuleTest.java
+++ b/src/test/java/io/zonky/test/db/postgres/junit/SingleInstanceRuleTest.java
@@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.zonky.test.db.postgres.embedded;
+package io.zonky.test.db.postgres.junit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -24,9 +24,6 @@
import org.junit.Rule;
import org.junit.Test;
-import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules;
-import io.zonky.test.db.postgres.junit.SingleInstancePostgresRule;
-
public class SingleInstanceRuleTest
{
@Rule
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/ConnectConfigTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/ConnectConfigTest.java
new file mode 100644
index 00000000..62e7865d
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/ConnectConfigTest.java
@@ -0,0 +1,53 @@
+package io.zonky.test.db.postgres.junit5;
+
+import io.zonky.test.db.postgres.embedded.ConnectionInfo;
+import io.zonky.test.db.postgres.embedded.DatabasePreparer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.postgresql.ds.common.BaseDataSource;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class ConnectConfigTest {
+
+ private final CapturingDatabasePreparer preparer = new CapturingDatabasePreparer();
+
+ @RegisterExtension
+ public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(preparer)
+ .customize(builder -> builder.setConnectConfig("connectTimeout", "20"));
+
+ @Test
+ public void test() throws SQLException {
+ ConnectionInfo connectionInfo = db.getConnectionInfo();
+
+ Map properties = connectionInfo.getProperties();
+ assertEquals(1, properties.size());
+ assertEquals("20", properties.get("connectTimeout"));
+
+ BaseDataSource testDatabase = (BaseDataSource) db.getTestDatabase();
+ assertEquals("20", testDatabase.getProperty("connectTimeout"));
+
+ BaseDataSource preparerDataSource = (BaseDataSource) preparer.getDataSource();
+ assertEquals("20", preparerDataSource.getProperty("connectTimeout"));
+ }
+
+ private class CapturingDatabasePreparer implements DatabasePreparer {
+
+ private DataSource dataSource;
+
+ @Override
+ public void prepare(DataSource ds) {
+ if (dataSource != null)
+ throw new IllegalStateException("database preparer has been called multiple times");
+ dataSource = ds;
+ }
+
+ public DataSource getDataSource() {
+ return dataSource;
+ }
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/DatabaseLifecycleTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/DatabaseLifecycleTest.java
new file mode 100644
index 00000000..a37eff69
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/DatabaseLifecycleTest.java
@@ -0,0 +1,68 @@
+package io.zonky.test.db.postgres.junit5;
+
+import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@TestMethodOrder(OrderAnnotation.class)
+public class DatabaseLifecycleTest {
+
+ @RegisterExtension
+ public static PreparedDbExtension staticExtension = EmbeddedPostgresExtension.preparedDatabase(ds -> {});
+
+ @RegisterExtension
+ public PreparedDbExtension instanceExtension = EmbeddedPostgresExtension.preparedDatabase(ds -> {});
+
+ @Test
+ @Order(1)
+ public void testCreate1() throws Exception
+ {
+ createTable(staticExtension, "table1");
+ createTable(instanceExtension, "table2");
+ }
+
+ @Test
+ @Order(2)
+ public void testCreate2() throws Exception
+ {
+ assertTrue(existsTable(staticExtension, "table1"));
+ assertFalse(existsTable(instanceExtension, "table2"));
+ }
+
+ @Test
+ @Order(3)
+ public void testCreate3() throws Exception
+ {
+ assertTrue(existsTable(staticExtension, "table1"));
+ assertFalse(existsTable(instanceExtension, "table2"));
+ }
+
+ private void createTable(PreparedDbExtension extension, String table) throws SQLException
+ {
+ try (Connection connection = extension.getTestDatabase().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(String.format("CREATE TABLE public.%s (a INTEGER)", table));
+ }
+ }
+
+ private boolean existsTable(PreparedDbExtension extension, String table) throws SQLException
+ {
+ try (Connection connection = extension.getTestDatabase().getConnection();
+ Statement statement = connection.createStatement()) {
+ String query = String.format("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = '%s')", table);
+ ResultSet resultSet = statement.executeQuery(query);
+ resultSet.next();
+ return resultSet.getBoolean(1);
+ }
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/FlywayPreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/FlywayPreparerTest.java
new file mode 100644
index 00000000..c5aa84b1
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/FlywayPreparerTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.zonky.test.db.postgres.junit5;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+
+import io.zonky.test.db.postgres.embedded.FlywayPreparer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class FlywayPreparerTest {
+ @RegisterExtension
+ public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(FlywayPreparer.forClasspathLocation("db/testing"));
+
+ @Test
+ public void testTablesMade() throws Exception {
+ try (Connection c = db.getTestDatabase().getConnection();
+ Statement s = c.createStatement()) {
+ ResultSet rs = s.executeQuery("SELECT * FROM foo");
+ rs.next();
+ assertEquals("bar", rs.getString(1));
+ }
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/IsolationTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/IsolationTest.java
new file mode 100644
index 00000000..afe4d606
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/IsolationTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.zonky.test.db.postgres.junit5;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class IsolationTest
+{
+ @RegisterExtension
+ public SingleInstancePostgresExtension pg1 = EmbeddedPostgresExtension.singleInstance();
+
+ @RegisterExtension
+ public SingleInstancePostgresExtension pg2 = EmbeddedPostgresExtension.singleInstance();
+
+ @Test
+ public void testIsolation() throws Exception
+ {
+ try (Connection c = getConnection(pg1)) {
+ makeTable(c);
+ try (Connection c2 = getConnection(pg2)) {
+ makeTable(c2);
+ }
+ }
+ }
+
+ private void makeTable(Connection c) throws SQLException
+ {
+ Statement s = c.createStatement();
+ s.execute("CREATE TABLE public.foo (a INTEGER)");
+ }
+
+ private Connection getConnection(SingleInstancePostgresExtension epg) throws SQLException
+ {
+ return epg.getEmbeddedPostgres().getPostgresDatabase().getConnection();
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerContextTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerContextTest.java
new file mode 100644
index 00000000..bd229daa
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerContextTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.zonky.test.db.postgres.junit5;
+
+import io.zonky.test.db.postgres.embedded.LiquibasePreparer;
+import liquibase.Contexts;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class LiquibasePreparerContextTest {
+
+ @RegisterExtension
+ public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(LiquibasePreparer.forClasspathLocation("liqui/master-test.xml", new Contexts("test")));
+
+ @Test
+ public void testEmptyTables() throws Exception {
+ try (Connection c = db.getTestDatabase().getConnection();
+ Statement s = c.createStatement()) {
+ ResultSet rs = s.executeQuery("SELECT COUNT(*) FROM foo");
+ rs.next();
+ assertEquals(0, rs.getInt(1));
+ }
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerTest.java
new file mode 100644
index 00000000..8653d488
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.zonky.test.db.postgres.junit5;
+
+import io.zonky.test.db.postgres.embedded.LiquibasePreparer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class LiquibasePreparerTest {
+
+ @RegisterExtension
+ public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(LiquibasePreparer.forClasspathLocation("liqui/master.xml"));
+
+ @Test
+ public void testTablesMade() throws Exception {
+ try (Connection c = db.getTestDatabase().getConnection();
+ Statement s = c.createStatement()) {
+ ResultSet rs = s.executeQuery("SELECT * FROM foo");
+ rs.next();
+ assertEquals("bar", rs.getString(1));
+ }
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbCustomizerTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbCustomizerTest.java
new file mode 100644
index 00000000..a5b9bdfa
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbCustomizerTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.zonky.test.db.postgres.junit5;
+
+import io.zonky.test.db.postgres.embedded.DatabasePreparer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import java.time.Duration;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
+public class PreparedDbCustomizerTest {
+
+ private static final DatabasePreparer EMPTY_PREPARER = ds -> {};
+
+ @RegisterExtension
+ public PreparedDbExtension dbA1 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER);
+ @RegisterExtension
+ public PreparedDbExtension dbA2 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> {});
+ @RegisterExtension
+ public PreparedDbExtension dbA3 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> builder.setPGStartupWait(Duration.ofSeconds(10)));
+ @RegisterExtension
+ public PreparedDbExtension dbB1 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> builder.setPGStartupWait(Duration.ofSeconds(11)));
+ @RegisterExtension
+ public PreparedDbExtension dbB2 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> builder.setPGStartupWait(Duration.ofSeconds(11)));
+
+ @Test
+ public void testCustomizers() {
+ int dbA1Port = dbA1.getConnectionInfo().getPort();
+ int dbA2Port = dbA2.getConnectionInfo().getPort();
+ int dbA3Port = dbA3.getConnectionInfo().getPort();
+
+ assertEquals(dbA1Port, dbA2Port);
+ assertEquals(dbA1Port, dbA3Port);
+
+ int dbB1Port = dbB1.getConnectionInfo().getPort();
+ int dbB2Port = dbB2.getConnectionInfo().getPort();
+
+ assertEquals(dbB1Port, dbB2Port);
+
+ assertNotEquals(dbA1Port, dbB2Port);
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbTest.java
new file mode 100644
index 00000000..c4a75409
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbTest.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.zonky.test.db.postgres.junit5;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import javax.sql.DataSource;
+
+import io.zonky.test.db.postgres.embedded.ConnectionInfo;
+import io.zonky.test.db.postgres.embedded.DatabaseConnectionPreparer;
+import io.zonky.test.db.postgres.embedded.DatabasePreparer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class PreparedDbTest {
+
+ private final DatabasePreparer prepA = new SimplePreparer("a");
+ private final DatabasePreparer prepB = new SimplePreparer("b");
+
+ @RegisterExtension
+ public PreparedDbExtension dbA1 = EmbeddedPostgresExtension.preparedDatabase(prepA);
+ @RegisterExtension
+ public PreparedDbExtension dbA2 = EmbeddedPostgresExtension.preparedDatabase(prepA);
+ @RegisterExtension
+ public PreparedDbExtension dbB1 = EmbeddedPostgresExtension.preparedDatabase(prepB);
+
+ @Test
+ public void testDbs() throws Exception {
+ try (Connection c = dbA1.getTestDatabase().getConnection();
+ Statement stmt = c.createStatement()) {
+ commonAssertion(stmt);
+ }
+ try (Connection c = dbA2.getTestDatabase().getConnection();
+ PreparedStatement stmt = c.prepareStatement("SELECT count(1) FROM a")) {
+ ResultSet rs = stmt.executeQuery();
+ rs.next();
+ assertEquals(0, rs.getInt(1));
+ }
+ try (Connection c = dbB1.getTestDatabase().getConnection();
+ PreparedStatement stmt = c.prepareStatement("SELECT * FROM b")) {
+ stmt.execute();
+ }
+ }
+
+ private void commonAssertion(final Statement stmt) throws SQLException {
+ stmt.execute("INSERT INTO a VALUES(1)");
+ ResultSet rs = stmt.executeQuery("SELECT COUNT(1) FROM a");
+ rs.next();
+ assertEquals(1, rs.getInt(1));
+ }
+
+ @Test
+ public void testEquivalentAccess() throws SQLException {
+ ConnectionInfo dbInfo = dbA1.getConnectionInfo();
+ DataSource dataSource = dbA1.getTestDatabase();
+ try (Connection c = dataSource.getConnection(); Statement stmt = c.createStatement()) {
+ commonAssertion(stmt);
+ assertEquals(dbInfo.getUser(), c.getMetaData().getUserName());
+ }
+ }
+
+ @Test
+ public void testDbUri() throws Exception {
+ try (Connection c = DriverManager.getConnection(dbA1.getDbProvider().createDatabase());
+ Statement stmt = c.createStatement()) {
+ commonAssertion(stmt);
+ }
+ }
+
+ static class SimplePreparer implements DatabaseConnectionPreparer {
+ private final String name;
+
+ public SimplePreparer(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public void prepare(Connection conn) throws SQLException {
+ try (PreparedStatement stmt = conn.prepareStatement(String.format(
+ "CREATE TABLE %s (foo int)", name))) {
+ stmt.execute();
+ }
+ }
+ }
+}
diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/SingleInstanceRuleTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/SingleInstanceRuleTest.java
new file mode 100644
index 00000000..1df4c0f7
--- /dev/null
+++ b/src/test/java/io/zonky/test/db/postgres/junit5/SingleInstanceRuleTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.zonky.test.db.postgres.junit5;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class SingleInstanceRuleTest
+{
+ @RegisterExtension
+ public SingleInstancePostgresExtension epg = EmbeddedPostgresExtension.singleInstance();
+
+ @Test
+ public void testRule() throws Exception {
+ try (Connection c = epg.getEmbeddedPostgres().getPostgresDatabase().getConnection()) {
+ Statement s = c.createStatement();
+ ResultSet rs = s.executeQuery("SELECT 1");
+ assertTrue(rs.next());
+ assertEquals(1, rs.getInt(1));
+ assertFalse(rs.next());
+ }
+ }
+}