mirror of
https://github.com/google/nomulus.git
synced 2025-05-14 16:37:13 +02:00
Update lastEppUpdateTime after certain grace period is passed
The lastEppUpdateTime should be updated asynchronously in the situations below: - Implicit transfer success after 5 day pending transfer period - Implicit end of any grace period ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=224831791
This commit is contained in:
parent
c7fc964d9c
commit
5bc70cbc99
14 changed files with 347 additions and 84 deletions
|
@ -281,10 +281,15 @@ public class DomainResource extends DomainBase
|
||||||
}
|
}
|
||||||
// Set all remaining transfer properties.
|
// Set all remaining transfer properties.
|
||||||
setAutomaticTransferSuccessProperties(builder, transferData);
|
setAutomaticTransferSuccessProperties(builder, transferData);
|
||||||
|
builder
|
||||||
|
.setLastEppUpdateTime(transferExpirationTime)
|
||||||
|
.setLastEppUpdateClientId(transferData.getGainingClientId());
|
||||||
// Finish projecting to now.
|
// Finish projecting to now.
|
||||||
return builder.build().cloneProjectedAtTime(now);
|
return builder.build().cloneProjectedAtTime(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Optional<DateTime> newLastEppUpdateTime = Optional.empty();
|
||||||
|
|
||||||
// There is no transfer. Do any necessary autorenews.
|
// There is no transfer. Do any necessary autorenews.
|
||||||
|
|
||||||
Builder builder = asBuilder();
|
Builder builder = asBuilder();
|
||||||
|
@ -296,11 +301,13 @@ public class DomainResource extends DomainBase
|
||||||
DateTime newExpirationTime = lastAutorenewTime.plusYears(1);
|
DateTime newExpirationTime = lastAutorenewTime.plusYears(1);
|
||||||
builder
|
builder
|
||||||
.setRegistrationExpirationTime(newExpirationTime)
|
.setRegistrationExpirationTime(newExpirationTime)
|
||||||
.addGracePeriod(GracePeriod.createForRecurring(
|
.addGracePeriod(
|
||||||
|
GracePeriod.createForRecurring(
|
||||||
GracePeriodStatus.AUTO_RENEW,
|
GracePeriodStatus.AUTO_RENEW,
|
||||||
lastAutorenewTime.plus(Registry.get(getTld()).getAutoRenewGracePeriodLength()),
|
lastAutorenewTime.plus(Registry.get(getTld()).getAutoRenewGracePeriodLength()),
|
||||||
getCurrentSponsorClientId(),
|
getCurrentSponsorClientId(),
|
||||||
autorenewBillingEvent));
|
autorenewBillingEvent));
|
||||||
|
newLastEppUpdateTime = Optional.of(lastAutorenewTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove any grace periods that have expired.
|
// Remove any grace periods that have expired.
|
||||||
|
@ -309,6 +316,22 @@ public class DomainResource extends DomainBase
|
||||||
for (GracePeriod gracePeriod : almostBuilt.getGracePeriods()) {
|
for (GracePeriod gracePeriod : almostBuilt.getGracePeriods()) {
|
||||||
if (isBeforeOrAt(gracePeriod.getExpirationTime(), now)) {
|
if (isBeforeOrAt(gracePeriod.getExpirationTime(), now)) {
|
||||||
builder.removeGracePeriod(gracePeriod);
|
builder.removeGracePeriod(gracePeriod);
|
||||||
|
if (!newLastEppUpdateTime.isPresent()
|
||||||
|
|| isBeforeOrAt(newLastEppUpdateTime.get(), gracePeriod.getExpirationTime())) {
|
||||||
|
newLastEppUpdateTime = Optional.of(gracePeriod.getExpirationTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// It is possible that the lastEppUpdateClientId is different from current sponsor client
|
||||||
|
// id, so we have to do the comparison instead of having one variable just storing the most
|
||||||
|
// recent time.
|
||||||
|
if (newLastEppUpdateTime.isPresent()) {
|
||||||
|
if (getLastEppUpdateTime() == null
|
||||||
|
|| newLastEppUpdateTime.get().isAfter(getLastEppUpdateTime())) {
|
||||||
|
builder
|
||||||
|
.setLastEppUpdateTime(newLastEppUpdateTime.get())
|
||||||
|
.setLastEppUpdateClientId(getCurrentSponsorClientId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -171,7 +171,8 @@ public class EppLifecycleDomainTest extends EppTestCase {
|
||||||
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "example.tld"))
|
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "example.tld"))
|
||||||
.atTime("2000-08-08T00:00:00Z")
|
.atTime("2000-08-08T00:00:00Z")
|
||||||
.hasResponse(
|
.hasResponse(
|
||||||
"domain_info_response_wildcard.xml", ImmutableMap.of("STATUS", "pendingDelete"));
|
"domain_info_response_wildcard_after_redemption.xml",
|
||||||
|
ImmutableMap.of("STATUS", "pendingDelete"));
|
||||||
|
|
||||||
// Verify that the domain is non-existent (available for registration) later.
|
// Verify that the domain is non-existent (available for registration) later.
|
||||||
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "example.tld"))
|
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "example.tld"))
|
||||||
|
|
|
@ -327,6 +327,30 @@ public class DomainDeleteFlowTest extends ResourceFlowTestCase<DomainDeleteFlow,
|
||||||
assertThat(getPollMessages("TheRegistrar", A_MONTH_FROM_NOW)).isEmpty();
|
assertThat(getPollMessages("TheRegistrar", A_MONTH_FROM_NOW)).isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSuccess_updatedEppUpdateTimeAfterPendingRedemption() throws Exception {
|
||||||
|
persistResource(
|
||||||
|
Registry.get("tld")
|
||||||
|
.asBuilder()
|
||||||
|
.setRedemptionGracePeriodLength(standardDays(3))
|
||||||
|
.setPendingDeleteLength(standardDays(2))
|
||||||
|
.build());
|
||||||
|
setClientIdForFlow("TheRegistrar");
|
||||||
|
setUpSuccessfulTest();
|
||||||
|
clock.advanceOneMilli();
|
||||||
|
|
||||||
|
runFlowAssertResponse(loadFile("domain_delete_response_pending.xml"));
|
||||||
|
|
||||||
|
DomainResource domain = reloadResourceByForeignKey();
|
||||||
|
DateTime redemptionEndTime = domain.getLastEppUpdateTime().plusDays(3);
|
||||||
|
DomainResource domainAtRedemptionTime = domain.cloneProjectedAtTime(redemptionEndTime);
|
||||||
|
assertAboutDomains()
|
||||||
|
.that(domainAtRedemptionTime)
|
||||||
|
.hasLastEppUpdateClientId("TheRegistrar")
|
||||||
|
.and()
|
||||||
|
.hasLastEppUpdateTime(redemptionEndTime);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuccess_addGracePeriodResultsInImmediateDelete() throws Exception {
|
public void testSuccess_addGracePeriodResultsInImmediateDelete() throws Exception {
|
||||||
sessionMetadata.setServiceExtensionUris(ImmutableSet.of());
|
sessionMetadata.setServiceExtensionUris(ImmutableSet.of());
|
||||||
|
|
|
@ -421,7 +421,11 @@ public class DomainTransferRequestFlowTest
|
||||||
assertTransferApproved(domainAfterAutomaticTransfer, implicitTransferTime, expectedPeriod);
|
assertTransferApproved(domainAfterAutomaticTransfer, implicitTransferTime, expectedPeriod);
|
||||||
assertAboutDomains()
|
assertAboutDomains()
|
||||||
.that(domainAfterAutomaticTransfer)
|
.that(domainAfterAutomaticTransfer)
|
||||||
.hasRegistrationExpirationTime(expectedExpirationTime);
|
.hasRegistrationExpirationTime(expectedExpirationTime)
|
||||||
|
.and()
|
||||||
|
.hasLastEppUpdateTime(implicitTransferTime)
|
||||||
|
.and()
|
||||||
|
.hasLastEppUpdateClientId("NewRegistrar");
|
||||||
assertThat(
|
assertThat(
|
||||||
ofy()
|
ofy()
|
||||||
.load()
|
.load()
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
<domain:crID>NewRegistrar</domain:crID>
|
<domain:crID>NewRegistrar</domain:crID>
|
||||||
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
||||||
<domain:upID>TheRegistrar</domain:upID>
|
<domain:upID>TheRegistrar</domain:upID>
|
||||||
<domain:upDate>2002-05-30T00:00:00Z</domain:upDate>
|
<domain:upDate>2002-06-09T00:00:00Z</domain:upDate>
|
||||||
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
||||||
<domain:trDate>2002-06-04T00:00:00Z</domain:trDate>
|
<domain:trDate>2002-06-04T00:00:00Z</domain:trDate>
|
||||||
<domain:authInfo>
|
<domain:authInfo>
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
<domain:clID>NewRegistrar</domain:clID>
|
<domain:clID>NewRegistrar</domain:clID>
|
||||||
<domain:crID>NewRegistrar</domain:crID>
|
<domain:crID>NewRegistrar</domain:crID>
|
||||||
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
||||||
|
<domain:upID>NewRegistrar</domain:upID>
|
||||||
|
<domain:upDate>2000-06-06T00:04:00Z</domain:upDate>
|
||||||
<domain:exDate>2002-06-01T00:04:00Z</domain:exDate>
|
<domain:exDate>2002-06-01T00:04:00Z</domain:exDate>
|
||||||
<domain:authInfo>
|
<domain:authInfo>
|
||||||
<domain:pw>2fooBAR</domain:pw>
|
<domain:pw>2fooBAR</domain:pw>
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
<domain:clID>NewRegistrar</domain:clID>
|
<domain:clID>NewRegistrar</domain:clID>
|
||||||
<domain:crID>NewRegistrar</domain:crID>
|
<domain:crID>NewRegistrar</domain:crID>
|
||||||
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
||||||
<domain:upID>TheRegistrar</domain:upID>
|
<domain:upID>NewRegistrar</domain:upID>
|
||||||
<domain:upDate>2002-05-30T00:00:00Z</domain:upDate>
|
<domain:upDate>2002-06-01T00:04:00.000Z</domain:upDate>
|
||||||
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
||||||
<domain:authInfo>
|
<domain:authInfo>
|
||||||
<domain:pw>2fooBAR</domain:pw>
|
<domain:pw>2fooBAR</domain:pw>
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<domain:crID>NewRegistrar</domain:crID>
|
<domain:crID>NewRegistrar</domain:crID>
|
||||||
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
||||||
<domain:upID>TheRegistrar</domain:upID>
|
<domain:upID>TheRegistrar</domain:upID>
|
||||||
<domain:upDate>2002-05-30T00:00:00Z</domain:upDate>
|
<domain:upDate>2002-06-09T00:00:00Z</domain:upDate>
|
||||||
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
||||||
<domain:trDate>2002-06-04T00:00:00Z</domain:trDate>
|
<domain:trDate>2002-06-04T00:00:00Z</domain:trDate>
|
||||||
<domain:authInfo>
|
<domain:authInfo>
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<domain:crID>NewRegistrar</domain:crID>
|
<domain:crID>NewRegistrar</domain:crID>
|
||||||
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
<domain:crDate>2000-06-01T00:04:00Z</domain:crDate>
|
||||||
<domain:upID>TheRegistrar</domain:upID>
|
<domain:upID>TheRegistrar</domain:upID>
|
||||||
<domain:upDate>2002-05-30T00:00:00Z</domain:upDate>
|
<domain:upDate>2002-06-04T00:00:00Z</domain:upDate>
|
||||||
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
|
||||||
<domain:trDate>2002-06-04T00:00:00Z</domain:trDate>
|
<domain:trDate>2002-06-04T00:00:00Z</domain:trDate>
|
||||||
<domain:authInfo>
|
<domain:authInfo>
|
||||||
|
|
38
javatests/google/registry/flows/testdata/domain_info_response_wildcard_after_redemption.xml
vendored
Normal file
38
javatests/google/registry/flows/testdata/domain_info_response_wildcard_after_redemption.xml
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<response>
|
||||||
|
<result code="1000">
|
||||||
|
<msg>Command completed successfully</msg>
|
||||||
|
</result>
|
||||||
|
<resData>
|
||||||
|
<domain:infData
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:name>example.tld</domain:name>
|
||||||
|
<domain:roid>%ROID%</domain:roid>
|
||||||
|
<domain:status s="inactive"/>
|
||||||
|
<domain:status s="pendingDelete"/>
|
||||||
|
<domain:registrant>jd1234</domain:registrant>
|
||||||
|
<domain:contact type="admin">sh8013</domain:contact>
|
||||||
|
<domain:contact type="tech">sh8013</domain:contact>
|
||||||
|
<domain:clID>NewRegistrar</domain:clID>
|
||||||
|
<domain:crID>NewRegistrar</domain:crID>
|
||||||
|
<domain:crDate>2000-06-01T00:02:00.0Z</domain:crDate>
|
||||||
|
<domain:upID>NewRegistrar</domain:upID>
|
||||||
|
<domain:upDate>2000-08-06T00:02:00Z</domain:upDate>
|
||||||
|
<domain:exDate>2002-06-01T00:02:00.0Z</domain:exDate>
|
||||||
|
<domain:authInfo>
|
||||||
|
<domain:pw>2fooBAR</domain:pw>
|
||||||
|
</domain:authInfo>
|
||||||
|
</domain:infData>
|
||||||
|
</resData>
|
||||||
|
<extension>
|
||||||
|
<rgp:infData xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0">
|
||||||
|
<rgp:rgpStatus s="%STATUS%"/>
|
||||||
|
</rgp:infData>
|
||||||
|
</extension>
|
||||||
|
<trID>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
<svTRID>server-trid</svTRID>
|
||||||
|
</trID>
|
||||||
|
</response>
|
||||||
|
</epp>
|
|
@ -92,7 +92,9 @@ public class DomainResourceTest extends EntityTestCase {
|
||||||
Key<PollMessage.OneTime> onetimePollKey =
|
Key<PollMessage.OneTime> onetimePollKey =
|
||||||
Key.create(historyEntryKey, PollMessage.OneTime.class, 1);
|
Key.create(historyEntryKey, PollMessage.OneTime.class, 1);
|
||||||
// Set up a new persisted domain entity.
|
// Set up a new persisted domain entity.
|
||||||
domain = persistResource(cloneAndSetAutoTimestamps(
|
domain =
|
||||||
|
persistResource(
|
||||||
|
cloneAndSetAutoTimestamps(
|
||||||
new DomainResource.Builder()
|
new DomainResource.Builder()
|
||||||
.setFullyQualifiedDomainName("example.com")
|
.setFullyQualifiedDomainName("example.com")
|
||||||
.setRepoId("4-COM")
|
.setRepoId("4-COM")
|
||||||
|
@ -100,7 +102,8 @@ public class DomainResourceTest extends EntityTestCase {
|
||||||
.setLastEppUpdateTime(clock.nowUtc())
|
.setLastEppUpdateTime(clock.nowUtc())
|
||||||
.setLastEppUpdateClientId("AnotherRegistrar")
|
.setLastEppUpdateClientId("AnotherRegistrar")
|
||||||
.setLastTransferTime(clock.nowUtc())
|
.setLastTransferTime(clock.nowUtc())
|
||||||
.setStatusValues(ImmutableSet.of(
|
.setStatusValues(
|
||||||
|
ImmutableSet.of(
|
||||||
StatusValue.CLIENT_DELETE_PROHIBITED,
|
StatusValue.CLIENT_DELETE_PROHIBITED,
|
||||||
StatusValue.SERVER_DELETE_PROHIBITED,
|
StatusValue.SERVER_DELETE_PROHIBITED,
|
||||||
StatusValue.SERVER_TRANSFER_PROHIBITED,
|
StatusValue.SERVER_TRANSFER_PROHIBITED,
|
||||||
|
@ -111,10 +114,11 @@ public class DomainResourceTest extends EntityTestCase {
|
||||||
.setContacts(ImmutableSet.of(DesignatedContact.create(Type.ADMIN, contact2Key)))
|
.setContacts(ImmutableSet.of(DesignatedContact.create(Type.ADMIN, contact2Key)))
|
||||||
.setNameservers(ImmutableSet.of(hostKey))
|
.setNameservers(ImmutableSet.of(hostKey))
|
||||||
.setSubordinateHosts(ImmutableSet.of("ns1.example.com"))
|
.setSubordinateHosts(ImmutableSet.of("ns1.example.com"))
|
||||||
.setPersistedCurrentSponsorClientId("ThirdRegistrar")
|
.setPersistedCurrentSponsorClientId("losing")
|
||||||
.setRegistrationExpirationTime(clock.nowUtc().plusYears(1))
|
.setRegistrationExpirationTime(clock.nowUtc().plusYears(1))
|
||||||
.setAuthInfo(DomainAuthInfo.create(PasswordAuth.create("password")))
|
.setAuthInfo(DomainAuthInfo.create(PasswordAuth.create("password")))
|
||||||
.setDsData(ImmutableSet.of(DelegationSignerData.create(1, 2, 3, new byte[] {0, 1, 2})))
|
.setDsData(
|
||||||
|
ImmutableSet.of(DelegationSignerData.create(1, 2, 3, new byte[] {0, 1, 2})))
|
||||||
.setLaunchNotice(
|
.setLaunchNotice(
|
||||||
LaunchNotice.create("tcnid", "validatorId", START_OF_TIME, START_OF_TIME))
|
LaunchNotice.create("tcnid", "validatorId", START_OF_TIME, START_OF_TIME))
|
||||||
.setTransferData(
|
.setTransferData(
|
||||||
|
@ -138,7 +142,8 @@ public class DomainResourceTest extends EntityTestCase {
|
||||||
.setSmdId("smdid")
|
.setSmdId("smdid")
|
||||||
.setApplicationTime(START_OF_TIME)
|
.setApplicationTime(START_OF_TIME)
|
||||||
.setApplication(Key.create(DomainApplication.class, 1))
|
.setApplication(Key.create(DomainApplication.class, 1))
|
||||||
.addGracePeriod(GracePeriod.create(
|
.addGracePeriod(
|
||||||
|
GracePeriod.create(
|
||||||
GracePeriodStatus.ADD, clock.nowUtc().plusDays(1), "registrar", null))
|
GracePeriodStatus.ADD, clock.nowUtc().plusDays(1), "registrar", null))
|
||||||
.build()));
|
.build()));
|
||||||
}
|
}
|
||||||
|
@ -344,6 +349,89 @@ public class DomainResourceTest extends EntityTestCase {
|
||||||
doExpiredTransferTest(clock.nowUtc().minusDays(1));
|
doExpiredTransferTest(clock.nowUtc().minusDays(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupPendingTransferDomain(
|
||||||
|
DateTime oldExpirationTime, DateTime transferRequestTime, DateTime transferSuccessTime) {
|
||||||
|
domain =
|
||||||
|
domain
|
||||||
|
.asBuilder()
|
||||||
|
.setRegistrationExpirationTime(oldExpirationTime)
|
||||||
|
.setTransferData(
|
||||||
|
domain
|
||||||
|
.getTransferData()
|
||||||
|
.asBuilder()
|
||||||
|
.setTransferStatus(TransferStatus.PENDING)
|
||||||
|
.setTransferRequestTime(transferRequestTime)
|
||||||
|
.setPendingTransferExpirationTime(transferSuccessTime)
|
||||||
|
.build())
|
||||||
|
.setLastEppUpdateTime(transferRequestTime)
|
||||||
|
.setLastEppUpdateClientId(domain.getTransferData().getGainingClientId())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEppLastUpdateTimeAndClientId_autoRenewBeforeTransferSuccess() {
|
||||||
|
DateTime now = clock.nowUtc();
|
||||||
|
DateTime transferRequestDateTime = now.plusDays(1);
|
||||||
|
DateTime autorenewDateTime = now.plusDays(3);
|
||||||
|
DateTime transferSuccessDateTime = now.plusDays(5);
|
||||||
|
setupPendingTransferDomain(autorenewDateTime, transferRequestDateTime, transferSuccessDateTime);
|
||||||
|
|
||||||
|
DomainResource beforeAutoRenew = domain.cloneProjectedAtTime(autorenewDateTime.minusDays(1));
|
||||||
|
assertThat(beforeAutoRenew.getLastEppUpdateTime()).isEqualTo(transferRequestDateTime);
|
||||||
|
assertThat(beforeAutoRenew.getLastEppUpdateClientId()).isEqualTo("gaining");
|
||||||
|
|
||||||
|
// If autorenew happens before transfer succeeds(before transfer grace period starts as well),
|
||||||
|
// lastEppUpdateClientId should still be the current sponsor client id
|
||||||
|
DomainResource afterAutoRenew = domain.cloneProjectedAtTime(autorenewDateTime.plusDays(1));
|
||||||
|
assertThat(afterAutoRenew.getLastEppUpdateTime()).isEqualTo(autorenewDateTime);
|
||||||
|
assertThat(afterAutoRenew.getLastEppUpdateClientId()).isEqualTo("losing");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEppLastUpdateTimeAndClientId_autoRenewAfterTransferSuccess() {
|
||||||
|
DateTime now = clock.nowUtc();
|
||||||
|
DateTime transferRequestDateTime = now.plusDays(1);
|
||||||
|
DateTime autorenewDateTime = now.plusDays(3);
|
||||||
|
DateTime transferSuccessDateTime = now.plusDays(5);
|
||||||
|
setupPendingTransferDomain(autorenewDateTime, transferRequestDateTime, transferSuccessDateTime);
|
||||||
|
|
||||||
|
DomainResource beforeAutoRenew = domain.cloneProjectedAtTime(autorenewDateTime.minusDays(1));
|
||||||
|
assertThat(beforeAutoRenew.getLastEppUpdateTime()).isEqualTo(transferRequestDateTime);
|
||||||
|
assertThat(beforeAutoRenew.getLastEppUpdateClientId()).isEqualTo("gaining");
|
||||||
|
|
||||||
|
DomainResource afterTransferSuccess =
|
||||||
|
domain.cloneProjectedAtTime(transferSuccessDateTime.plusDays(1));
|
||||||
|
assertThat(afterTransferSuccess.getLastEppUpdateTime()).isEqualTo(transferSuccessDateTime);
|
||||||
|
assertThat(afterTransferSuccess.getLastEppUpdateClientId()).isEqualTo("gaining");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupUnmodifiedDomain(DateTime oldExpirationTime) {
|
||||||
|
domain =
|
||||||
|
domain
|
||||||
|
.asBuilder()
|
||||||
|
.setRegistrationExpirationTime(oldExpirationTime)
|
||||||
|
.setTransferData(TransferData.EMPTY)
|
||||||
|
.setGracePeriods(ImmutableSet.of())
|
||||||
|
.setLastEppUpdateTime(null)
|
||||||
|
.setLastEppUpdateClientId(null)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEppLastUpdateTimeAndClientId_isSetCorrectlyWithNullPreviousValue() {
|
||||||
|
DateTime now = clock.nowUtc();
|
||||||
|
DateTime autorenewDateTime = now.plusDays(3);
|
||||||
|
setupUnmodifiedDomain(autorenewDateTime);
|
||||||
|
|
||||||
|
DomainResource beforeAutoRenew = domain.cloneProjectedAtTime(autorenewDateTime.minusDays(1));
|
||||||
|
assertThat(beforeAutoRenew.getLastEppUpdateTime()).isEqualTo(null);
|
||||||
|
assertThat(beforeAutoRenew.getLastEppUpdateClientId()).isEqualTo(null);
|
||||||
|
|
||||||
|
DomainResource afterAutoRenew = domain.cloneProjectedAtTime(autorenewDateTime.plusDays(1));
|
||||||
|
assertThat(afterAutoRenew.getLastEppUpdateTime()).isEqualTo(autorenewDateTime);
|
||||||
|
assertThat(afterAutoRenew.getLastEppUpdateClientId()).isEqualTo("losing");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStackedGracePeriods() {
|
public void testStackedGracePeriods() {
|
||||||
ImmutableList<GracePeriod> gracePeriods = ImmutableList.of(
|
ImmutableList<GracePeriod> gracePeriods = ImmutableList.of(
|
||||||
|
@ -383,7 +471,7 @@ public class DomainResourceTest extends EntityTestCase {
|
||||||
domain.cloneProjectedAtTime(domain.getRegistrationExpirationTime());
|
domain.cloneProjectedAtTime(domain.getRegistrationExpirationTime());
|
||||||
assertThat(renewed.getRegistrationExpirationTime())
|
assertThat(renewed.getRegistrationExpirationTime())
|
||||||
.isEqualTo(domain.getRegistrationExpirationTime().plusYears(1));
|
.isEqualTo(domain.getRegistrationExpirationTime().plusYears(1));
|
||||||
assertThat(renewed.getLastEppUpdateTime()).isEqualTo(clock.nowUtc());
|
assertThat(renewed.getLastEppUpdateTime()).isEqualTo(domain.getRegistrationExpirationTime());
|
||||||
assertThat(getOnlyElement(renewed.getGracePeriods()).getType())
|
assertThat(getOnlyElement(renewed.getGracePeriods()).getType())
|
||||||
.isEqualTo(GracePeriodStatus.AUTO_RENEW);
|
.isEqualTo(GracePeriodStatus.AUTO_RENEW);
|
||||||
}
|
}
|
||||||
|
@ -428,7 +516,7 @@ public class DomainResourceTest extends EntityTestCase {
|
||||||
domain.cloneProjectedAtTime(oldExpirationTime.plusYears(2));
|
domain.cloneProjectedAtTime(oldExpirationTime.plusYears(2));
|
||||||
assertThat(renewedThreeTimes.getRegistrationExpirationTime())
|
assertThat(renewedThreeTimes.getRegistrationExpirationTime())
|
||||||
.isEqualTo(oldExpirationTime.plusYears(3));
|
.isEqualTo(oldExpirationTime.plusYears(3));
|
||||||
assertThat(renewedThreeTimes.getLastEppUpdateTime()).isEqualTo(clock.nowUtc());
|
assertThat(renewedThreeTimes.getLastEppUpdateTime()).isEqualTo(oldExpirationTime.plusYears(2));
|
||||||
assertThat(renewedThreeTimes.getGracePeriods())
|
assertThat(renewedThreeTimes.getGracePeriods())
|
||||||
.containsExactly(GracePeriod.createForRecurring(
|
.containsExactly(GracePeriod.createForRecurring(
|
||||||
GracePeriodStatus.AUTO_RENEW,
|
GracePeriodStatus.AUTO_RENEW,
|
||||||
|
|
|
@ -150,8 +150,8 @@
|
||||||
<rdeDomain:crRr>TheRegistrar</rdeDomain:crRr>
|
<rdeDomain:crRr>TheRegistrar</rdeDomain:crRr>
|
||||||
<rdeDomain:crDate>1999-12-31T00:00:00Z</rdeDomain:crDate>
|
<rdeDomain:crDate>1999-12-31T00:00:00Z</rdeDomain:crDate>
|
||||||
<rdeDomain:exDate>2001-01-01T00:00:00Z</rdeDomain:exDate>
|
<rdeDomain:exDate>2001-01-01T00:00:00Z</rdeDomain:exDate>
|
||||||
<rdeDomain:upRr>IntoTheTempest</rdeDomain:upRr>
|
<rdeDomain:upRr>gaining</rdeDomain:upRr>
|
||||||
<rdeDomain:upDate>1999-12-31T00:00:00Z</rdeDomain:upDate>
|
<rdeDomain:upDate>2000-01-01T00:00:00Z</rdeDomain:upDate>
|
||||||
<rdeDomain:secDNS>
|
<rdeDomain:secDNS>
|
||||||
<secDNS:dsData>
|
<secDNS:dsData>
|
||||||
<secDNS:keyTag>123</secDNS:keyTag>
|
<secDNS:keyTag>123</secDNS:keyTag>
|
||||||
|
|
|
@ -48,11 +48,14 @@ import com.google.common.net.InetAddresses;
|
||||||
import google.registry.model.EppResource;
|
import google.registry.model.EppResource;
|
||||||
import google.registry.model.contact.ContactResource;
|
import google.registry.model.contact.ContactResource;
|
||||||
import google.registry.model.domain.DomainResource;
|
import google.registry.model.domain.DomainResource;
|
||||||
|
import google.registry.model.eppcommon.Trid;
|
||||||
import google.registry.model.host.HostResource;
|
import google.registry.model.host.HostResource;
|
||||||
import google.registry.model.index.ForeignKeyIndex;
|
import google.registry.model.index.ForeignKeyIndex;
|
||||||
import google.registry.model.ofy.Ofy;
|
import google.registry.model.ofy.Ofy;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
|
import google.registry.model.transfer.TransferData;
|
||||||
|
import google.registry.model.transfer.TransferStatus;
|
||||||
import google.registry.testing.AppEngineRule;
|
import google.registry.testing.AppEngineRule;
|
||||||
import google.registry.testing.FakeClock;
|
import google.registry.testing.FakeClock;
|
||||||
import google.registry.testing.FakeResponse;
|
import google.registry.testing.FakeResponse;
|
||||||
|
@ -79,7 +82,7 @@ public class WhoisActionTest {
|
||||||
@Rule public final InjectRule inject = new InjectRule();
|
@Rule public final InjectRule inject = new InjectRule();
|
||||||
|
|
||||||
private final FakeResponse response = new FakeResponse();
|
private final FakeResponse response = new FakeResponse();
|
||||||
private final FakeClock clock = new FakeClock(DateTime.parse("2009-06-29T20:13:00Z"));
|
private FakeClock clock;
|
||||||
|
|
||||||
private WhoisAction newWhoisAction(String input) {
|
private WhoisAction newWhoisAction(String input) {
|
||||||
WhoisAction whoisAction = new WhoisAction();
|
WhoisAction whoisAction = new WhoisAction();
|
||||||
|
@ -97,6 +100,7 @@ public class WhoisActionTest {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
clock = new FakeClock(DateTime.parse("2009-06-29T20:13:00Z"));
|
||||||
createTlds("lol", "xn--q9jyb4c", "1.test");
|
createTlds("lol", "xn--q9jyb4c", "1.test");
|
||||||
inject.setStaticField(Ofy.class, "clock", clock);
|
inject.setStaticField(Ofy.class, "clock", clock);
|
||||||
|
|
||||||
|
@ -112,19 +116,22 @@ public class WhoisActionTest {
|
||||||
assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_no_command.txt"));
|
assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_no_command.txt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
private DomainResource makeDomainResourceWithRegistrar(Registrar registrar) {
|
||||||
public void testRun_domainQuery_works() {
|
return makeDomainResource(
|
||||||
Registrar registrar =
|
|
||||||
persistResource(makeRegistrar("evilregistrar", "Yes Virginia", ACTIVE));
|
|
||||||
persistResource(
|
|
||||||
makeDomainResource(
|
|
||||||
"cat.lol",
|
"cat.lol",
|
||||||
persistResource(makeContactResource("5372808-ERL", "Goblin Market", "lol@cat.lol")),
|
persistResource(makeContactResource("5372808-ERL", "Goblin Market", "lol@cat.lol")),
|
||||||
persistResource(makeContactResource("5372808-IRL", "Santa Claus", "BOFH@cat.lol")),
|
persistResource(makeContactResource("5372808-IRL", "Santa Claus", "BOFH@cat.lol")),
|
||||||
persistResource(makeContactResource("5372808-TRL", "The Raven", "bog@cat.lol")),
|
persistResource(makeContactResource("5372808-TRL", "The Raven", "bog@cat.lol")),
|
||||||
persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")),
|
persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")),
|
||||||
persistResource(makeHostResource("ns2.cat.lol", "bad:f00d:cafe::15:beef")),
|
persistResource(makeHostResource("ns2.cat.lol", "bad:f00d:cafe::15:beef")),
|
||||||
registrar));
|
registrar);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRun_domainQuery_works() {
|
||||||
|
Registrar registrar =
|
||||||
|
persistResource(makeRegistrar("evilregistrar", "Yes Virginia", ACTIVE));
|
||||||
|
persistResource(makeDomainResourceWithRegistrar(registrar));
|
||||||
persistSimpleResources(makeRegistrarContacts(registrar));
|
persistSimpleResources(makeRegistrarContacts(registrar));
|
||||||
newWhoisAction("domain cat.lol\r\n").run();
|
newWhoisAction("domain cat.lol\r\n").run();
|
||||||
assertThat(response.getStatus()).isEqualTo(200);
|
assertThat(response.getStatus()).isEqualTo(200);
|
||||||
|
@ -135,15 +142,7 @@ public class WhoisActionTest {
|
||||||
public void testRun_domainQuery_usesCache() {
|
public void testRun_domainQuery_usesCache() {
|
||||||
Registrar registrar =
|
Registrar registrar =
|
||||||
persistResource(makeRegistrar("evilregistrar", "Yes Virginia", ACTIVE));
|
persistResource(makeRegistrar("evilregistrar", "Yes Virginia", ACTIVE));
|
||||||
persistResource(
|
persistResource(makeDomainResourceWithRegistrar(registrar));
|
||||||
makeDomainResource(
|
|
||||||
"cat.lol",
|
|
||||||
persistResource(makeContactResource("5372808-ERL", "Goblin Market", "lol@cat.lol")),
|
|
||||||
persistResource(makeContactResource("5372808-IRL", "Santa Claus", "BOFH@cat.lol")),
|
|
||||||
persistResource(makeContactResource("5372808-TRL", "The Raven", "bog@cat.lol")),
|
|
||||||
persistResource(makeHostResource("ns1.cat.lol", "1.2.3.4")),
|
|
||||||
persistResource(makeHostResource("ns2.cat.lol", "bad:f00d:cafe::15:beef")),
|
|
||||||
registrar));
|
|
||||||
persistSimpleResources(makeRegistrarContacts(registrar));
|
persistSimpleResources(makeRegistrarContacts(registrar));
|
||||||
// Populate the cache for both the domain and contact.
|
// Populate the cache for both the domain and contact.
|
||||||
DomainResource domain =
|
DomainResource domain =
|
||||||
|
@ -167,6 +166,31 @@ public class WhoisActionTest {
|
||||||
assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_domain.txt"));
|
assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_domain.txt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRun_domainAfterTransfer_hasUpdatedEppTimeAndClientId() {
|
||||||
|
Registrar registrar = persistResource(makeRegistrar("TheRegistrar", "Yes Virginia", ACTIVE));
|
||||||
|
persistResource(
|
||||||
|
makeDomainResourceWithRegistrar(registrar)
|
||||||
|
.asBuilder()
|
||||||
|
.setTransferData(
|
||||||
|
new TransferData.Builder()
|
||||||
|
.setGainingClientId("TheRegistrar")
|
||||||
|
.setLosingClientId("NewRegistrar")
|
||||||
|
.setTransferRequestTime(DateTime.parse("2009-05-29T20:13:00Z"))
|
||||||
|
.setPendingTransferExpirationTime(DateTime.parse("2010-03-01T00:00:00Z"))
|
||||||
|
.setTransferStatus(TransferStatus.PENDING)
|
||||||
|
.setTransferRequestTrid(Trid.create("client-trid", "server-trid"))
|
||||||
|
.build())
|
||||||
|
.build());
|
||||||
|
persistSimpleResources(makeRegistrarContacts(registrar));
|
||||||
|
clock.setTo(DateTime.parse("2011-01-01T00:00:00Z"));
|
||||||
|
|
||||||
|
newWhoisAction("domain cat.lol\r\n").run();
|
||||||
|
|
||||||
|
assertThat(response.getStatus()).isEqualTo(200);
|
||||||
|
assertThat(response.getPayload()).isEqualTo(loadFile("whois_action_transferred_domain.txt"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRun_idnDomain_works() {
|
public void testRun_idnDomain_works() {
|
||||||
Registrar registrar = persistResource(makeRegistrar(
|
Registrar registrar = persistResource(makeRegistrar(
|
||||||
|
|
59
javatests/google/registry/whois/testdata/whois_action_transferred_domain.txt
vendored
Normal file
59
javatests/google/registry/whois/testdata/whois_action_transferred_domain.txt
vendored
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
Domain Name: cat.lol
|
||||||
|
Registry Domain ID: 9-LOL
|
||||||
|
Registrar WHOIS Server: whois.example.com
|
||||||
|
Registrar URL: http://my.fake.url
|
||||||
|
Updated Date: 2010-03-06T00:00:00Z
|
||||||
|
Creation Date: 2000-10-08T00:45:00Z
|
||||||
|
Registry Expiry Date: 2020-03-01T00:00:00Z
|
||||||
|
Registrar: Yes Virginia
|
||||||
|
Registrar IANA ID: 1
|
||||||
|
Registrar Abuse Contact Email: jakedoe@example.com
|
||||||
|
Registrar Abuse Contact Phone: +1.2125551216
|
||||||
|
Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited
|
||||||
|
Domain Status: clientRenewProhibited https://icann.org/epp#clientRenewProhibited
|
||||||
|
Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
|
||||||
|
Domain Status: serverUpdateProhibited https://icann.org/epp#serverUpdateProhibited
|
||||||
|
Registry Registrant ID: REDACTED FOR PRIVACY
|
||||||
|
Registrant Name: REDACTED FOR PRIVACY
|
||||||
|
Registrant Organization: GOOGLE INCORPORATED <script>
|
||||||
|
Registrant Street: REDACTED FOR PRIVACY
|
||||||
|
Registrant City: REDACTED FOR PRIVACY
|
||||||
|
Registrant State/Province: BM
|
||||||
|
Registrant Postal Code: REDACTED FOR PRIVACY
|
||||||
|
Registrant Country: US
|
||||||
|
Registrant Phone: REDACTED FOR PRIVACY
|
||||||
|
Registrant Fax: REDACTED FOR PRIVACY
|
||||||
|
Registrant Email: REDACTED FOR PRIVACY
|
||||||
|
Registry Admin ID: REDACTED FOR PRIVACY
|
||||||
|
Admin Name: REDACTED FOR PRIVACY
|
||||||
|
Admin Organization: REDACTED FOR PRIVACY
|
||||||
|
Admin Street: REDACTED FOR PRIVACY
|
||||||
|
Admin City: REDACTED FOR PRIVACY
|
||||||
|
Admin State/Province: REDACTED FOR PRIVACY
|
||||||
|
Admin Postal Code: REDACTED FOR PRIVACY
|
||||||
|
Admin Country: REDACTED FOR PRIVACY
|
||||||
|
Admin Phone: REDACTED FOR PRIVACY
|
||||||
|
Admin Fax: REDACTED FOR PRIVACY
|
||||||
|
Admin Email: REDACTED FOR PRIVACY
|
||||||
|
Registry Tech ID: REDACTED FOR PRIVACY
|
||||||
|
Tech Name: REDACTED FOR PRIVACY
|
||||||
|
Tech Organization: REDACTED FOR PRIVACY
|
||||||
|
Tech Street: REDACTED FOR PRIVACY
|
||||||
|
Tech City: REDACTED FOR PRIVACY
|
||||||
|
Tech State/Province: REDACTED FOR PRIVACY
|
||||||
|
Tech Postal Code: REDACTED FOR PRIVACY
|
||||||
|
Tech Country: REDACTED FOR PRIVACY
|
||||||
|
Tech Phone: REDACTED FOR PRIVACY
|
||||||
|
Tech Fax: REDACTED FOR PRIVACY
|
||||||
|
Tech Email: REDACTED FOR PRIVACY
|
||||||
|
Name Server: ns1.cat.lol
|
||||||
|
Name Server: ns2.cat.lol
|
||||||
|
DNSSEC: signedDelegation
|
||||||
|
URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
|
||||||
|
>>> Last update of WHOIS database: 2011-01-01T00:00:00Z <<<
|
||||||
|
|
||||||
|
For more information on Whois status codes, please visit https://icann.org/epp
|
||||||
|
|
||||||
|
Doodle Disclaimer
|
||||||
|
I exist so that carriage return
|
||||||
|
in disclaimer can be tested.
|
Loading…
Add table
Add a link
Reference in a new issue