From 0b520f3885fa56b4d0cd977b177f9ed44aab3c19 Mon Sep 17 00:00:00 2001 From: gbrodman Date: Wed, 7 Apr 2021 19:20:13 -0400 Subject: [PATCH] Partially convert EppResourceUtils to SQL (#1060) * Partially convert EppResourceUtils to SQL Some of the rest will depend on b/184578521. The primary conversion in this PR is the change in NameserverLookupByIpCommand as that is the only place where the removed EppResourceUtils method was called. We also convert to DualDatabaseTest the tests of the callers of NLBIC. and use a CriteriaQueryBuilder in the foreign key index SQL lookup (allowing us to avoid the String.format call). --- .../registry/model/EppResourceUtils.java | 24 ---- .../registry/model/index/ForeignKeyIndex.java | 31 +++-- .../whois/NameserverLookupByIpCommand.java | 32 ++++- .../testing/FullFieldsTestEntityHelper.java | 29 ++--- .../registry/whois/WhoisActionTest.java | 80 ++++++------ .../whois/WhoisCommandFactoryTest.java | 18 +-- .../registry/whois/WhoisHttpActionTest.java | 50 ++++---- .../registry/whois/WhoisReaderTest.java | 120 +++++++++--------- 8 files changed, 194 insertions(+), 190 deletions(-) diff --git a/core/src/main/java/google/registry/model/EppResourceUtils.java b/core/src/main/java/google/registry/model/EppResourceUtils.java index 4eeeb5553..fc58cd0e3 100644 --- a/core/src/main/java/google/registry/model/EppResourceUtils.java +++ b/core/src/main/java/google/registry/model/EppResourceUtils.java @@ -194,30 +194,6 @@ public final class EppResourceUtils { return ForeignKeyIndex.load(clazz, uniqueIds, now).keySet(); } - /** - * Loads resources that match some filter and that have {@link EppResource#deletionTime} that is - * not before "now". - * - *

This is an eventually consistent query. - * - * @param clazz the resource type to load - * @param now the logical time of the check - * @param filterDefinition the filter to apply when loading resources - * @param filterValue the acceptable value for the filter - */ - public static Iterable queryNotDeleted( - Class clazz, DateTime now, String filterDefinition, Object filterValue) { - return ofy() - .load() - .type(clazz) - .filter(filterDefinition, filterValue) - .filter("deletionTime >", now.toDate()) - .list() - .stream() - .map(EppResourceUtils.transformAtTime(now)) - .collect(toImmutableSet()); - } - /** * Returns a Function that transforms an EppResource to the given DateTime, suitable for use with * Iterables.transform() over a collection of EppResources. diff --git a/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java b/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java index 0629381e9..4d1d1200d 100644 --- a/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java +++ b/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java @@ -48,8 +48,10 @@ import google.registry.model.contact.ContactResource; import google.registry.model.domain.DomainBase; import google.registry.model.host.HostResource; import google.registry.persistence.VKey; +import google.registry.persistence.transaction.CriteriaQueryBuilder; import google.registry.schema.replay.DatastoreOnlyEntity; import google.registry.util.NonFinalForTesting; +import java.util.Collection; import java.util.Comparator; import java.util.Map; import java.util.Optional; @@ -193,7 +195,7 @@ public abstract class ForeignKeyIndex extends BackupGroup * has been soft deleted. */ public static ImmutableMap> load( - Class clazz, Iterable foreignKeys, final DateTime now) { + Class clazz, Collection foreignKeys, final DateTime now) { return loadIndexesFromStore(clazz, foreignKeys).entrySet().stream() .filter(e -> now.isBefore(e.getValue().getDeletionTime())) .collect(entriesToImmutableMap()); @@ -207,7 +209,7 @@ public abstract class ForeignKeyIndex extends BackupGroup */ private static ImmutableMap> loadIndexesFromStore( - Class clazz, Iterable foreignKeys) { + Class clazz, Collection foreignKeys) { if (tm().isOfy()) { return ImmutableMap.copyOf( tm().doTransactionless(() -> ofy().load().type(mapToFkiClass(clazz)).ids(foreignKeys))); @@ -215,19 +217,16 @@ public abstract class ForeignKeyIndex extends BackupGroup String property = RESOURCE_CLASS_TO_FKI_PROPERTY.get(clazz); ImmutableList> indexes = tm().transact( - () -> { - String entityName = - jpaTm().getEntityManager().getMetamodel().entity(clazz).getName(); - return jpaTm() - .query( - String.format( - "FROM %s WHERE %s IN :propertyValue", entityName, property), - clazz) - .setParameter("propertyValue", foreignKeys) - .getResultStream() - .map(e -> ForeignKeyIndex.create(e, e.getDeletionTime())) - .collect(toImmutableList()); - }); + () -> + jpaTm() + .getEntityManager() + .createQuery( + CriteriaQueryBuilder.create(clazz) + .whereFieldIsIn(property, foreignKeys) + .build()) + .getResultStream() + .map(e -> ForeignKeyIndex.create(e, e.getDeletionTime())) + .collect(toImmutableList())); // We need to find and return the entities with the maximum deletionTime for each foreign key. return Multimaps.index(indexes, ForeignKeyIndex::getForeignKey).asMap().entrySet().stream() .map( @@ -318,7 +317,7 @@ public abstract class ForeignKeyIndex extends BackupGroup * reasons, and are OK with the trade-offs in loss of transactional consistency. */ public static ImmutableMap> loadCached( - Class clazz, Iterable foreignKeys, final DateTime now) { + Class clazz, Collection foreignKeys, final DateTime now) { if (!RegistryConfig.isEppResourceCachingEnabled()) { return tm().doTransactionless(() -> load(clazz, foreignKeys, now)); } diff --git a/core/src/main/java/google/registry/whois/NameserverLookupByIpCommand.java b/core/src/main/java/google/registry/whois/NameserverLookupByIpCommand.java index b973e9bf2..163312409 100644 --- a/core/src/main/java/google/registry/whois/NameserverLookupByIpCommand.java +++ b/core/src/main/java/google/registry/whois/NameserverLookupByIpCommand.java @@ -16,12 +16,15 @@ package google.registry.whois; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.ImmutableList.toImmutableList; -import static google.registry.model.EppResourceUtils.queryNotDeleted; +import static google.registry.model.ofy.ObjectifyService.ofy; +import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm; +import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.Streams; +import com.google.common.net.InetAddresses; import com.google.common.net.InternetDomainName; import google.registry.model.host.HostResource; import google.registry.model.registry.Registries; @@ -46,9 +49,34 @@ final class NameserverLookupByIpCommand implements WhoisCommand { } @Override + @SuppressWarnings("unchecked") public WhoisResponse executeQuery(DateTime now) throws WhoisException { + Iterable hostsFromDb; + if (tm().isOfy()) { + hostsFromDb = + ofy() + .load() + .type(HostResource.class) + .filter("inetAddresses", ipAddress) + .filter("deletionTime >", now.toDate()); + } else { + hostsFromDb = + jpaTm() + .transact( + () -> + // We cannot query @Convert-ed fields in HQL so we must use native Postgres + jpaTm() + .getEntityManager() + .createNativeQuery( + "SELECT * From \"Host\" WHERE :address = ANY(inet_addresses) AND " + + "deletion_time > CAST(:now AS timestamptz)", + HostResource.class) + .setParameter("address", InetAddresses.toAddrString(ipAddress)) + .setParameter("now", now.toString()) + .getResultList()); + } ImmutableList hosts = - Streams.stream(queryNotDeleted(HostResource.class, now, "inetAddresses", ipAddress)) + Streams.stream(hostsFromDb) .filter( host -> Registries.findTldForName(InternetDomainName.from(host.getHostName())) diff --git a/core/src/test/java/google/registry/testing/FullFieldsTestEntityHelper.java b/core/src/test/java/google/registry/testing/FullFieldsTestEntityHelper.java index 6987f21a9..0588cd6e8 100644 --- a/core/src/test/java/google/registry/testing/FullFieldsTestEntityHelper.java +++ b/core/src/test/java/google/registry/testing/FullFieldsTestEntityHelper.java @@ -218,27 +218,20 @@ public final class FullFieldsTestEntityHelper { .setCountryCode("US") .build()); } - ContactResource.Builder builder = new ContactResource.Builder() - .setContactId(id) - .setRepoId(generateNewContactHostRoid()) - .setCreationTimeForTest(DateTime.parse("2000-10-08T00:45:00Z")) - .setInternationalizedPostalInfo(postalBuilder.build()) - .setVoiceNumber( - new ContactPhoneNumber.Builder() - .setPhoneNumber("+1.2126660420") - .build()) - .setFaxNumber( - new ContactPhoneNumber.Builder() - .setPhoneNumber("+1.2126660420") - .build()); + ContactResource.Builder builder = + new ContactResource.Builder() + .setContactId(id) + .setRepoId(generateNewContactHostRoid()) + .setCreationTimeForTest(DateTime.parse("2000-10-08T00:45:00Z")) + .setInternationalizedPostalInfo(postalBuilder.build()) + .setVoiceNumber( + new ContactPhoneNumber.Builder().setPhoneNumber("+1.2126660420").build()) + .setFaxNumber(new ContactPhoneNumber.Builder().setPhoneNumber("+1.2126660420").build()); if (email != null) { builder.setEmailAddress(email); } - if (registrar != null) { - builder - .setCreationClientId(registrar.getClientId()) - .setPersistedCurrentSponsorClientId(registrar.getClientId()); - } + String registrarId = registrar == null ? "TheRegistrar" : registrar.getClientId(); + builder.setCreationClientId(registrarId).setPersistedCurrentSponsorClientId(registrarId); if (deletionTime != null) { builder.setDeletionTime(deletionTime); } diff --git a/core/src/test/java/google/registry/whois/WhoisActionTest.java b/core/src/test/java/google/registry/whois/WhoisActionTest.java index ea57f6783..676a8e60e 100644 --- a/core/src/test/java/google/registry/whois/WhoisActionTest.java +++ b/core/src/test/java/google/registry/whois/WhoisActionTest.java @@ -54,11 +54,13 @@ import google.registry.model.registry.Registry; import google.registry.model.transfer.DomainTransferData; import google.registry.model.transfer.TransferStatus; import google.registry.testing.AppEngineExtension; +import google.registry.testing.DualDatabaseTest; import google.registry.testing.FakeClock; import google.registry.testing.FakeResponse; import google.registry.testing.FakeSleeper; import google.registry.testing.InjectExtension; import google.registry.testing.TestCacheExtension; +import google.registry.testing.TestOfyAndSql; import google.registry.util.Retrier; import google.registry.whois.WhoisMetrics.WhoisMetric; import java.io.IOException; @@ -68,15 +70,17 @@ import org.joda.time.DateTime; import org.joda.time.Duration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; /** Unit tests for {@link WhoisAction}. */ +@DualDatabaseTest public class WhoisActionTest { + private final FakeClock clock = new FakeClock(DateTime.parse("2009-06-29T20:13:00Z")); + @RegisterExtension public final AppEngineExtension appEngine = - AppEngineExtension.builder().withDatastoreAndCloudSql().build(); + AppEngineExtension.builder().withDatastoreAndCloudSql().withClock(clock).build(); @RegisterExtension public final InjectExtension inject = new InjectExtension(); @@ -88,7 +92,6 @@ public class WhoisActionTest { .build(); private final FakeResponse response = new FakeResponse(); - private FakeClock clock; private WhoisAction newWhoisAction(String input) { WhoisAction whoisAction = new WhoisAction(); @@ -107,12 +110,11 @@ public class WhoisActionTest { @BeforeEach void setUp() { - clock = new FakeClock(DateTime.parse("2009-06-29T20:13:00Z")); createTlds("lol", "xn--q9jyb4c", "1.test"); inject.setStaticField(Ofy.class, "clock", clock); } - @Test + @TestOfyAndSql void testRun_badRequest_stillSends200() { newWhoisAction("\r\n").run(); assertThat(response.getStatus()).isEqualTo(200); @@ -130,7 +132,7 @@ public class WhoisActionTest { registrar); } - @Test + @TestOfyAndSql void testRun_domainQuery_works() { Registrar registrar = persistResource(makeRegistrar("evilregistrar", "Yes Virginia", ACTIVE)); @@ -141,7 +143,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_domain.txt")); } - @Test + @TestOfyAndSql void testRun_domainQuery_usesCache() { Registrar registrar = persistResource(makeRegistrar("evilregistrar", "Yes Virginia", ACTIVE)); @@ -169,7 +171,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_domain.txt")); } - @Test + @TestOfyAndSql void testRun_domainAfterTransfer_hasUpdatedEppTimeAndClientId() { Registrar registrar = persistResource(makeRegistrar("TheRegistrar", "Yes Virginia", ACTIVE)); persistResource( @@ -194,7 +196,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_transferred_domain.txt")); } - @Test + @TestOfyAndSql void testRun_idnDomain_works() { Registrar registrar = persistResource(makeRegistrar( "evilregistrar", "Yes Virginia", ACTIVE)); @@ -212,7 +214,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_idn_punycode.txt")); } - @Test + @TestOfyAndSql void testRun_punycodeDomain_works() { Registrar registrar = persistResource(makeRegistrar( "evilregistrar", "Yes Virginia", ACTIVE)); @@ -230,14 +232,14 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_idn_punycode.txt")); } - @Test + @TestOfyAndSql void testRun_domainNotFound_returns200OkAndPlainTextResponse() { newWhoisAction("domain cat.lol\r\n").run(); assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_domain_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_domainNotFound_usesCache() { // Populate the cache with the nonexistence of this domain. assertThat(loadByForeignKeyCached(DomainBase.class, "cat.lol", clock.nowUtc())).isEmpty(); @@ -250,7 +252,7 @@ public class WhoisActionTest { // todo (b/27378695): reenable or delete this test @Disabled - @Test + @TestOfyAndSql void testRun_domainInTestTld_isConsideredNotFound() { persistResource(Registry.get("lol").asBuilder().setTldType(Registry.TldType.TEST).build()); Registrar registrar = persistResource(makeRegistrar( @@ -269,7 +271,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_domain_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_domainFlaggedAsDeletedInDatastore_isConsideredNotFound() { Registrar registrar; persistResource(makeDomainBase("cat.lol", @@ -294,7 +296,7 @@ public class WhoisActionTest { * Create a deleted domain and an active domain with the same label, and make sure only the active * one is returned. */ - @Test + @TestOfyAndSql void testRun_domainDeletedThenRecreated_isFound() { Registrar registrar; DomainBase domain1 = persistResource(makeDomainBase("cat.lol", @@ -330,7 +332,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("ns1.google.lol"); } - @Test + @TestOfyAndSql void testRun_nameserverQuery_works() { persistResource(loadRegistrar("TheRegistrar").asBuilder().setUrl("http://my.fake.url").build()); persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); @@ -339,7 +341,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_nameserver.txt")); } - @Test + @TestOfyAndSql void testRun_ipv6_displaysInCollapsedReadableFormat() { persistResource(makeHostResource("ns1.cat.lol", "bad:f00d:cafe::15:beef")); newWhoisAction("nameserver ns1.cat.lol\r\n").run(); @@ -350,7 +352,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).doesNotContain("bad:f00d:cafe:0:0:0:15:beef"); } - @Test + @TestOfyAndSql void testRun_idnNameserver_works() { persistResource(makeHostResource("ns1.cat.みんな", "1.2.3.4")); newWhoisAction("nameserver ns1.cat.みんな\r\n").run(); @@ -359,7 +361,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("1.2.3.4"); } - @Test + @TestOfyAndSql void testRun_nameserver_usesCache() { persistResource(makeHostResource("ns1.cat.xn--q9jyb4c", "1.2.3.4")); // Populate the cache. @@ -376,7 +378,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("1.2.3.4"); } - @Test + @TestOfyAndSql void testRun_punycodeNameserver_works() { persistResource(makeHostResource("ns1.cat.みんな", "1.2.3.4")); newWhoisAction("nameserver ns1.cat.xn--q9jyb4c\r\n").run(); @@ -385,7 +387,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("1.2.3.4"); } - @Test + @TestOfyAndSql void testRun_nameserverNotFound_returns200AndText() { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); newWhoisAction("nameserver ns1.cat.lulz\r\n").run(); @@ -393,7 +395,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_nameserver_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_nameserverFlaggedAsDeletedInDatastore_doesntGetLeaked() { persistResource( makeHostResource("ns1.cat.lol", "1.2.3.4").asBuilder() @@ -403,7 +405,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_nameserver_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_ipNameserverLookup_works() { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); newWhoisAction("nameserver 1.2.3.4").run(); @@ -411,7 +413,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("ns1.cat.lol"); } - @Test + @TestOfyAndSql void testRun_ipMapsToMultipleNameservers_theyAllGetReturned() { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); persistResource(makeHostResource("ns2.cat.lol", "1.2.3.4")); @@ -421,7 +423,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("ns2.cat.lol"); } - @Test + @TestOfyAndSql void testRun_ipMapsToMultipleNameserverInDifferentTlds_showsThemAll() { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); persistResource( @@ -432,14 +434,14 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("ns1.cat.xn--q9jyb4c"); } - @Test + @TestOfyAndSql void testRun_ipNameserverEntityDoesNotExist_returns200NotFound() { newWhoisAction("nameserver feed:a:bee::acab\r\n").run(); assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_ip_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_ipMapsToNameserverUnderNonAuthoritativeTld_notFound() { assertThat(getTlds()).doesNotContain("com"); persistResource(makeHostResource("ns1.google.com", "1.2.3.4")); @@ -448,7 +450,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_ip_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_nameserverUnderNonAuthoritativeTld_notFound() { assertThat(getTlds()).doesNotContain("com"); persistResource(makeHostResource("ns1.google.com", "1.2.3.4")); @@ -459,7 +461,7 @@ public class WhoisActionTest { // todo (b/27378695): reenable or delete this test @Disabled - @Test + @TestOfyAndSql void testRun_nameserverInTestTld_notFound() { persistResource(Registry.get("lol").asBuilder().setTldType(Registry.TldType.TEST).build()); persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); @@ -468,7 +470,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_nameserver_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_registrarLookup_works() { Registrar registrar = persistResource( makeRegistrar("example", "Example Registrar, Inc.", ACTIVE)); @@ -479,7 +481,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_registrar.txt")); } - @Test + @TestOfyAndSql void testRun_pdtRegistrarLookup_works() { Registrar registrar = persistResource( @@ -495,7 +497,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_registrar.txt")); } - @Test + @TestOfyAndSql void testRun_registrarLookupInPendingState_returnsNotFound() { Registrar registrar = persistResource( makeRegistrar("example", "Example Registrar, Inc.", Registrar.State.PENDING)); @@ -505,7 +507,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_registrar_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_registrarLookupWithTestType_returnsNotFound() { Registrar registrar = persistResource( makeRegistrar("example", "Example Registrar, Inc.", ACTIVE) @@ -519,7 +521,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_registrar_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_multilevelDomain_isNotConsideredAHostname() { Registrar registrar = persistResource(makeRegistrar("example", "Example Registrar", ACTIVE)); @@ -537,7 +539,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("Domain Name: cat.1.test\r\n"); } - @Test + @TestOfyAndSql void testRun_hostnameWithMultilevelTld_isStillConsideredHostname() { persistResource(makeHostResource("ns1.cat.1.test", "1.2.3.4")); newWhoisAction("nameserver ns1.cat.1.test\r\n").run(); @@ -546,7 +548,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).contains("1.2.3.4"); } - @Test + @TestOfyAndSql void testRun_metricsLoggedForSuccessfulCommand() { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); persistResource(makeHostResource("ns2.cat.lol", "1.2.3.4")); @@ -562,7 +564,7 @@ public class WhoisActionTest { verify(action.whoisMetrics).recordWhoisMetric(eq(expected)); } - @Test + @TestOfyAndSql void testRun_metricsLoggedForUnsuccessfulCommand() { WhoisAction action = newWhoisAction("domain cat.lol\r\n"); action.whoisMetrics = mock(WhoisMetrics.class); @@ -576,7 +578,7 @@ public class WhoisActionTest { verify(action.whoisMetrics).recordWhoisMetric(eq(expected)); } - @Test + @TestOfyAndSql void testRun_metricsLoggedForInternalServerError() throws Exception { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); WhoisAction action = newWhoisAction("ns1.cat.lol"); @@ -595,7 +597,7 @@ public class WhoisActionTest { assertThat(response.getPayload()).isEqualTo("Internal Server Error"); } - @Test + @TestOfyAndSql void testRun_retryOnTransientFailure() throws Exception { persistResource(loadRegistrar("TheRegistrar").asBuilder().setUrl("http://my.fake.url").build()); persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); diff --git a/core/src/test/java/google/registry/whois/WhoisCommandFactoryTest.java b/core/src/test/java/google/registry/whois/WhoisCommandFactoryTest.java index 6405f0ca0..d67f30e7d 100644 --- a/core/src/test/java/google/registry/whois/WhoisCommandFactoryTest.java +++ b/core/src/test/java/google/registry/whois/WhoisCommandFactoryTest.java @@ -29,15 +29,17 @@ import google.registry.model.domain.DomainBase; import google.registry.model.host.HostResource; import google.registry.model.registrar.Registrar; import google.registry.testing.AppEngineExtension; +import google.registry.testing.DualDatabaseTest; import google.registry.testing.FakeClock; import google.registry.testing.TestCacheExtension; +import google.registry.testing.TestOfyAndSql; import java.net.InetAddress; import org.joda.time.Duration; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +@DualDatabaseTest class WhoisCommandFactoryTest { FakeClock clock = new FakeClock(); @@ -90,7 +92,7 @@ class WhoisCommandFactoryTest { RegistryConfig.CONFIG_SETTINGS.get().caching.singletonCacheRefreshSeconds = 0; } - @Test + @TestOfyAndSql void testNonCached_NameserverLookupByHostCommand() throws Exception { WhoisResponse response = noncachedFactory @@ -114,7 +116,7 @@ class WhoisCommandFactoryTest { .contains("Registrar: OtherRegistrar name"); } - @Test + @TestOfyAndSql void testCached_NameserverLookupByHostCommand() throws Exception { WhoisResponse response = cachedFactory @@ -137,7 +139,7 @@ class WhoisCommandFactoryTest { .contains("Registrar: The Registrar"); } - @Test + @TestOfyAndSql void testNonCached_DomainLookupCommand() throws Exception { WhoisResponse response = noncachedFactory @@ -161,7 +163,7 @@ class WhoisCommandFactoryTest { .contains("Registrar: OtherRegistrar name"); } - @Test + @TestOfyAndSql void testCached_DomainLookupCommand() throws Exception { WhoisResponse response = cachedFactory @@ -185,7 +187,7 @@ class WhoisCommandFactoryTest { .contains("Registrar: The Registrar"); } - @Test + @TestOfyAndSql void testNonCached_RegistrarLookupCommand() throws Exception { WhoisResponse response = noncachedFactory.registrarLookup("OtherRegistrar").executeQuery(clock.nowUtc()); @@ -199,7 +201,7 @@ class WhoisCommandFactoryTest { .contains("Phone Number: +1.2345677890"); } - @Test + @TestOfyAndSql void testCached_RegistrarLookupCommand() throws Exception { WhoisResponse response = cachedFactory.registrarLookup("OtherRegistrar").executeQuery(clock.nowUtc()); @@ -213,7 +215,7 @@ class WhoisCommandFactoryTest { .contains("Phone Number: +1.2223334444"); } - @Test + @TestOfyAndSql void testNonCached_NameserverLookupByIpCommand() throws Exception { // Note that this lookup currently doesn't cache the hosts, so there's no point in testing the // "cached" case. This test is here so that it will fail if anyone adds caching. diff --git a/core/src/test/java/google/registry/whois/WhoisHttpActionTest.java b/core/src/test/java/google/registry/whois/WhoisHttpActionTest.java index 3fd0c1dfd..c0e9c52f0 100644 --- a/core/src/test/java/google/registry/whois/WhoisHttpActionTest.java +++ b/core/src/test/java/google/registry/whois/WhoisHttpActionTest.java @@ -41,9 +41,11 @@ import google.registry.model.ofy.Ofy; import google.registry.model.registrar.Registrar; import google.registry.model.registry.Registry; import google.registry.testing.AppEngineExtension; +import google.registry.testing.DualDatabaseTest; import google.registry.testing.FakeClock; import google.registry.testing.FakeResponse; import google.registry.testing.InjectExtension; +import google.registry.testing.TestOfyAndSql; import google.registry.whois.WhoisMetrics.WhoisMetric; import java.io.IOException; import java.io.Reader; @@ -51,7 +53,6 @@ import org.joda.time.DateTime; import org.joda.time.Duration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; /** @@ -60,6 +61,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; *

This class should be limited to testing the HTTP interface, as the bulk of the WHOIS testing * can be found in {@link WhoisActionTest}. */ +@DualDatabaseTest class WhoisHttpActionTest { @RegisterExtension @@ -92,7 +94,7 @@ class WhoisHttpActionTest { inject.setStaticField(Ofy.class, "clock", clock); } - @Test + @TestOfyAndSql void testRun_emptyQuery_returns400BadRequestWithPlainTextOutput() { newWhoisHttpAction("").run(); assertThat(response.getStatus()).isEqualTo(400); @@ -100,7 +102,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_no_command.txt")); } - @Test + @TestOfyAndSql void testRun_badUrlEncoding_returns400BadRequestWithPlainTextOutput() { newWhoisHttpAction("nic.%u307F%u3093%u306A").run(); assertThat(response.getStatus()).isEqualTo(400); @@ -108,7 +110,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_malformed_path.txt")); } - @Test + @TestOfyAndSql void testRun_domainNotFound_returns404StatusAndPlainTextResponse() { newWhoisHttpAction("/domain/cat.lol").run(); assertThat(response.getStatus()).isEqualTo(404); @@ -118,7 +120,7 @@ class WhoisHttpActionTest { // todo (b/27378695): reenable or delete this test @Disabled - @Test + @TestOfyAndSql void testRun_domainInTestTld_isConsideredNotFound() { persistResource(Registry.get("lol").asBuilder().setTldType(Registry.TldType.TEST).build()); Registrar registrar = persistResource(makeRegistrar( @@ -138,7 +140,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_domain_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_domainQueryIdn_works() { Registrar registrar = persistResource(makeRegistrar( "evilregistrar", "Yes Virginia", Registrar.State.ACTIVE)); @@ -156,7 +158,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_idn_utf8.txt")); } - @Test + @TestOfyAndSql void testRun_wickedLineFeedForgeryInDatastore_crlfSubstitutedWithSpace() { ContactResource trl = makeContactResource("5372808-TRL", "Eric Schmidt", "bog@cat.みんな"); trl = @@ -179,7 +181,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).contains("Galactic Empire"); } - @Test + @TestOfyAndSql void testRun_domainOnly_works() { persistResource(makeDomainBase( "cat.みんな", @@ -194,14 +196,14 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).contains("Domain Name: cat.みんな\r\n"); } - @Test + @TestOfyAndSql void testRun_hostnameOnly_works() { persistResource(makeHostResource("ns1.cat.みんな", "1.2.3.4")); newWhoisHttpAction("ns1.cat.みんな").run(); assertThat(response.getPayload()).contains("Server Name: ns1.cat.みんな\r\n"); } - @Test + @TestOfyAndSql void testRun_domainQueryPunycode_works() { Registrar registrar = persistResource(makeRegistrar( "evilregistrar", "Yes Virginia", Registrar.State.ACTIVE)); @@ -218,7 +220,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_idn_utf8.txt")); } - @Test + @TestOfyAndSql void testRun_nameserverQuery_works() { persistResource(loadRegistrar("TheRegistrar").asBuilder().setUrl("http://my.fake.url").build()); persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); @@ -228,14 +230,14 @@ class WhoisHttpActionTest { // todo (b/27378695): reenable or delete this test @Disabled - @Test + @TestOfyAndSql void testRun_nameserverQueryInTestTld_notFound() { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); newWhoisHttpAction("/nameserver/ns1.cat.lol").run(); assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_nameserver.txt")); } - @Test + @TestOfyAndSql void testRun_lastUpdateTimestamp_isPresentInResponse() { clock.setTo(DateTime.parse("2020-07-12T23:52:43Z")); persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); @@ -244,7 +246,7 @@ class WhoisHttpActionTest { .contains(">>> Last update of WHOIS database: 2020-07-12T23:52:43Z <<<"); } - @Test + @TestOfyAndSql void testRun_nameserverQueryIdn_works() { persistResource(makeHostResource("ns1.cat.みんな", "1.2.3.4")); newWhoisHttpAction("/nameserver/ns1.cat.みんな").run(); @@ -252,7 +254,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).contains("1.2.3.4"); } - @Test + @TestOfyAndSql void testRun_nameserverQueryPunycode_works() { persistResource(makeHostResource("ns1.cat.みんな", "1.2.3.4")); newWhoisHttpAction("/nameserver/ns1.cat.xn--q9jyb4c").run(); @@ -260,7 +262,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).contains("1.2.3.4"); } - @Test + @TestOfyAndSql void testRun_trailingSlashInPath_getsIgnored() { persistResource(makeHostResource("ns1.cat.みんな", "1.2.3.4")); newWhoisHttpAction("/nameserver/ns1.cat.xn--q9jyb4c/").run(); @@ -268,7 +270,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).contains("1.2.3.4"); } - @Test + @TestOfyAndSql void testRun_uppercaseDomain_ignoresCasing() { persistResource(makeDomainBase( "cat.lol", @@ -282,7 +284,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).contains("Domain Name: cat.lol\r\n"); } - @Test + @TestOfyAndSql void testRun_hairyPath_getsDecoded() { persistResource(makeDomainBase( "cat.lol", @@ -297,7 +299,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).contains("Domain Name: cat.lol\r\n"); } - @Test + @TestOfyAndSql void testRun_registrarLookup_works() { Registrar registrar = persistResource( makeRegistrar("example", "Example Registrar, Inc.", Registrar.State.ACTIVE)); @@ -308,7 +310,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_registrar.txt")); } - @Test + @TestOfyAndSql void testRun_registrarLookupInPendingState_returnsNotFound() { Registrar registrar = persistResource( makeRegistrar("example", "Example Registrar, Inc.", Registrar.State.PENDING)); @@ -318,7 +320,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_registrar_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_registrarLookupWithTestType_returnsNotFound() { Registrar registrar = persistResource( makeRegistrar("example", "Example Registrar, Inc.", Registrar.State.ACTIVE) @@ -329,7 +331,7 @@ class WhoisHttpActionTest { assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_registrar_not_found.txt")); } - @Test + @TestOfyAndSql void testRun_metricsLoggedForSuccessfulCommand() { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); WhoisHttpAction action = newWhoisHttpAction("/nameserver/ns1.cat.lol"); @@ -344,7 +346,7 @@ class WhoisHttpActionTest { verify(action.whoisMetrics).recordWhoisMetric(eq(expected)); } - @Test + @TestOfyAndSql void testRun_metricsLoggedForUnsuccessfulCommand() { WhoisHttpAction action = newWhoisHttpAction("nic.%u307F%u3093%u306A"); action.whoisMetrics = mock(WhoisMetrics.class); @@ -354,7 +356,7 @@ class WhoisHttpActionTest { verify(action.whoisMetrics).recordWhoisMetric(eq(expected)); } - @Test + @TestOfyAndSql void testRun_metricsLoggedForInternalServerError() throws Exception { persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")); WhoisHttpAction action = newWhoisHttpAction("ns1.cat.lol"); diff --git a/core/src/test/java/google/registry/whois/WhoisReaderTest.java b/core/src/test/java/google/registry/whois/WhoisReaderTest.java index cf212b7b9..a5c5b7296 100644 --- a/core/src/test/java/google/registry/whois/WhoisReaderTest.java +++ b/core/src/test/java/google/registry/whois/WhoisReaderTest.java @@ -22,14 +22,16 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.flogger.LoggerConfig; import com.google.common.testing.TestLogHandler; import google.registry.testing.AppEngineExtension; +import google.registry.testing.DualDatabaseTest; import google.registry.testing.FakeClock; +import google.registry.testing.TestOfyAndSql; import java.io.StringReader; import java.util.logging.Level; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; /** Unit tests for {@link WhoisReader}. */ +@DualDatabaseTest class WhoisReaderTest { @RegisterExtension @@ -83,245 +85,245 @@ class WhoisReaderTest { .isEqualTo("Example Registrar, Inc."); } - @Test + @TestOfyAndSql void testRegistrarLookupWithOneToken() throws Exception { assertThat(this.readCommand("Example").registrarName) .isEqualTo("Example"); } - @Test + @TestOfyAndSql void testDomainLookupWithoutCRLF() throws Exception { assertLoadsExampleTld("example.tld"); } - @Test + @TestOfyAndSql void testWhitespaceOnDomainLookupWithCommand() throws Exception { assertLoadsExampleTld(" \t domain \t \t example.tld \r\n"); } - @Test + @TestOfyAndSql void testDomainLookup() throws Exception { assertLoadsExampleTld("example.tld\r\n"); } - @Test + @TestOfyAndSql void testDomainLookupWithCommand() throws Exception { assertLoadsExampleTld("domain example.tld\r\n"); } - @Test + @TestOfyAndSql void testCaseInsensitiveDomainLookup() throws Exception { assertLoadsExampleTld("EXAMPLE.TLD\r\n"); } - @Test + @TestOfyAndSql void testCaseInsensitiveDomainLookupWithCommand() throws Exception { assertLoadsExampleTld("DOMAIN EXAMPLE.TLD\r\n"); } - @Test + @TestOfyAndSql void testIDNULabelDomainLookup() throws Exception { assertLoadsIDN("مثال.إختبار\r\n"); } - @Test + @TestOfyAndSql void testIDNULabelDomainLookupWithCommand() throws Exception { assertLoadsIDN("domain مثال.إختبار\r\n"); } - @Test + @TestOfyAndSql void testIDNALabelDomainLookupWithCommand() throws Exception { assertLoadsIDN("domain xn--mgbh0fb.xn--kgbechtv\r\n"); } - @Test + @TestOfyAndSql void testIDNALabelDomainLookup() throws Exception { assertLoadsIDN("xn--mgbh0fb.xn--kgbechtv\r\n"); } - @Test + @TestOfyAndSql void testTooManyArgsDomainLookup() { assertThrows(WhoisException.class, () -> readCommand("domain example.tld foo.bar")); } - @Test + @TestOfyAndSql void testTooFewArgsDomainLookup() { assertThrows(WhoisException.class, () -> readCommand("domain")); } - @Test + @TestOfyAndSql void testIllegalArgDomainLookup() { assertThrows(WhoisException.class, () -> readCommand("domain 1.1")); } - @Test + @TestOfyAndSql void testNameserverLookupWithoutCRLF() throws Exception { assertLoadsExampleNs("ns.example.tld"); } - @Test + @TestOfyAndSql void testWhitespaceOnNameserverLookupWithCommand() throws Exception { assertLoadsExampleNs(" \t nameserver \t \t ns.example.tld \r\n"); } - @Test + @TestOfyAndSql void testNameserverLookup() throws Exception { assertLoadsExampleNs("ns.example.tld\r\n"); } - @Test + @TestOfyAndSql void testDeepNameserverLookup() throws Exception { NameserverLookupByHostCommand command = readCommand("ns.foo.bar.baz.example.tld\r\n"); assertThat(command.domainOrHostName.toString()).isEqualTo("ns.foo.bar.baz.example.tld"); assertThat(command.domainOrHostName.toString()).isEqualTo("ns.foo.bar.baz.example.tld"); } - @Test + @TestOfyAndSql void testNameserverLookupWithCommand() throws Exception { assertLoadsExampleNs("nameserver ns.example.tld\r\n"); } - @Test + @TestOfyAndSql void testCaseInsensitiveNameserverLookup() throws Exception { assertLoadsExampleNs("NS.EXAMPLE.TLD\r\n"); } - @Test + @TestOfyAndSql void testCaseInsensitiveNameserverLookupWithCommand() throws Exception { assertLoadsExampleNs("NAMESERVER NS.EXAMPLE.TLD\r\n"); } - @Test + @TestOfyAndSql void testIDNULabelNameserverLookup() throws Exception { assertLoadsIDNNs("ns.مثال.إختبار\r\n"); } - @Test + @TestOfyAndSql void testIDNULabelNameserverLookupWithCommand() throws Exception { assertLoadsIDNNs("nameserver ns.مثال.إختبار\r\n"); } - @Test + @TestOfyAndSql void testIDNALabelNameserverLookupWithCommand() throws Exception { assertLoadsIDNNs("nameserver ns.xn--mgbh0fb.xn--kgbechtv\r\n"); } - @Test + @TestOfyAndSql void testIDNALabelNameserverLookup() throws Exception { assertLoadsIDNNs("ns.xn--mgbh0fb.xn--kgbechtv\r\n"); } - @Test + @TestOfyAndSql void testTooManyArgsNameserverLookup() { assertThrows(WhoisException.class, () -> readCommand("nameserver ns.example.tld foo.bar")); } - @Test + @TestOfyAndSql void testTooFewArgsNameserverLookup() { assertThrows(WhoisException.class, () -> readCommand("nameserver")); } - @Test + @TestOfyAndSql void testIllegalArgNameserverLookup() { assertThrows(WhoisException.class, () -> readCommand("nameserver 1.1")); } - @Test + @TestOfyAndSql void testRegistrarLookup() throws Exception { assertLoadsRegistrar("registrar Example Registrar, Inc."); } - @Test + @TestOfyAndSql void testRegistrarLookupCaseInsensitive() throws Exception { assertLoadsRegistrar("REGISTRAR Example Registrar, Inc."); } - @Test + @TestOfyAndSql void testRegistrarLookupWhitespace() throws Exception { assertLoadsRegistrar(" \t registrar \t \tExample Registrar, Inc. "); } - @Test + @TestOfyAndSql void testRegistrarLookupByDefault() throws Exception { assertLoadsRegistrar("Example Registrar, Inc."); } - @Test + @TestOfyAndSql void testRegistrarLookupOnTLD() throws Exception { assertThat(this.readCommand("com").registrarName).isEqualTo("com"); } - @Test + @TestOfyAndSql void testRegistrarLookupNoArgs() { assertThrows(WhoisException.class, () -> readCommand("registrar")); } - @Test + @TestOfyAndSql void testNameserverLookupByIp() throws Exception { assertNsLookup("43.34.12.213", "43.34.12.213"); } - @Test + @TestOfyAndSql void testNameserverLookupByIpv6() throws Exception { assertNsLookup("1080:0:0:0:8:800:200c:417a", "1080:0:0:0:8:800:200c:417a"); } - @Test + @TestOfyAndSql void testNameserverLookupByCompressedIpv6() throws Exception { assertNsLookup("1080::8:800:200c:417a", "1080:0:0:0:8:800:200c:417a"); } - @Test + @TestOfyAndSql void testNameserverLookupByNoncanonicalIpv6() throws Exception { assertNsLookup("1080:0:0:0:8:800:200C:417A", "1080:0:0:0:8:800:200c:417a"); } - @Test + @TestOfyAndSql void testNameserverLookupByBackwardsCompatibleIpv6() throws Exception { assertNsLookup("::FFFF:129.144.52.38", "129.144.52.38"); } - @Test + @TestOfyAndSql void testNameserverLookupByIpWithCommand() throws Exception { assertNsLookup("nameserver 43.34.12.213", "43.34.12.213"); } - @Test + @TestOfyAndSql void testNameserverLookupByIpv6WithCommand() throws Exception { assertNsLookup("nameserver 1080:0:0:0:8:800:200C:417a", "1080:0:0:0:8:800:200c:417a"); } - @Test + @TestOfyAndSql void testNameserverLookupByIpCaseInsenstive() throws Exception { assertNsLookup("NAMESERVER 43.34.12.213", "43.34.12.213"); } - @Test + @TestOfyAndSql void testNameserverLookupByIpWhitespace() throws Exception { assertNsLookup(" \t\t NAMESERVER \t 43.34.12.213 \r\n", "43.34.12.213"); } - @Test + @TestOfyAndSql void testNameserverLookupByIpTooManyArgs() { assertThrows(WhoisException.class, () -> readCommand("nameserver 43.34.12.213 43.34.12.213")); } - @Test + @TestOfyAndSql void testMultilevelDomainLookup() throws Exception { this.readCommand("example.1.test"); } - @Test + @TestOfyAndSql void testMultilevelNameserverLookup() throws Exception { this.readCommand("ns.example.1.test"); } - @Test + @TestOfyAndSql void testDeepMultilevelNameserverLookup() throws Exception { this.readCommand("ns.corp.example.1.test"); } - @Test + @TestOfyAndSql void testUnconfiguredTld() throws Exception { this.readCommand("example.test"); this.readCommand("1.example.test"); @@ -330,12 +332,12 @@ class WhoisReaderTest { this.readCommand("tld"); } - @Test + @TestOfyAndSql void testNoArgs() { assertThrows(WhoisException.class, () -> readCommand("")); } - @Test + @TestOfyAndSql void testLogsDomainLookupCommand() throws Exception { readCommand("domain example.tld"); assertAboutLogs() @@ -344,7 +346,7 @@ class WhoisReaderTest { Level.INFO, "Attempting domain lookup command using domain name example.tld"); } - @Test + @TestOfyAndSql void testLogsNameserverLookupCommandWithIpAddress() throws Exception { readCommand("nameserver 43.34.12.213"); assertAboutLogs() @@ -353,7 +355,7 @@ class WhoisReaderTest { Level.INFO, "Attempting nameserver lookup command using 43.34.12.213 as an IP address"); } - @Test + @TestOfyAndSql void testLogsNameserverLookupCommandWithHostname() throws Exception { readCommand("nameserver ns.example.tld"); assertAboutLogs() @@ -362,7 +364,7 @@ class WhoisReaderTest { Level.INFO, "Attempting nameserver lookup command using ns.example.tld as a hostname"); } - @Test + @TestOfyAndSql void testLogsRegistrarLookupCommand() throws Exception { readCommand("registrar Example Registrar, Inc."); assertAboutLogs() @@ -372,7 +374,7 @@ class WhoisReaderTest { "Attempting registrar lookup command using registrar Example Registrar, Inc."); } - @Test + @TestOfyAndSql void testLogsSingleArgumentNameserverLookupUsingIpAddress() throws Exception { readCommand("43.34.12.213"); assertAboutLogs() @@ -381,7 +383,7 @@ class WhoisReaderTest { Level.INFO, "Attempting nameserver lookup using 43.34.12.213 as an IP address"); } - @Test + @TestOfyAndSql void testLogsSingleArgumentRegistrarLookup() throws Exception { readCommand("test"); assertAboutLogs() @@ -390,7 +392,7 @@ class WhoisReaderTest { Level.INFO, "Attempting registrar lookup using test as a registrar"); } - @Test + @TestOfyAndSql void testLogsSingleArgumentDomainLookup() throws Exception { readCommand("example.tld"); assertAboutLogs() @@ -399,7 +401,7 @@ class WhoisReaderTest { Level.INFO, "Attempting domain lookup using example.tld as a domain name"); } - @Test + @TestOfyAndSql void testLogsSingleArgumentNameserverLookupUsingHostname() throws Exception { readCommand("ns.example.tld"); assertAboutLogs() @@ -408,7 +410,7 @@ class WhoisReaderTest { Level.INFO, "Attempting nameserver lookup using ns.example.tld as a hostname"); } - @Test + @TestOfyAndSql void testLogsMultipleArgumentsButNoParticularCommand() throws Exception { readCommand("Example Registrar, Inc."); assertAboutLogs()