diff --git a/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java b/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java index 4fc8f9c06..f1110b00a 100644 --- a/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java +++ b/core/src/test/java/google/registry/model/registry/RegistryLockDaoTest.java @@ -19,7 +19,8 @@ import static com.google.common.truth.Truth.assertThat; import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import static google.registry.testing.JUnitBackports.assertThrows; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.schema.domain.RegistryLock; import google.registry.schema.domain.RegistryLock.Action; import google.registry.testing.AppEngineRule; @@ -37,8 +38,8 @@ public final class RegistryLockDaoTest { @Rule public final AppEngineRule appEngine = AppEngineRule.builder().withDatastore().build(); @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().build(); + public final JpaIntegrationTestRule jpaRule = + new JpaTestRules.Builder().buildIntegrationTestRule(); @Test public void testSaveAndLoad_success() { @@ -64,13 +65,13 @@ public final class RegistryLockDaoTest { public void testSaveTwiceAndLoad_returnsLatest() { RegistryLock lock = createLock(); jpaTm().transact(() -> RegistryLockDao.save(lock)); - jpaTmRule.getTxnClock().advanceOneMilli(); + jpaRule.getTxnClock().advanceOneMilli(); jpaTm() .transact( () -> { RegistryLock updatedLock = RegistryLockDao.getByVerificationCode(lock.getVerificationCode()); - updatedLock.setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()); + updatedLock.setCompletionTimestamp(jpaRule.getTxnClock().nowUtc()); RegistryLockDao.save(updatedLock); }); jpaTm() @@ -79,16 +80,16 @@ public final class RegistryLockDaoTest { RegistryLock fromDatabase = RegistryLockDao.getByVerificationCode(lock.getVerificationCode()); assertThat(fromDatabase.getCompletionTimestamp().get()) - .isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + .isEqualTo(jpaRule.getTxnClock().nowUtc()); }); } @Test public void testUpdateLock_usingSamePrimaryKey() { RegistryLock lock = RegistryLockDao.save(createLock()); - jpaTmRule.getTxnClock().advanceOneMilli(); + jpaRule.getTxnClock().advanceOneMilli(); RegistryLock updatedLock = - lock.asBuilder().setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()).build(); + lock.asBuilder().setCompletionTimestamp(jpaRule.getTxnClock().nowUtc()).build(); jpaTm().transact(() -> RegistryLockDao.save(updatedLock)); jpaTm() .transact( @@ -96,7 +97,7 @@ public final class RegistryLockDaoTest { RegistryLock fromDatabase = RegistryLockDao.getByVerificationCode(lock.getVerificationCode()); assertThat(fromDatabase.getCompletionTimestamp()) - .isEqualTo(Optional.of(jpaTmRule.getTxnClock().nowUtc())); + .isEqualTo(Optional.of(jpaRule.getTxnClock().nowUtc())); }); } @@ -123,10 +124,10 @@ public final class RegistryLockDaoTest { @Test public void testLoad_byRepoId() { RegistryLock completedLock = - createLock().asBuilder().setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()).build(); + createLock().asBuilder().setCompletionTimestamp(jpaRule.getTxnClock().nowUtc()).build(); RegistryLockDao.save(completedLock); - jpaTmRule.getTxnClock().advanceOneMilli(); + jpaRule.getTxnClock().advanceOneMilli(); RegistryLock inProgressLock = createLock(); RegistryLockDao.save(inProgressLock); diff --git a/core/src/test/java/google/registry/model/transaction/JpaTestRules.java b/core/src/test/java/google/registry/model/transaction/JpaTestRules.java new file mode 100644 index 000000000..d94e76aed --- /dev/null +++ b/core/src/test/java/google/registry/model/transaction/JpaTestRules.java @@ -0,0 +1,109 @@ +// 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. + +package google.registry.model.transaction; + +import static com.google.common.base.Preconditions.checkState; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Holds specialized JUnit rules that start a test database server and provide {@link + * JpaTransactionManager} instances. + */ +public class JpaTestRules { + private static final String GOLDEN_SCHEMA_SQL_PATH = "sql/schema/nomulus.golden.sql"; + + /** + * Junit rule for integration tests with JPA framework, when the underlying database is populated + * with the Nomulus Cloud SQL schema. + * + *

Test classes that instantiate this class should be included in {@link + * google.registry.schema.integration.SqlIntegrationTestSuite}. This enforced by {@link + * google.registry.schema.integration.SqlIntegrationMembershipTest}. + */ + public static class JpaIntegrationTestRule extends JpaTransactionManagerRule { + + private JpaIntegrationTestRule( + ImmutableList extraEntityClasses, ImmutableMap userProperties) { + super(Optional.of(GOLDEN_SCHEMA_SQL_PATH), extraEntityClasses, userProperties); + } + } + + /** + * Junit rule for unit tests with JPA framework, when the underlying database is populated by the + * optional init script. + */ + public static class JpaUnitTestRule extends JpaTransactionManagerRule { + + private JpaUnitTestRule( + Optional initScriptPath, + ImmutableList extraEntityClasses, + ImmutableMap userProperties) { + super(initScriptPath, extraEntityClasses, userProperties); + } + } + + /** Builder of test rules that provide {@link JpaTransactionManager}. */ + public static class Builder { + private String initScript; + private List extraEntityClasses = new ArrayList(); + private Map userProperties = new HashMap(); + + /** + * Sets the SQL script to be used to initialize the database. If not set, + * sql/schema/nomulus.golden.sql will be used. + * + *

The {@code initScript} is only accepted when building {@link JpaUnitTestRule}. + */ + public Builder withInitScript(String initScript) { + this.initScript = initScript; + return this; + } + + /** Adds annotated class(es) to the known entities for the database. */ + public Builder withEntityClass(Class... classes) { + this.extraEntityClasses.addAll(ImmutableSet.copyOf(classes)); + return this; + } + + /** Adds the specified property to those used to initialize the transaction manager. */ + public Builder withProperty(String name, String value) { + this.userProperties.put(name, value); + return this; + } + + /** Builds a {@link JpaIntegrationTestRule} instance. */ + public JpaIntegrationTestRule buildIntegrationTestRule() { + checkState(initScript == null, "JpaNomulusIntegrationTestRule does not accept initScript"); + return new JpaIntegrationTestRule( + ImmutableList.copyOf(extraEntityClasses), ImmutableMap.copyOf(userProperties)); + } + + /** Builds a {@link JpaUnitTestRule} instance. */ + public JpaUnitTestRule buildUnitTestRule() { + return new JpaUnitTestRule( + Optional.ofNullable(initScript), + ImmutableList.copyOf(extraEntityClasses), + ImmutableMap.copyOf(userProperties)); + } + } +} diff --git a/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerImplTest.java b/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerImplTest.java index 4e60b9d69..618f3b192 100644 --- a/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerImplTest.java +++ b/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerImplTest.java @@ -19,6 +19,7 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import static google.registry.testing.JUnitBackports.assertThrows; import static google.registry.testing.TestDataHelper.fileClassPath; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import google.registry.testing.FakeClock; import java.math.BigInteger; import javax.persistence.EntityManager; @@ -32,10 +33,10 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class JpaTransactionManagerImplTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder() .withInitScript(fileClassPath(getClass(), "test_schema.sql")) - .build(); + .buildUnitTestRule(); @Test public void inTransaction_returnsCorrespondingResult() { @@ -53,7 +54,7 @@ public class JpaTransactionManagerImplTest { @Test public void getTransactionTime_throwsExceptionWhenNotInTransaction() { - FakeClock txnClock = jpaTmRule.getTxnClock(); + FakeClock txnClock = jpaRule.getTxnClock(); txnClock.advanceOneMilli(); assertThrows(PersistenceException.class, () -> jpaTm().getTransactionTime()); jpaTm().transact(() -> assertThat(jpaTm().getTransactionTime()).isEqualTo(txnClock.nowUtc())); diff --git a/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRule.java b/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRule.java index 7fa1ffe41..a9f0837ff 100644 --- a/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRule.java +++ b/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRule.java @@ -21,9 +21,9 @@ 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.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.io.Resources; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.persistence.HibernateSchemaExporter; import google.registry.persistence.NomulusPostgreSql; import google.registry.persistence.PersistenceModule; @@ -39,10 +39,8 @@ import java.sql.Driver; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.Optional; import java.util.Properties; import javax.persistence.EntityManagerFactory; import org.hibernate.cfg.Environment; @@ -54,15 +52,16 @@ import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.containers.PostgreSQLContainer; /** - * JUnit Rule to provision {@link JpaTransactionManagerImpl} backed by {@link PostgreSQLContainer}. + * Base class of JUnit Rules to provision {@link JpaTransactionManagerImpl} backed by {@link + * PostgreSQLContainer}. This class is not for direct use. Use specialized subclasses, {@link + * JpaIntegrationTestRule} or {@link JpaTestRules.JpaUnitTestRule} as befits the use case. * *

This rule also replaces the {@link JpaTransactionManagerImpl} provided by {@link * TransactionManagerFactory} with the {@link JpaTransactionManagerImpl} generated by the rule * itself, so that all SQL queries will be sent to the database instance created by {@link * PostgreSQLContainer} to achieve test purpose. */ -public class JpaTransactionManagerRule extends ExternalResource { - private static final String GOLDEN_SCHEMA_SQL_PATH = "sql/schema/nomulus.golden.sql"; +abstract class JpaTransactionManagerRule extends ExternalResource { private static final String DB_CLEANUP_SQL_PATH = "google/registry/model/transaction/cleanup_database.sql"; private static final String MANAGEMENT_DB_NAME = "management"; @@ -70,7 +69,7 @@ public class JpaTransactionManagerRule extends ExternalResource { private final DateTime now = DateTime.now(UTC); private final FakeClock clock = new FakeClock(now); - private final String initScriptPath; + private final Optional initScriptPath; private final ImmutableList extraEntityClasses; private final ImmutableMap userProperties; @@ -84,8 +83,8 @@ public class JpaTransactionManagerRule extends ExternalResource { private EntityManagerFactory emf; private JpaTransactionManager cachedTm; - private JpaTransactionManagerRule( - String initScriptPath, + protected JpaTransactionManagerRule( + Optional initScriptPath, ImmutableList extraEntityClasses, ImmutableMap userProperties) { this.initScriptPath = initScriptPath; @@ -105,7 +104,7 @@ public class JpaTransactionManagerRule extends ExternalResource { @Override public void before() throws Exception { executeSql(MANAGEMENT_DB_NAME, readSqlInClassPath(DB_CLEANUP_SQL_PATH)); - executeSql(POSTGRES_DB_NAME, readSqlInClassPath(initScriptPath)); + initScriptPath.ifPresent(path -> executeSql(POSTGRES_DB_NAME, readSqlInClassPath(path))); if (!extraEntityClasses.isEmpty()) { File tempSqlFile = File.createTempFile("tempSqlFile", ".sql"); tempSqlFile.deleteOnExit(); @@ -232,42 +231,4 @@ public class JpaTransactionManagerRule extends ExternalResource { return clock; } - /** Builder for {@link JpaTransactionManagerRule}. */ - public static class Builder { - private String initScript; - private List extraEntityClasses = new ArrayList(); - private Map userProperties = new HashMap(); - - /** - * Sets the SQL script to be used to initialize the database. If not set, - * sql/schema/nomulus.golden.sql will be used. - */ - public Builder withInitScript(String initScript) { - this.initScript = initScript; - return this; - } - - /** Adds annotated class(es) to the known entities for the database. */ - public Builder withEntityClass(Class... classes) { - this.extraEntityClasses.addAll(ImmutableSet.copyOf(classes)); - return this; - } - - /** Adds the specified property to those used to initialize the transaction manager. */ - public Builder withProperty(String name, String value) { - this.userProperties.put(name, value); - return this; - } - - /** Builds a {@link JpaTransactionManagerRule} instance. */ - public JpaTransactionManagerRule build() { - if (initScript == null) { - initScript = GOLDEN_SCHEMA_SQL_PATH; - } - return new JpaTransactionManagerRule( - initScript, - ImmutableList.copyOf(extraEntityClasses), - ImmutableMap.copyOf(userProperties)); - } - } } diff --git a/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRuleTest.java b/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRuleTest.java index 5ca719707..acc0a17df 100644 --- a/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRuleTest.java +++ b/core/src/test/java/google/registry/model/transaction/JpaTransactionManagerRuleTest.java @@ -19,6 +19,8 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import static google.registry.testing.JUnitBackports.assertThrows; import google.registry.model.ImmutableObject; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; +import google.registry.schema.tmch.ClaimsList; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; @@ -28,15 +30,15 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -/** JUnit test for {@link JpaTransactionManagerRule} */ +/** JUnit test for {@link JpaTransactionManagerRule}, with {@link JpaUnitTestRule} as proxy. */ @RunWith(JUnit4.class) public class JpaTransactionManagerRuleTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() - .withEntityClass(TestEntity.class) - .build(); + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder() + .withEntityClass(ClaimsList.class, TestEntity.class) + .buildUnitTestRule(); @Test public void verifiesRuleWorks() { diff --git a/core/src/test/java/google/registry/persistence/BloomFilterConverterTest.java b/core/src/test/java/google/registry/persistence/BloomFilterConverterTest.java index 1fa904734..9ef2e9b58 100644 --- a/core/src/test/java/google/registry/persistence/BloomFilterConverterTest.java +++ b/core/src/test/java/google/registry/persistence/BloomFilterConverterTest.java @@ -21,7 +21,8 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import com.google.common.collect.ImmutableSet; import com.google.common.hash.BloomFilter; import google.registry.model.ImmutableObject; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import javax.persistence.Entity; import javax.persistence.Id; import org.junit.Rule; @@ -34,10 +35,8 @@ import org.junit.runners.JUnit4; public class BloomFilterConverterTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() - .withEntityClass(TestEntity.class) - .build(); + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder().withEntityClass(TestEntity.class).buildUnitTestRule(); @Test public void roundTripConversion_returnsSameBloomFilter() { diff --git a/core/src/test/java/google/registry/persistence/CreateAutoTimestampConverterTest.java b/core/src/test/java/google/registry/persistence/CreateAutoTimestampConverterTest.java index 96801e6c0..16a9b5225 100644 --- a/core/src/test/java/google/registry/persistence/CreateAutoTimestampConverterTest.java +++ b/core/src/test/java/google/registry/persistence/CreateAutoTimestampConverterTest.java @@ -18,7 +18,8 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import google.registry.model.CreateAutoTimestamp; import google.registry.model.ImmutableObject; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import javax.persistence.Entity; import javax.persistence.Id; import org.joda.time.DateTime; @@ -32,10 +33,8 @@ import org.junit.runners.JUnit4; public class CreateAutoTimestampConverterTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() - .withEntityClass(TestEntity.class) - .build(); + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder().withEntityClass(TestEntity.class).buildUnitTestRule(); @Test public void testTypeConversion() { @@ -57,7 +56,7 @@ public class CreateAutoTimestampConverterTest { TestEntity result = jpaTm().transact(() -> jpaTm().getEntityManager().find(TestEntity.class, "autoinit")); - assertThat(result.cat.getTimestamp()).isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + assertThat(result.cat.getTimestamp()).isEqualTo(jpaRule.getTxnClock().nowUtc()); } @Entity(name = "TestEntity") // Override entity name to avoid the nested class reference. diff --git a/core/src/test/java/google/registry/persistence/CurrencyUnitConverterTest.java b/core/src/test/java/google/registry/persistence/CurrencyUnitConverterTest.java index 18d455628..6f2351064 100644 --- a/core/src/test/java/google/registry/persistence/CurrencyUnitConverterTest.java +++ b/core/src/test/java/google/registry/persistence/CurrencyUnitConverterTest.java @@ -18,7 +18,8 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import static google.registry.testing.JUnitBackports.assertThrows; import google.registry.model.ImmutableObject; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.PersistenceException; @@ -33,10 +34,8 @@ import org.junit.runners.JUnit4; public class CurrencyUnitConverterTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() - .withEntityClass(TestEntity.class) - .build(); + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder().withEntityClass(TestEntity.class).buildUnitTestRule(); @Test public void roundTripConversion() { diff --git a/core/src/test/java/google/registry/persistence/DateTimeConverterTest.java b/core/src/test/java/google/registry/persistence/DateTimeConverterTest.java index 09df43797..ca3087286 100644 --- a/core/src/test/java/google/registry/persistence/DateTimeConverterTest.java +++ b/core/src/test/java/google/registry/persistence/DateTimeConverterTest.java @@ -18,7 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import google.registry.model.ImmutableObject; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import java.sql.Timestamp; import javax.persistence.Entity; import javax.persistence.Id; @@ -34,8 +35,8 @@ import org.junit.runners.JUnit4; public class DateTimeConverterTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().withEntityClass(TestEntity.class).build(); + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder().withEntityClass(TestEntity.class).buildUnitTestRule(); private final DateTimeConverter converter = new DateTimeConverter(); diff --git a/core/src/test/java/google/registry/persistence/JodaMoneyConverterTest.java b/core/src/test/java/google/registry/persistence/JodaMoneyConverterTest.java index 0f606c0ad..4e6f50adc 100644 --- a/core/src/test/java/google/registry/persistence/JodaMoneyConverterTest.java +++ b/core/src/test/java/google/registry/persistence/JodaMoneyConverterTest.java @@ -18,7 +18,8 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import com.google.common.collect.ImmutableMap; import google.registry.model.ImmutableObject; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; @@ -63,11 +64,11 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class JodaMoneyConverterTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder() .withEntityClass(TestEntity.class, ComplexTestEntity.class) .withProperty(Environment.HBM2DDL_AUTO, "update") - .build(); + .buildUnitTestRule(); @Test public void roundTripConversion() { diff --git a/core/src/test/java/google/registry/persistence/UpdateAutoTimestampConverterTest.java b/core/src/test/java/google/registry/persistence/UpdateAutoTimestampConverterTest.java index f241cfccc..6e7e2996f 100644 --- a/core/src/test/java/google/registry/persistence/UpdateAutoTimestampConverterTest.java +++ b/core/src/test/java/google/registry/persistence/UpdateAutoTimestampConverterTest.java @@ -18,7 +18,8 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import google.registry.model.ImmutableObject; import google.registry.model.UpdateAutoTimestamp; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import javax.persistence.Entity; import javax.persistence.Id; import org.junit.Rule; @@ -31,10 +32,8 @@ import org.junit.runners.JUnit4; public class UpdateAutoTimestampConverterTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() - .withEntityClass(TestEntity.class) - .build(); + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder().withEntityClass(TestEntity.class).buildUnitTestRule(); @Test public void testTypeConversion() { @@ -46,7 +45,7 @@ public class UpdateAutoTimestampConverterTest { jpaTm().transact(() -> jpaTm().getEntityManager().find(TestEntity.class, "myinst")); assertThat(result.name).isEqualTo("myinst"); - assertThat(result.uat.getTimestamp()).isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + assertThat(result.uat.getTimestamp()).isEqualTo(jpaRule.getTxnClock().nowUtc()); } @Test @@ -58,7 +57,7 @@ public class UpdateAutoTimestampConverterTest { TestEntity result1 = jpaTm().transact(() -> jpaTm().getEntityManager().find(TestEntity.class, "myinst1")); - jpaTmRule.getTxnClock().advanceOneMilli(); + jpaRule.getTxnClock().advanceOneMilli(); TestEntity ent2 = new TestEntity("myinst2", result1.uat); @@ -68,7 +67,7 @@ public class UpdateAutoTimestampConverterTest { jpaTm().transact(() -> jpaTm().getEntityManager().find(TestEntity.class, "myinst2")); assertThat(result1.uat.getTimestamp()).isNotEqualTo(result2.uat.getTimestamp()); - assertThat(result2.uat.getTimestamp()).isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + assertThat(result2.uat.getTimestamp()).isEqualTo(jpaRule.getTxnClock().nowUtc()); } @Entity(name = "TestEntity") // Override entity name to avoid the nested class reference. diff --git a/core/src/test/java/google/registry/persistence/ZonedDateTimeConverterTest.java b/core/src/test/java/google/registry/persistence/ZonedDateTimeConverterTest.java index a9b823d2c..0a35b0910 100644 --- a/core/src/test/java/google/registry/persistence/ZonedDateTimeConverterTest.java +++ b/core/src/test/java/google/registry/persistence/ZonedDateTimeConverterTest.java @@ -18,7 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import google.registry.model.ImmutableObject; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaUnitTestRule; import java.sql.Timestamp; import java.time.Instant; import java.time.ZonedDateTime; @@ -34,10 +35,8 @@ import org.junit.runners.JUnit4; public class ZonedDateTimeConverterTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder() - .withEntityClass(TestEntity.class) - .build(); + public final JpaUnitTestRule jpaRule = + new JpaTestRules.Builder().withEntityClass(TestEntity.class).buildUnitTestRule(); private final ZonedDateTimeConverter converter = new ZonedDateTimeConverter(); diff --git a/core/src/test/java/google/registry/schema/cursor/CursorDaoTest.java b/core/src/test/java/google/registry/schema/cursor/CursorDaoTest.java index d76174ca2..dd9bfafa7 100644 --- a/core/src/test/java/google/registry/schema/cursor/CursorDaoTest.java +++ b/core/src/test/java/google/registry/schema/cursor/CursorDaoTest.java @@ -17,7 +17,8 @@ package google.registry.schema.cursor; import static com.google.common.truth.Truth.assertThat; import google.registry.model.common.Cursor.CursorType; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.testing.FakeClock; import java.util.List; import org.junit.Rule; @@ -32,8 +33,8 @@ public class CursorDaoTest { private FakeClock fakeClock = new FakeClock(); @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().build(); + public final JpaIntegrationTestRule jpaRule = + new JpaTestRules.Builder().buildIntegrationTestRule(); @Test public void save_worksSuccessfullyOnNewCursor() { diff --git a/core/src/test/java/google/registry/schema/integration/SqlIntegrationMembershipTest.java b/core/src/test/java/google/registry/schema/integration/SqlIntegrationMembershipTest.java index 9785137c4..30bf2bcb2 100644 --- a/core/src/test/java/google/registry/schema/integration/SqlIntegrationMembershipTest.java +++ b/core/src/test/java/google/registry/schema/integration/SqlIntegrationMembershipTest.java @@ -19,7 +19,7 @@ import static com.google.common.truth.Truth.assertWithMessage; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import io.github.classgraph.ClassGraph; import io.github.classgraph.ScanResult; import java.lang.reflect.Field; @@ -35,7 +35,7 @@ import org.junit.runners.Suite.SuiteClasses; * system property as a comma-separated string. * *

A test is deemed dependent on the SQL schema iff it has a field with type {@link - * JpaTransactionManagerRule}. + * JpaIntegrationTestRule}. */ // TODO(weiminyu): consider generating a TestSuite class instead. @RunWith(JUnit4.class) @@ -74,7 +74,7 @@ public class SqlIntegrationMembershipTest { for (Class clazz = testClass; clazz != null; clazz = clazz.getSuperclass()) { if (Stream.of(clazz.getDeclaredFields()) .map(Field::getType) - .anyMatch(JpaTransactionManagerRule.class::equals)) { + .anyMatch(JpaIntegrationTestRule.class::equals)) { return true; } } diff --git a/core/src/test/java/google/registry/schema/integration/SqlIntegrationTestSuite.java b/core/src/test/java/google/registry/schema/integration/SqlIntegrationTestSuite.java index 9f08300a9..f8ec97b08 100644 --- a/core/src/test/java/google/registry/schema/integration/SqlIntegrationTestSuite.java +++ b/core/src/test/java/google/registry/schema/integration/SqlIntegrationTestSuite.java @@ -15,15 +15,7 @@ package google.registry.schema.integration; import google.registry.model.registry.RegistryLockDaoTest; -import google.registry.model.transaction.JpaTransactionManagerImplTest; -import google.registry.model.transaction.JpaTransactionManagerRuleTest; -import google.registry.persistence.BloomFilterConverterTest; -import google.registry.persistence.CreateAutoTimestampConverterTest; -import google.registry.persistence.CurrencyUnitConverterTest; -import google.registry.persistence.DateTimeConverterTest; -import google.registry.persistence.JodaMoneyConverterTest; -import google.registry.persistence.UpdateAutoTimestampConverterTest; -import google.registry.persistence.ZonedDateTimeConverterTest; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.schema.cursor.CursorDaoTest; import google.registry.schema.tld.PremiumListDaoTest; import google.registry.schema.tld.ReservedListDaoTest; @@ -39,30 +31,20 @@ import org.junit.runners.Suite.SuiteClasses; * Groups all tests that may depends on Cloud SQL schema. They will be run for server-schema * compatibility check. * - *

Schema dependency is approximated by the use of {@link - * google.registry.model.transaction.JpaTransactionManagerRule}. + *

Schema dependency is approximated by the use of {@link JpaIntegrationTestRule}. * * @see SqlIntegrationMembershipTest */ // TODO(weiminyu): refactor JpaTransactionManagerRule to eliminate false positives. @RunWith(Suite.class) @SuiteClasses({ - BloomFilterConverterTest.class, ClaimsListDaoTest.class, - CreateAutoTimestampConverterTest.class, CreateReservedListCommandTest.class, - CurrencyUnitConverterTest.class, CursorDaoTest.class, - DateTimeConverterTest.class, - JodaMoneyConverterTest.class, - JpaTransactionManagerImplTest.class, - JpaTransactionManagerRuleTest.class, PremiumListDaoTest.class, RegistryLockDaoTest.class, RegistryLockGetActionTest.class, ReservedListDaoTest.class, - UpdateAutoTimestampConverterTest.class, - UpdateReservedListCommandTest.class, - ZonedDateTimeConverterTest.class + UpdateReservedListCommandTest.class }) public class SqlIntegrationTestSuite {} diff --git a/core/src/test/java/google/registry/schema/tld/PremiumListDaoTest.java b/core/src/test/java/google/registry/schema/tld/PremiumListDaoTest.java index 9b7f8e6df..a14d5c2af 100644 --- a/core/src/test/java/google/registry/schema/tld/PremiumListDaoTest.java +++ b/core/src/test/java/google/registry/schema/tld/PremiumListDaoTest.java @@ -28,7 +28,8 @@ import static org.joda.money.CurrencyUnit.USD; import com.google.common.collect.ImmutableMap; import com.googlecode.objectify.Key; import google.registry.model.registry.Registry; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.testing.AppEngineRule; import java.math.BigDecimal; import java.util.List; @@ -44,8 +45,8 @@ import org.junit.runners.JUnit4; public class PremiumListDaoTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().build(); + public final JpaIntegrationTestRule jpaRule = + new JpaTestRules.Builder().buildIntegrationTestRule(); @Rule public final AppEngineRule appEngine = AppEngineRule.builder().withDatastore().build(); @@ -74,7 +75,7 @@ public class PremiumListDaoTest { .getSingleResult(); assertThat(persistedList.getLabelsToPrices()).containsExactlyEntriesIn(TEST_PRICES); assertThat(persistedList.getCreationTimestamp()) - .isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + .isEqualTo(jpaRule.getTxnClock().nowUtc()); }); } @@ -100,7 +101,7 @@ public class PremiumListDaoTest { assertThat(persistedLists.get(1).getLabelsToPrices()) .containsExactlyEntriesIn(TEST_PRICES); assertThat(persistedLists.get(1).getCreationTimestamp()) - .isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + .isEqualTo(jpaRule.getTxnClock().nowUtc()); }); } diff --git a/core/src/test/java/google/registry/schema/tld/ReservedListDaoTest.java b/core/src/test/java/google/registry/schema/tld/ReservedListDaoTest.java index e72547b9c..ea31e7e68 100644 --- a/core/src/test/java/google/registry/schema/tld/ReservedListDaoTest.java +++ b/core/src/test/java/google/registry/schema/tld/ReservedListDaoTest.java @@ -19,7 +19,8 @@ import static google.registry.model.transaction.TransactionManagerFactory.jpaTm; import com.google.common.collect.ImmutableMap; import google.registry.model.registry.label.ReservationType; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.schema.tld.ReservedList.ReservedEntry; import org.junit.Rule; import org.junit.Test; @@ -30,8 +31,8 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ReservedListDaoTest { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().build(); + public final JpaIntegrationTestRule jpaRule = + new JpaTestRules.Builder().buildIntegrationTestRule(); private static final ImmutableMap TEST_RESERVATIONS = ImmutableMap.of( @@ -56,7 +57,7 @@ public class ReservedListDaoTest { assertThat(persistedList.getLabelsToReservations()) .containsExactlyEntriesIn(TEST_RESERVATIONS); assertThat(persistedList.getCreationTimestamp()) - .isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + .isEqualTo(jpaRule.getTxnClock().nowUtc()); }); } diff --git a/core/src/test/java/google/registry/schema/tmch/ClaimsListDaoTest.java b/core/src/test/java/google/registry/schema/tmch/ClaimsListDaoTest.java index c538001e6..2509ba356 100644 --- a/core/src/test/java/google/registry/schema/tmch/ClaimsListDaoTest.java +++ b/core/src/test/java/google/registry/schema/tmch/ClaimsListDaoTest.java @@ -18,7 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import static google.registry.testing.JUnitBackports.assertThrows; import com.google.common.collect.ImmutableMap; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.testing.FakeClock; import javax.persistence.NoResultException; import org.junit.Rule; @@ -33,8 +34,8 @@ public class ClaimsListDaoTest { private FakeClock fakeClock = new FakeClock(); @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().build(); + public final JpaIntegrationTestRule jpaRule = + new JpaTestRules.Builder().buildIntegrationTestRule(); @Test public void trySave_insertsClaimsListSuccessfully() { @@ -43,8 +44,7 @@ public class ClaimsListDaoTest { ClaimsListDao.trySave(claimsList); ClaimsList insertedClaimsList = ClaimsListDao.getCurrent(); assertClaimsListEquals(claimsList, insertedClaimsList); - assertThat(insertedClaimsList.getCreationTimestamp()) - .isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + assertThat(insertedClaimsList.getCreationTimestamp()).isEqualTo(jpaRule.getTxnClock().nowUtc()); } @Test diff --git a/core/src/test/java/google/registry/server/RegistryTestServerMain.java b/core/src/test/java/google/registry/server/RegistryTestServerMain.java index f31038811..7f9ebe086 100644 --- a/core/src/test/java/google/registry/server/RegistryTestServerMain.java +++ b/core/src/test/java/google/registry/server/RegistryTestServerMain.java @@ -19,7 +19,7 @@ import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; import com.google.common.collect.ImmutableList; import com.google.common.net.HostAndPort; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; import google.registry.testing.AppEngineRule; import google.registry.testing.UserInfo; import google.registry.tools.params.HostAndPortParameter; @@ -170,8 +170,8 @@ public final class RegistryTestServerMain { .apply(runner, Description.EMPTY); System.out.printf("%sLoading SQL fixtures and AppEngineRule...%s\n", BLUE, RESET); - new JpaTransactionManagerRule.Builder() - .build() + new JpaTestRules.Builder() + .buildIntegrationTestRule() .apply(withAppEngine, Description.EMPTY) .evaluate(); } diff --git a/core/src/test/java/google/registry/tools/CreateOrUpdateReservedListCommandTestCase.java b/core/src/test/java/google/registry/tools/CreateOrUpdateReservedListCommandTestCase.java index a03af7daf..60264f1b0 100644 --- a/core/src/test/java/google/registry/tools/CreateOrUpdateReservedListCommandTestCase.java +++ b/core/src/test/java/google/registry/tools/CreateOrUpdateReservedListCommandTestCase.java @@ -25,7 +25,8 @@ import com.beust.jcommander.ParameterException; import com.google.common.io.Files; import com.google.common.truth.Truth8; import google.registry.model.registry.label.ReservedList; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.schema.tld.ReservedList.ReservedEntry; import google.registry.schema.tld.ReservedListDao; import java.io.File; @@ -45,8 +46,8 @@ public abstract class CreateOrUpdateReservedListCommandTestCase extends CommandTestCase { @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().build(); + public final JpaIntegrationTestRule jpaRule = + new JpaTestRules.Builder().buildIntegrationTestRule(); String reservedTermsPath; String invalidReservedTermsPath; @@ -111,7 +112,7 @@ public abstract class CreateOrUpdateReservedListCommandTestCase getCloudSqlReservedList("xn--q9jyb4c_common-reserved"); assertThat(persistedList.getName()).isEqualTo("xn--q9jyb4c_common-reserved"); assertThat(persistedList.getShouldPublish()).isTrue(); - assertThat(persistedList.getCreationTimestamp()).isEqualTo(jpaTmRule.getTxnClock().nowUtc()); + assertThat(persistedList.getCreationTimestamp()).isEqualTo(jpaRule.getTxnClock().nowUtc()); assertThat(persistedList.getLabelsToReservations()) .containsExactly( "baddies", diff --git a/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java b/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java index 796e075d4..cba95c920 100644 --- a/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java +++ b/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java @@ -30,7 +30,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSetMultimap; import com.google.gson.Gson; import google.registry.model.registry.RegistryLockDao; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.request.Action.Method; import google.registry.request.auth.AuthLevel; import google.registry.request.auth.AuthResult; @@ -61,8 +62,8 @@ public final class RegistryLockGetActionTest { @Rule public final AppEngineRule appEngineRule = AppEngineRule.builder().withDatastore().build(); @Rule - public final JpaTransactionManagerRule jpaTmRule = - new JpaTransactionManagerRule.Builder().build(); + public final JpaIntegrationTestRule jpaRule = + new JpaTestRules.Builder().buildIntegrationTestRule(); @Rule public final MockitoRule mocks = MockitoJUnit.rule(); @@ -75,7 +76,7 @@ public final class RegistryLockGetActionTest { @Before public void setup() { - jpaTmRule.getTxnClock().setTo(DateTime.parse("2000-06-08T22:00:00.0Z")); + jpaRule.getTxnClock().setTo(DateTime.parse("2000-06-08T22:00:00.0Z")); authResult = AuthResult.create(AuthLevel.USER, UserAuthInfo.create(user, false)); accessor = AuthenticatedRegistrarAccessor.createForTesting( @@ -97,9 +98,9 @@ public final class RegistryLockGetActionTest { .setAction(Action.LOCK) .setVerificationCode(UUID.randomUUID().toString()) .setRegistrarPocId("johndoe@theregistrar.com") - .setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()) + .setCompletionTimestamp(jpaRule.getTxnClock().nowUtc()) .build(); - jpaTmRule.getTxnClock().advanceOneMilli(); + jpaRule.getTxnClock().advanceOneMilli(); RegistryLock adminLock = new RegistryLock.Builder() .setRepoId("repoId") @@ -108,7 +109,7 @@ public final class RegistryLockGetActionTest { .setAction(Action.LOCK) .setVerificationCode(UUID.randomUUID().toString()) .isSuperuser(true) - .setCompletionTimestamp(jpaTmRule.getTxnClock().nowUtc()) + .setCompletionTimestamp(jpaRule.getTxnClock().nowUtc()) .build(); RegistryLock incompleteLock = new RegistryLock.Builder() diff --git a/core/src/test/java/google/registry/webdriver/TestServerRule.java b/core/src/test/java/google/registry/webdriver/TestServerRule.java index 9c33319c6..b66bdaaf8 100644 --- a/core/src/test/java/google/registry/webdriver/TestServerRule.java +++ b/core/src/test/java/google/registry/webdriver/TestServerRule.java @@ -23,7 +23,8 @@ import static google.registry.util.NetworkUtils.pickUnusedPort; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.net.HostAndPort; -import google.registry.model.transaction.JpaTransactionManagerRule; +import google.registry.model.transaction.JpaTestRules; +import google.registry.model.transaction.JpaTestRules.JpaIntegrationTestRule; import google.registry.request.auth.AuthenticatedRegistrarAccessor; import google.registry.server.Fixture; import google.registry.server.Route; @@ -54,7 +55,7 @@ public final class TestServerRule extends ExternalResource { private final ImmutableList fixtures; private final AppEngineRule appEngineRule; - private final JpaTransactionManagerRule jpaTransactionManagerRule; + private final JpaIntegrationTestRule jpaTransactionManagerRule; private final BlockingQueue> jobs = new LinkedBlockingDeque<>(); private final ImmutableMap runfiles; private final ImmutableList routes; @@ -82,7 +83,7 @@ public final class TestServerRule extends ExternalResource { .withTaskQueue() .withUserService(UserInfo.createAdmin(email, THE_REGISTRAR_GAE_USER_ID)) .build(); - this.jpaTransactionManagerRule = new JpaTransactionManagerRule.Builder().build(); + this.jpaTransactionManagerRule = new JpaTestRules.Builder().buildIntegrationTestRule(); } @Override