mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 03:57:51 +02:00
Use a single database container for all tests (#313)
This commit is contained in:
parent
734f39005a
commit
d66b3b3d57
2 changed files with 73 additions and 16 deletions
|
@ -15,17 +15,24 @@
|
||||||
package google.registry.model.transaction;
|
package google.registry.model.transaction;
|
||||||
|
|
||||||
import static org.joda.time.DateTimeZone.UTC;
|
import static org.joda.time.DateTimeZone.UTC;
|
||||||
|
import static org.testcontainers.containers.PostgreSQLContainer.POSTGRESQL_PORT;
|
||||||
|
|
||||||
|
import com.google.common.base.Charsets;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.io.Resources;
|
||||||
import google.registry.persistence.PersistenceModule;
|
import google.registry.persistence.PersistenceModule;
|
||||||
import google.registry.testing.FakeClock;
|
import google.registry.testing.FakeClock;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.Driver;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor;
|
import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor;
|
||||||
|
@ -33,9 +40,6 @@ import org.hibernate.jpa.boot.internal.PersistenceXmlParser;
|
||||||
import org.hibernate.jpa.boot.spi.Bootstrap;
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.junit.rules.ExternalResource;
|
import org.junit.rules.ExternalResource;
|
||||||
import org.junit.rules.RuleChain;
|
|
||||||
import org.junit.runner.Description;
|
|
||||||
import org.junit.runners.model.Statement;
|
|
||||||
import org.testcontainers.containers.JdbcDatabaseContainer;
|
import org.testcontainers.containers.JdbcDatabaseContainer;
|
||||||
import org.testcontainers.containers.PostgreSQLContainer;
|
import org.testcontainers.containers.PostgreSQLContainer;
|
||||||
|
|
||||||
|
@ -49,37 +53,42 @@ import org.testcontainers.containers.PostgreSQLContainer;
|
||||||
*/
|
*/
|
||||||
public class JpaTransactionManagerRule extends ExternalResource {
|
public class JpaTransactionManagerRule extends ExternalResource {
|
||||||
private static final String SCHEMA_GOLDEN_SQL = "sql/schema/nomulus.golden.sql";
|
private static final String SCHEMA_GOLDEN_SQL = "sql/schema/nomulus.golden.sql";
|
||||||
|
private static final String DB_CLEANUP_SQL =
|
||||||
|
"google/registry/model/transaction/cleanup_database.sql";
|
||||||
|
private static final String MANAGEMENT_DB_NAME = "management";
|
||||||
|
private static final String POSTGRES_DB_NAME = "postgres";
|
||||||
|
|
||||||
private final DateTime now = DateTime.now(UTC);
|
private final DateTime now = DateTime.now(UTC);
|
||||||
private final FakeClock clock = new FakeClock(now);
|
private final FakeClock clock = new FakeClock(now);
|
||||||
private final String initScript;
|
private final String initScriptPath;
|
||||||
private final ImmutableList<Class> extraEntityClasses;
|
private final ImmutableList<Class> extraEntityClasses;
|
||||||
private final ImmutableMap userProperties;
|
private final ImmutableMap userProperties;
|
||||||
|
|
||||||
private JdbcDatabaseContainer database;
|
private static final JdbcDatabaseContainer database = create();
|
||||||
private EntityManagerFactory emf;
|
private EntityManagerFactory emf;
|
||||||
private JpaTransactionManager cachedTm;
|
private JpaTransactionManager cachedTm;
|
||||||
|
|
||||||
private JpaTransactionManagerRule(
|
private JpaTransactionManagerRule(
|
||||||
String initScript,
|
String initScriptPath,
|
||||||
ImmutableList<Class> extraEntityClasses,
|
ImmutableList<Class> extraEntityClasses,
|
||||||
ImmutableMap<String, String> userProperties) {
|
ImmutableMap<String, String> userProperties) {
|
||||||
this.initScript = initScript;
|
this.initScriptPath = initScriptPath;
|
||||||
this.extraEntityClasses = extraEntityClasses;
|
this.extraEntityClasses = extraEntityClasses;
|
||||||
this.userProperties = userProperties;
|
this.userProperties = userProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Wraps {@link JpaTransactionManagerRule} in a {@link PostgreSQLContainer}. */
|
private static JdbcDatabaseContainer create() {
|
||||||
@Override
|
PostgreSQLContainer container = new PostgreSQLContainer().withDatabaseName(MANAGEMENT_DB_NAME);
|
||||||
public Statement apply(Statement base, Description description) {
|
container.start();
|
||||||
database = new PostgreSQLContainer().withInitScript(initScript);
|
Runtime.getRuntime().addShutdownHook(new Thread(() -> container.close()));
|
||||||
return RuleChain.outerRule(database)
|
return container;
|
||||||
.around(JpaTransactionManagerRule.super::apply)
|
|
||||||
.apply(base, description);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void before() {
|
public void before() throws Exception {
|
||||||
|
executeSql(MANAGEMENT_DB_NAME, DB_CLEANUP_SQL);
|
||||||
|
executeSql(POSTGRES_DB_NAME, initScriptPath);
|
||||||
|
|
||||||
ImmutableMap properties = PersistenceModule.providesDefaultDatabaseConfigs();
|
ImmutableMap properties = PersistenceModule.providesDefaultDatabaseConfigs();
|
||||||
if (!userProperties.isEmpty()) {
|
if (!userProperties.isEmpty()) {
|
||||||
// If there are user properties, create a new properties object with these added.
|
// If there are user properties, create a new properties object with these added.
|
||||||
|
@ -90,7 +99,7 @@ public class JpaTransactionManagerRule extends ExternalResource {
|
||||||
|
|
||||||
emf =
|
emf =
|
||||||
createEntityManagerFactory(
|
createEntityManagerFactory(
|
||||||
database.getJdbcUrl(),
|
getJdbcUrlFor(POSTGRES_DB_NAME),
|
||||||
database.getUsername(),
|
database.getUsername(),
|
||||||
database.getPassword(),
|
database.getPassword(),
|
||||||
properties,
|
properties,
|
||||||
|
@ -109,6 +118,38 @@ public class JpaTransactionManagerRule extends ExternalResource {
|
||||||
cachedTm = null;
|
cachedTm = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void executeSql(String dbName, String sqlScriptPath) {
|
||||||
|
try (Connection conn = createConnection(dbName)) {
|
||||||
|
String sqlScript = Resources.toString(Resources.getResource(sqlScriptPath), Charsets.UTF_8);
|
||||||
|
conn.createStatement().execute(sqlScript);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getJdbcUrlFor(String dbName) {
|
||||||
|
// Disable Postgres driver use of java.util.logging to reduce noise at startup time
|
||||||
|
return "jdbc:postgresql://"
|
||||||
|
+ database.getContainerIpAddress()
|
||||||
|
+ ":"
|
||||||
|
+ database.getMappedPort(POSTGRESQL_PORT)
|
||||||
|
+ "/"
|
||||||
|
+ dbName
|
||||||
|
+ "?loggerLevel=OFF";
|
||||||
|
}
|
||||||
|
|
||||||
|
private Connection createConnection(String dbName) {
|
||||||
|
final Properties info = new Properties();
|
||||||
|
info.put("user", database.getUsername());
|
||||||
|
info.put("password", database.getPassword());
|
||||||
|
final Driver jdbcDriverInstance = database.getJdbcDriverInstance();
|
||||||
|
try {
|
||||||
|
return jdbcDriverInstance.connect(getJdbcUrlFor(dbName), info);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Constructs the {@link EntityManagerFactory} instance. */
|
/** Constructs the {@link EntityManagerFactory} instance. */
|
||||||
private static EntityManagerFactory createEntityManagerFactory(
|
private static EntityManagerFactory createEntityManagerFactory(
|
||||||
String jdbcUrl,
|
String jdbcUrl,
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
-- Copyright 2019 The Nomulus Authors. All Rights Reserved.
|
||||||
|
--
|
||||||
|
-- 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.
|
||||||
|
|
||||||
|
DROP DATABASE IF EXISTS postgres;
|
||||||
|
CREATE DATABASE postgres;
|
Loading…
Add table
Reference in a new issue