Java tutorial
// Copyright 2016 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.flows.domain; import static com.google.common.base.Preconditions.checkState; import static com.google.common.truth.Truth.assertThat; import static google.registry.model.EppResourceUtils.loadByForeignKey; import static google.registry.testing.DatastoreHelper.createBillingEventForTransfer; import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType; import static google.registry.testing.DatastoreHelper.persistActiveContact; import static google.registry.testing.DatastoreHelper.persistDomainWithPendingTransfer; import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.testing.DomainResourceSubject.assertAboutDomains; import static google.registry.testing.GenericEppResourceSubject.assertAboutEppResources; import static google.registry.util.DateTimeUtils.END_OF_TIME; import com.google.common.base.Ascii; import com.google.common.collect.ImmutableSet; import com.googlecode.objectify.Key; import google.registry.flows.Flow; import google.registry.flows.ResourceFlowTestCase; import google.registry.model.EppResource; import google.registry.model.billing.BillingEvent; import google.registry.model.billing.BillingEvent.Flag; import google.registry.model.billing.BillingEvent.Reason; import google.registry.model.contact.ContactResource; import google.registry.model.domain.DesignatedContact; import google.registry.model.domain.DesignatedContact.Type; import google.registry.model.domain.DomainAuthInfo; import google.registry.model.domain.DomainResource; import google.registry.model.domain.GracePeriod; import google.registry.model.domain.rgp.GracePeriodStatus; import google.registry.model.eppcommon.AuthInfo.PasswordAuth; import google.registry.model.eppcommon.StatusValue; import google.registry.model.host.HostResource; import google.registry.model.poll.PollMessage; import google.registry.model.registry.Registry; import google.registry.model.reporting.HistoryEntry; import google.registry.model.transfer.TransferData; import google.registry.model.transfer.TransferStatus; import google.registry.testing.AppEngineRule; import org.joda.time.DateTime; import org.joda.time.Duration; import org.junit.Before; /** * Base class for domain transfer flow unit tests. * * @param <F> the flow type * @param <R> the resource type */ public class DomainTransferFlowTestCase<F extends Flow, R extends EppResource> extends ResourceFlowTestCase<F, R> { // Transfer is requested on the 6th and expires on the 11th. // The "now" of this flow is on the 9th, 3 days in. protected static final DateTime TRANSFER_REQUEST_TIME = DateTime.parse("2000-06-06T22:00:00.0Z"); protected static final DateTime TRANSFER_EXPIRATION_TIME = TRANSFER_REQUEST_TIME .plus(Registry.DEFAULT_AUTOMATIC_TRANSFER_LENGTH); protected static final Duration TIME_SINCE_REQUEST = Duration.standardDays(3); protected static final int EXTENDED_REGISTRATION_YEARS = 1; protected static final DateTime REGISTRATION_EXPIRATION_TIME = DateTime.parse("2001-09-08T22:00:00.0Z"); protected static final DateTime EXTENDED_REGISTRATION_EXPIRATION_TIME = REGISTRATION_EXPIRATION_TIME .plusYears(EXTENDED_REGISTRATION_YEARS); protected ContactResource contact; protected DomainResource domain; protected HostResource subordinateHost; protected HistoryEntry historyEntryDomainCreate; public DomainTransferFlowTestCase() { checkState(!Registry.DEFAULT_TRANSFER_GRACE_PERIOD.isShorterThan(TIME_SINCE_REQUEST)); clock.setTo(TRANSFER_REQUEST_TIME.plus(TIME_SINCE_REQUEST)); } @Before public void makeClientZ() { // Registrar ClientZ is used in tests that need another registrar that definitely doesn't own // the resources in question. persistResource(AppEngineRule.makeRegistrar1().asBuilder().setClientId("ClientZ").build()); } static DomainResource persistWithPendingTransfer(DomainResource domain) { return persistDomainWithPendingTransfer(domain, TRANSFER_REQUEST_TIME, TRANSFER_EXPIRATION_TIME, EXTENDED_REGISTRATION_EXPIRATION_TIME, EXTENDED_REGISTRATION_YEARS, TRANSFER_REQUEST_TIME); } /** Adds a domain with no pending transfer on it. */ protected void setupDomain(String label, String tld) throws Exception { createTld(tld); contact = persistActiveContact("jd1234"); domain = new DomainResource.Builder().setRepoId("1-".concat(Ascii.toUpperCase(tld))) .setFullyQualifiedDomainName(label + "." + tld).setCurrentSponsorClientId("TheRegistrar") .setCreationClientId("TheRegistrar") .setCreationTimeForTest(DateTime.parse("1999-04-03T22:00:00.0Z")) .setRegistrationExpirationTime(REGISTRATION_EXPIRATION_TIME) .setRegistrant( Key.create(loadByForeignKey(ContactResource.class, "jd1234", clock.nowUtc()))) .setContacts( ImmutableSet.of( DesignatedContact.create(Type.ADMIN, Key.create( loadByForeignKey(ContactResource.class, "jd1234", clock.nowUtc()))), DesignatedContact.create(Type.TECH, Key.create(loadByForeignKey(ContactResource.class, "jd1234", clock.nowUtc()))))) .setAuthInfo(DomainAuthInfo.create(PasswordAuth.create("fooBAR"))) .addGracePeriod(GracePeriod.create(GracePeriodStatus.ADD, clock.nowUtc().plusDays(10), "foo", null)) .build(); historyEntryDomainCreate = persistResource( new HistoryEntry.Builder().setType(HistoryEntry.Type.DOMAIN_CREATE).setParent(domain).build()); BillingEvent.Recurring autorenewEvent = persistResource(new BillingEvent.Recurring.Builder() .setReason(Reason.RENEW).setFlags(ImmutableSet.of(Flag.AUTO_RENEW)).setTargetId(label + "." + tld) .setClientId("TheRegistrar").setEventTime(REGISTRATION_EXPIRATION_TIME) .setRecurrenceEndTime(END_OF_TIME).setParent(historyEntryDomainCreate).build()); PollMessage.Autorenew autorenewPollMessage = persistResource( new PollMessage.Autorenew.Builder().setTargetId(label + "." + tld).setClientId("TheRegistrar") .setEventTime(REGISTRATION_EXPIRATION_TIME).setAutorenewEndTime(END_OF_TIME) .setMsg("Domain was auto-renewed.").setParent(historyEntryDomainCreate).build()); subordinateHost = persistResource(new HostResource.Builder().setRepoId("2-".concat(Ascii.toUpperCase(tld))) .setFullyQualifiedHostName("ns1." + label + "." + tld).setCurrentSponsorClientId("TheRegistrar") .setCreationClientId("TheRegistrar") .setCreationTimeForTest(DateTime.parse("1999-04-03T22:00:00.0Z")) .setSuperordinateDomain(Key.create(domain)).build()); domain = persistResource(domain.asBuilder().setAutorenewBillingEvent(Key.create(autorenewEvent)) .setAutorenewPollMessage(Key.create(autorenewPollMessage)) .addSubordinateHost(subordinateHost.getFullyQualifiedHostName()).build()); } protected BillingEvent.OneTime getBillingEventForImplicitTransfer() { HistoryEntry historyEntry = getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_TRANSFER_REQUEST); return createBillingEventForTransfer(domain, historyEntry, TRANSFER_REQUEST_TIME, TRANSFER_EXPIRATION_TIME, EXTENDED_REGISTRATION_YEARS); } /** Get the autorenew event that the losing client will have after a SERVER_APPROVED transfer. */ protected BillingEvent.Recurring getLosingClientAutorenewEvent() { return new BillingEvent.Recurring.Builder().setReason(Reason.RENEW) .setFlags(ImmutableSet.of(Flag.AUTO_RENEW)).setTargetId(domain.getFullyQualifiedDomainName()) .setClientId("TheRegistrar").setEventTime(REGISTRATION_EXPIRATION_TIME) .setRecurrenceEndTime(TRANSFER_EXPIRATION_TIME).setParent(historyEntryDomainCreate).build(); } /** Get the autorenew event that the gaining client will have after a SERVER_APPROVED transfer. */ protected BillingEvent.Recurring getGainingClientAutorenewEvent() { return new BillingEvent.Recurring.Builder().setReason(Reason.RENEW) .setFlags(ImmutableSet.of(Flag.AUTO_RENEW)).setTargetId(domain.getFullyQualifiedDomainName()) .setClientId("NewRegistrar").setEventTime(EXTENDED_REGISTRATION_EXPIRATION_TIME) .setRecurrenceEndTime(END_OF_TIME) .setParent(getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_TRANSFER_REQUEST)).build(); } protected void assertTransferFailed(DomainResource domain, TransferStatus status) { assertAboutDomains().that(domain).hasTransferStatus(status).and() .hasPendingTransferExpirationTime(clock.nowUtc()).and() .doesNotHaveStatusValue(StatusValue.PENDING_TRANSFER).and() .hasCurrentSponsorClientId("TheRegistrar"); TransferData transferData = domain.getTransferData(); assertThat(transferData.getServerApproveBillingEvent()).isNull(); assertThat(transferData.getServerApproveAutorenewEvent()).isNull(); assertThat(transferData.getServerApproveAutorenewPollMessage()).isNull(); assertThat(transferData.getServerApproveEntities()).isEmpty(); } protected void assertTransferFailed(HostResource resource) { assertAboutEppResources().that(resource).doesNotHaveStatusValue(StatusValue.PENDING_TRANSFER).and() .hasCurrentSponsorClientId("TheRegistrar"); } /** Adds a domain that has a pending transfer on it from TheRegistrar to NewRegistrar. */ protected void setupDomainWithPendingTransfer(String label, String tld) throws Exception { setupDomain(label, tld); domain = persistWithPendingTransfer(domain); } /** Changes the transfer status on the persisted domain. */ protected void changeTransferStatus(TransferStatus transferStatus) { domain = persistResource(domain.asBuilder() .setTransferData(domain.getTransferData().asBuilder().setTransferStatus(transferStatus).build()) .build()); clock.advanceOneMilli(); } }