Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,14 @@
<optional>true</optional>
</dependency>

<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean</artifactId>
<version>17.0.0-RC2</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>io.avaje</groupId>
<artifactId>junit</artifactId>
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/io/ebean/test/containers/BaseDbBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -478,11 +478,21 @@ public String getExtraDbUser() {
return extraDbUser;
}

@Override
public String getExtraDbUserWithDefault() {
return extraDbUser != null ? extraDbUser : extraDb;
}

@Override
public String getExtraDbPassword() {
return extraDbPassword;
}

@Override
public String getExtraDbPasswordWithDefault() {
return extraDbPassword != null ? extraDbPassword : password;
}

@Override
public String getExtraDbExtensions() {
return extraDbExtensions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ private void createExtraDb(Connection connection, boolean withDrop) {
dropDatabaseIfExists(connection, extraDb);
dropRoleIfExists(connection, extraUser);
}
createRole(connection, extraUser, getWithDefault(dbConfig.getExtraDbPassword(), dbConfig.getPassword()));
createRole(connection, extraUser, dbConfig.getExtraDbPasswordWithDefault());
if (databaseNotExists(connection, extraDb)) {
createExtraDatabase(connection, extraDb, extraUser);
}
Expand Down Expand Up @@ -127,7 +127,7 @@ private void addExtensions(String dbExtensions, String jdbcUrl) {
* Additionally we don't create an extra user IF it is the same as the main db user.
*/
private String getExtraDbUser() {
String extraUser = getWithDefault(dbConfig.getExtraDbUser(), dbConfig.getExtraDb());
String extraUser = dbConfig.getExtraDbUserWithDefault();
return extraUser != null && !extraUser.equals(dbConfig.getUsername()) ? extraUser : null;
}

Expand All @@ -147,10 +147,6 @@ private ProcessBuilder sqlFileProcess(String dbUser, String dbName, String conta
return createProcessBuilder(args);
}

private String getWithDefault(String value, String defaultValue) {
return value == null ? defaultValue : value;
}

private List<String> parseExtensions(String dbExtn) {
return TrimSplit.split(dbExtn);
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/io/ebean/test/containers/DbContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ public boolean startContainerOnly() {
return true;
}

/**
* Return the Ebean SDK to obtain Ebean Database and Ebean DataSource builders
* for the underlying container.
*/
public EbeanSDK ebean() {
return new EbeanAdapter(dbConfig);
}

/**
* If we are using FastStartMode just check is the DB exists and if so assume it is all created correctly.
* <p>
Expand Down
48 changes: 48 additions & 0 deletions src/main/java/io/ebean/test/containers/EbeanAdapter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.ebean.test.containers;

final class EbeanAdapter implements EbeanSDK {

private final InternalConfigDb dbConfig;

EbeanAdapter(InternalConfigDb dbConfig) {
this.dbConfig = dbConfig;
}

@Override
public io.ebean.DatabaseBuilder builder() {
return io.ebean.Database.builder()
.dataSourceBuilder(dataSourceBuilder())
.name(dbConfig.getDbName())
.register(false)
.ddlGenerate(true)
.ddlRun(true);
}


@Override
public io.ebean.datasource.DataSourceBuilder dataSourceBuilder() {
return io.ebean.datasource.DataSourceBuilder.create()
.url(dbConfig.jdbcUrl())
.username(dbConfig.getUsername())
.password(dbConfig.getPassword());
}


@Override
public io.ebean.datasource.DataSourceBuilder extraDataSourceBuilder() {
return io.ebean.datasource.DataSourceBuilder.create()
.url(dbConfig.jdbcExtraUrl())
.username(dbConfig.getExtraDbUserWithDefault())
.password(dbConfig.getExtraDbPasswordWithDefault());
}

@Override
public io.ebean.DatabaseBuilder extraDatabaseBuilder() {
return io.ebean.Database.builder()
.dataSourceBuilder(extraDataSourceBuilder())
.name(dbConfig.getExtraDb())
.defaultDatabase(false)
.register(false);
}

}
43 changes: 43 additions & 0 deletions src/main/java/io/ebean/test/containers/EbeanSDK.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package io.ebean.test.containers;

/**
* Ebean SDK extension to create builders for Ebean Database and DataSource.
* <pre>{@code
*
* PostgresContainer container = PostgresContainer.builder("15")
* .dbName("my_test")
* .build()
* .start();
*
* io.ebean.Database ebean = container.ebean().builder().build();
* // create ebean database and use it
*
* }</pre>
*/
public interface EbeanSDK {

/**
* Return an ebean Database builder for the underlying database (url, username, password).
* <p>
* The name of the ebean database will be dbName set for the container.
* <p>
* This builder will have ddlGenerate set to true and ddlRun set to true. Alternatively,
* set runMigrations(true) to run database migrations on startup.
*/
io.ebean.DatabaseBuilder builder();

/**
* Return a java.sql.DataSource builder for the underlying database (url, username, password).
*/
io.ebean.datasource.DataSourceBuilder dataSourceBuilder();

/**
* Return a java.sql.DataSource builder for the underlying database (url, username, password).
*/
io.ebean.datasource.DataSourceBuilder extraDataSourceBuilder();

/**
* Return an ebean Database builder for the EXTRA database (extraUrl, extraDbUser, extraDbPassword).
*/
io.ebean.DatabaseBuilder extraDatabaseBuilder();
}
4 changes: 4 additions & 0 deletions src/main/java/io/ebean/test/containers/InternalConfigDb.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,12 @@ interface InternalConfigDb extends InternalConfig {

String getExtraDbUser();

String getExtraDbUserWithDefault();

String getExtraDbPassword();

String getExtraDbPasswordWithDefault();

String getExtraDbExtensions();

String getExtraDbInitSqlFile();
Expand Down
19 changes: 18 additions & 1 deletion src/main/java/io/ebean/test/containers/PostgresContainer.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package io.ebean.test.containers;

/**
* Commands for controlling a postgres docker container.
* Run a postgres docker container for testing purposes.
* <pre>{@code
*
* PostgresContainer container = PostgresContainer.builder("15")
* .dbName("my_test")
* .build()
* .start();
*
* }</pre>
*/
public class PostgresContainer extends BasePostgresContainer<PostgresContainer> {

Expand All @@ -13,6 +21,15 @@ public PostgresContainer start() {

/**
* Create a builder for PostgresContainer.
*
* <pre>{@code
*
* PostgresContainer container = PostgresContainer.builder("15")
* .dbName("my_test")
* .build()
* .start();
*
* }</pre>
*/
public static Builder builder(String version) {
return new Builder(version);
Expand Down
25 changes: 20 additions & 5 deletions src/test/java/io/ebean/test/containers/PostgisContainerTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.ebean.test.containers;

import io.ebean.Database;
import io.ebean.datasource.DataSourcePool;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
Expand All @@ -11,7 +13,7 @@
class PostgisContainerTest {

@Test
void extraDb() {
void extraDb() throws java.sql.SQLException {
PostgisContainer container = PostgisContainer.builder("15")
.port(0)
.extraDb("myextra")
Expand All @@ -26,6 +28,19 @@ void extraDb() {
String jdbcUrl = container.config().jdbcUrl();
assertThat(jdbcUrl).contains(":" + containerConfig.port());
runSomeSql(container);

DataSourcePool dataSource = container.ebean().dataSourceBuilder().build();
try (Connection connection = dataSource.getConnection()) {
exeSql(connection, "insert into test_junk2 (acol) values (44)");
}
dataSource.shutdown();

Database ebean = container.ebean().builder().build();
ebean.sqlUpdate("insert into test_junk2 (acol) values (?)")
.setParameter(45)
.execute();

ebean.shutdown();
}

private void runSomeSql(PostgisContainer container) {
Expand All @@ -39,9 +54,9 @@ private void runSomeSql(PostgisContainer container) {
}
}

private void exeSql(Connection connection, String sql) throws SQLException {
PreparedStatement st = connection.prepareStatement(sql);
st.execute();
st.close();
private static void exeSql(Connection connection, String sql) throws SQLException {
try (PreparedStatement st = connection.prepareStatement(sql)) {
st.execute();
}
}
}
32 changes: 29 additions & 3 deletions src/test/java/io/ebean/test/containers/PostgresContainerTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.ebean.test.containers;

import io.avaje.applog.AppLog;
import io.ebean.Database;
import io.ebean.datasource.DataSourcePool;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
Expand Down Expand Up @@ -60,8 +62,10 @@ void randomPort() {
@Test
void defaultPort() {
PostgresContainer container = PostgresContainer.builder("15")
.dbName("my_test")
.extensions("hstore")
.build();
.build()
.start();

container.startMaybe();
runSomeSql(container);
Expand Down Expand Up @@ -141,8 +145,30 @@ void start() throws SQLException, InterruptedException {
exeSql(connection, "drop table if exists test_doesnotexist");
}

final String url = container.jdbcUrl();
assertEquals(url, "jdbc:postgresql://localhost:9828/main_db");
assertEquals("jdbc:postgresql://localhost:9828/main_db", container.jdbcUrl());

Database ebean = container.ebean().builder().build();
ebean.sqlUpdate("insert into foo_main (mcol) values (?)")
.setParameter(2)
.execute();

Database extraEbean = container.ebean().extraDatabaseBuilder().build();
extraEbean.sqlUpdate("insert into foo_extra (acol) values (?)")
.setParameter(2)
.execute();

DataSourcePool dataSource = container.ebean().dataSourceBuilder().build();
try (Connection connection = dataSource.getConnection()) {
exeSql(connection, "insert into foo_main (mcol) values (1)");
}
dataSource.shutdown();

DataSourcePool extraDataSource = container.ebean().extraDataSourceBuilder().build();
try (Connection connection = extraDataSource.getConnection()) {
exeSql(connection, "insert into foo_extra (acol) values (1)");
}
extraDataSource.shutdown();

container.stopRemove();
log.log(INFO, "start() finished");
}
Expand Down