Change lrpTldStates to Interval

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135957698
This commit is contained in:
ctingue 2016-10-12 13:51:28 -07:00 committed by Ben McIlwain
parent edbb8985e6
commit 4e0b6d36c4
13 changed files with 232 additions and 131 deletions

View file

@ -201,7 +201,8 @@ public abstract class BaseDomainCreateFlow<R extends DomainBase, B extends Build
isAnchorTenantViaReservation = matchesAnchorTenantReservation( isAnchorTenantViaReservation = matchesAnchorTenantReservation(
domainLabel, tld, command.getAuthInfo().getPw().getValue()); domainLabel, tld, command.getAuthInfo().getPw().getValue());
boolean isLrpApplication = boolean isLrpApplication =
registry.getLrpTldStates().contains(tldState) registry.getLrpPeriod() != null
&& registry.getLrpPeriod().contains(now)
&& !command.getAuthInfo().getPw().getValue().isEmpty() && !command.getAuthInfo().getPw().getValue().isEmpty()
&& !isAnchorTenantViaReservation; && !isAnchorTenantViaReservation;
lrpToken = isLrpApplication lrpToken = isLrpApplication

View file

@ -121,15 +121,15 @@ public class ObjectifyService {
/** Register translators that allow less common types to be stored directly in Datastore. */ /** Register translators that allow less common types to be stored directly in Datastore. */
private static void registerTranslators() { private static void registerTranslators() {
for (TranslatorFactory<?> translatorFactory : Arrays.asList( for (TranslatorFactory<?> translatorFactory : Arrays.asList(
new ReadableInstantUtcTranslatorFactory(),
new CidrAddressBlockTranslatorFactory(), new CidrAddressBlockTranslatorFactory(),
new CommitLogRevisionsTranslatorFactory(),
new CreateAutoTimestampTranslatorFactory(),
new CurrencyUnitTranslatorFactory(), new CurrencyUnitTranslatorFactory(),
new DurationTranslatorFactory(), new DurationTranslatorFactory(),
new InetAddressTranslatorFactory(), new InetAddressTranslatorFactory(),
new MoneyStringTranslatorFactory(), new MoneyStringTranslatorFactory(),
new CreateAutoTimestampTranslatorFactory(), new ReadableInstantUtcTranslatorFactory(),
new UpdateAutoTimestampTranslatorFactory(), new UpdateAutoTimestampTranslatorFactory())) {
new CommitLogRevisionsTranslatorFactory())) {
factory().getTranslators().add(translatorFactory); factory().getTranslators().add(translatorFactory);
} }
} }

View file

@ -62,10 +62,12 @@ import google.registry.model.registry.label.PremiumList;
import google.registry.model.registry.label.ReservedList; import google.registry.model.registry.label.ReservedList;
import google.registry.util.Idn; import google.registry.util.Idn;
import java.util.Set; import java.util.Set;
import javax.annotation.Nullable;
import org.joda.money.CurrencyUnit; import org.joda.money.CurrencyUnit;
import org.joda.money.Money; import org.joda.money.Money;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.Duration; import org.joda.time.Duration;
import org.joda.time.Interval;
/** Persisted per-TLD configuration data. */ /** Persisted per-TLD configuration data. */
@Cache(expirationSeconds = RECOMMENDED_MEMCACHE_EXPIRATION) @Cache(expirationSeconds = RECOMMENDED_MEMCACHE_EXPIRATION)
@ -368,15 +370,26 @@ public class Registry extends ImmutableObject implements Buildable {
/** The end of the claims period (at or after this time, claims no longer applies). */ /** The end of the claims period (at or after this time, claims no longer applies). */
DateTime claimsPeriodEnd = END_OF_TIME; DateTime claimsPeriodEnd = END_OF_TIME;
/**
* The (inclusive) start {@link DateTime} of LRP. This (and lrpPeriodEnd) exist for serialization
* purposes, though everything else that interacts with the LRP period should use getLrpPeriod()
* and setLrpPeriod(), which uses an {@link Interval}.
*/
DateTime lrpPeriodStart;
/**
* The (exclusive) end {@link DateTime} of LRP. This (and lrpPeriodStart) exist for serialization
* purposes, though everything else that interacts with the LRP period should use getLrpPeriod()
* and setLrpPeriod(), which uses an {@link Interval}.
*/
DateTime lrpPeriodEnd;
/** A whitelist of clients allowed to be used on domains on this TLD (ignored if empty). */ /** A whitelist of clients allowed to be used on domains on this TLD (ignored if empty). */
Set<String> allowedRegistrantContactIds; Set<String> allowedRegistrantContactIds;
/** A whitelist of hosts allowed to be used on domains on this TLD (ignored if empty). */ /** A whitelist of hosts allowed to be used on domains on this TLD (ignored if empty). */
Set<String> allowedFullyQualifiedHostNames; Set<String> allowedFullyQualifiedHostNames;
/** The set of {@link TldState}s for which LRP applications are accepted (ignored if empty). */
Set<TldState> lrpTldStates;
public String getTldStr() { public String getTldStr() {
return tldStr; return tldStr;
} }
@ -558,8 +571,11 @@ public class Registry extends ImmutableObject implements Buildable {
return nullToEmptyImmutableCopy(allowedFullyQualifiedHostNames); return nullToEmptyImmutableCopy(allowedFullyQualifiedHostNames);
} }
public ImmutableSet<TldState> getLrpTldStates() { @Nullable
return nullToEmptyImmutableCopy(lrpTldStates); public Interval getLrpPeriod() {
return (lrpPeriodStart == null && lrpPeriodEnd == null)
? null
: new Interval(lrpPeriodStart, lrpPeriodEnd);
} }
@Override @Override
@ -818,8 +834,9 @@ public class Registry extends ImmutableObject implements Buildable {
return this; return this;
} }
public Builder setLrpTldStates(ImmutableSet<TldState> lrpTldStates) { public Builder setLrpPeriod(@Nullable Interval lrpPeriod) {
getInstance().lrpTldStates = lrpTldStates; getInstance().lrpPeriodStart = (lrpPeriod == null ? null : lrpPeriod.getStart());
getInstance().lrpPeriodEnd = (lrpPeriod == null ? null : lrpPeriod.getEnd());
return this; return this;
} }
@ -840,10 +857,6 @@ public class Registry extends ImmutableObject implements Buildable {
// cloned it into a new builder, to block re-building a Registry in an invalid state. // cloned it into a new builder, to block re-building a Registry in an invalid state.
instance.tldStateTransitions.checkValidity(); instance.tldStateTransitions.checkValidity();
instance.renewBillingCostTransitions.checkValidity(); instance.renewBillingCostTransitions.checkValidity();
checkArgument(
instance.tldStateTransitions.toValueMap().values()
.containsAll(instance.getLrpTldStates()),
"Cannot specify an LRP TLD state that is not part of the TLD state transitions.");
instance.eapFeeSchedule.checkValidity(); instance.eapFeeSchedule.checkValidity();
// All costs must be in the expected currency. // All costs must be in the expected currency.
// TODO(b/21854155): When we move PremiumList into datastore, verify its currency too. // TODO(b/21854155): When we move PremiumList into datastore, verify its currency too.

View file

@ -32,8 +32,8 @@ import google.registry.model.registry.Registry;
import google.registry.model.registry.Registry.TldState; import google.registry.model.registry.Registry.TldState;
import google.registry.model.registry.Registry.TldType; import google.registry.model.registry.Registry.TldType;
import google.registry.model.registry.label.PremiumList; import google.registry.model.registry.label.PremiumList;
import google.registry.tools.params.OptionalIntervalParameter;
import google.registry.tools.params.OptionalStringParameter; import google.registry.tools.params.OptionalStringParameter;
import google.registry.tools.params.TldStateParameter;
import google.registry.tools.params.TransitionListParameter.BillingCostTransitions; import google.registry.tools.params.TransitionListParameter.BillingCostTransitions;
import google.registry.tools.params.TransitionListParameter.TldStateTransitions; import google.registry.tools.params.TransitionListParameter.TldStateTransitions;
import java.util.List; import java.util.List;
@ -45,6 +45,7 @@ import javax.inject.Named;
import org.joda.money.Money; import org.joda.money.Money;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.Duration; import org.joda.time.Duration;
import org.joda.time.Interval;
/** Shared base class for commands to create or update a TLD. */ /** Shared base class for commands to create or update a TLD. */
abstract class CreateOrUpdateTldCommand extends MutatingCommand { abstract class CreateOrUpdateTldCommand extends MutatingCommand {
@ -220,10 +221,12 @@ abstract class CreateOrUpdateTldCommand extends MutatingCommand {
@Nullable @Nullable
@Parameter( @Parameter(
names = "--lrp_tld_states", names = "--lrp_period",
converter = TldStateParameter.class, description =
description = "A comma-separated list of TLD states for which LRP is available") "LRP period (in ISO-8601 format, e.g. 2004-06-09T12:30:00Z/2004-07-10T13:30:00Z",
List<TldState> lrpTldStates; converter = OptionalIntervalParameter.class,
validateWith = OptionalIntervalParameter.class)
private Optional<Interval> lrpPeriod;
/** Returns the existing registry (for update) or null (for creates). */ /** Returns the existing registry (for update) or null (for creates). */
@Nullable @Nullable
@ -391,8 +394,8 @@ abstract class CreateOrUpdateTldCommand extends MutatingCommand {
} }
} }
if (lrpTldStates != null) { if (lrpPeriod != null) {
builder.setLrpTldStates(ImmutableSet.copyOf(lrpTldStates)); builder.setLrpPeriod(lrpPeriod.orNull());
} }
ImmutableSet<String> newReservedListNames = getReservedLists(oldRegistry); ImmutableSet<String> newReservedListNames = getReservedLists(oldRegistry);

View file

@ -0,0 +1,41 @@
// 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.tools.params;
import org.joda.time.DateTimeZone;
import org.joda.time.Interval;
/** Interval CLI parameter converter/validator. */
public final class IntervalParameter extends ParameterConverterValidator<Interval> {
public IntervalParameter() {
super("not an ISO-8601 interval (e.g. 2004-06-09T12:30:00Z/2004-07-10T13:30:00Z)");
}
@Override
public Interval convert(String value) {
// Interval.parse(null) creates an interval with both start and end times set to now.
// Do something a little more reasonable.
if (value == null) {
throw new NullPointerException();
}
Interval interval = Interval.parse(value);
// Interval does not have a way to set the time zone, so create a new interval with the
// start and end times of the parsed interval converted to UTC.
return new Interval(
interval.getStart().withZone(DateTimeZone.UTC),
interval.getEnd().withZone(DateTimeZone.UTC));
}
}

View file

@ -0,0 +1,21 @@
// 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.tools.params;
import org.joda.time.Interval;
/** Optional wrapper for IntervalParameter. */
public final class OptionalIntervalParameter
extends OptionalParameterConverterValidator<Interval, IntervalParameter> {}

View file

@ -26,6 +26,7 @@ import javax.annotation.Nullable;
import org.joda.money.Money; import org.joda.money.Money;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.Duration; import org.joda.time.Duration;
import org.joda.time.Interval;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.joda.time.YearMonth; import org.joda.time.YearMonth;
@ -46,6 +47,7 @@ public final class ParameterFactory implements IStringConverterFactory {
.put(Duration.class, DurationParameter.class) .put(Duration.class, DurationParameter.class)
.put(HostAndPort.class, HostAndPortParameter.class) .put(HostAndPort.class, HostAndPortParameter.class)
.put(InternetDomainName.class, InternetDomainNameParameter.class) .put(InternetDomainName.class, InternetDomainNameParameter.class)
.put(Interval.class, IntervalParameter.class)
.put(Level.class, LoggingLevelParameter.class) .put(Level.class, LoggingLevelParameter.class)
.put(LocalDate.class, LocalDateParameter.class) .put(LocalDate.class, LocalDateParameter.class)
.put(Money.class, MoneyParameter.class) .put(Money.class, MoneyParameter.class)

View file

@ -125,6 +125,7 @@ import java.util.List;
import org.joda.money.CurrencyUnit; import org.joda.money.CurrencyUnit;
import org.joda.money.Money; import org.joda.money.Money;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
@ -876,7 +877,7 @@ public class DomainApplicationCreateFlowTest
public void testSuccess_landrushLrpApplication() throws Exception { public void testSuccess_landrushLrpApplication() throws Exception {
createTld("tld", TldState.LANDRUSH); createTld("tld", TldState.LANDRUSH);
persistResource(Registry.get("tld").asBuilder() persistResource(Registry.get("tld").asBuilder()
.setLrpTldStates(ImmutableSet.of(TldState.LANDRUSH)) .setLrpPeriod(new Interval(clock.nowUtc().minusDays(1), clock.nowUtc().plusDays(1)))
.build()); .build());
LrpTokenEntity token = persistResource( LrpTokenEntity token = persistResource(
new LrpTokenEntity.Builder() new LrpTokenEntity.Builder()
@ -895,7 +896,7 @@ public class DomainApplicationCreateFlowTest
public void testSuccess_landrush_duringLrpWithMissingToken() throws Exception { public void testSuccess_landrush_duringLrpWithMissingToken() throws Exception {
createTld("tld", TldState.LANDRUSH); createTld("tld", TldState.LANDRUSH);
persistResource(Registry.get("tld").asBuilder() persistResource(Registry.get("tld").asBuilder()
.setLrpTldStates(ImmutableSet.of(TldState.LANDRUSH)) .setLrpPeriod(new Interval(clock.nowUtc().minusDays(1), clock.nowUtc().plusDays(1)))
.build()); .build());
setEppInput("domain_create_landrush.xml"); setEppInput("domain_create_landrush.xml");
persistContactsAndHosts(); persistContactsAndHosts();
@ -909,7 +910,7 @@ public class DomainApplicationCreateFlowTest
// as non-superuser). // as non-superuser).
createTld("tld", TldState.LANDRUSH); createTld("tld", TldState.LANDRUSH);
persistResource(Registry.get("tld").asBuilder() persistResource(Registry.get("tld").asBuilder()
.setLrpTldStates(ImmutableSet.of(TldState.LANDRUSH)) .setLrpPeriod(new Interval(clock.nowUtc().minusDays(1), clock.nowUtc().plusDays(1)))
.build()); .build());
LrpTokenEntity token = persistResource( LrpTokenEntity token = persistResource(
new LrpTokenEntity.Builder() new LrpTokenEntity.Builder()
@ -928,7 +929,7 @@ public class DomainApplicationCreateFlowTest
public void testFailure_landrushLrpApplication_badToken() throws Exception { public void testFailure_landrushLrpApplication_badToken() throws Exception {
createTld("tld", TldState.LANDRUSH); createTld("tld", TldState.LANDRUSH);
persistResource(Registry.get("tld").asBuilder() persistResource(Registry.get("tld").asBuilder()
.setLrpTldStates(ImmutableSet.of(TldState.LANDRUSH)) .setLrpPeriod(new Interval(clock.nowUtc().minusDays(1), clock.nowUtc().plusDays(1)))
.build()); .build());
persistResource(new LrpTokenEntity.Builder() persistResource(new LrpTokenEntity.Builder()
.setToken("lrptokentest2") .setToken("lrptokentest2")
@ -946,7 +947,7 @@ public class DomainApplicationCreateFlowTest
public void testFailure_landrushLrpApplication_tokenForWrongTld() throws Exception { public void testFailure_landrushLrpApplication_tokenForWrongTld() throws Exception {
createTld("tld", TldState.LANDRUSH); createTld("tld", TldState.LANDRUSH);
persistResource(Registry.get("tld").asBuilder() persistResource(Registry.get("tld").asBuilder()
.setLrpTldStates(ImmutableSet.of(TldState.LANDRUSH)) .setLrpPeriod(new Interval(clock.nowUtc().minusDays(1), clock.nowUtc().plusDays(1)))
.build()); .build());
persistResource(new LrpTokenEntity.Builder() persistResource(new LrpTokenEntity.Builder()
.setToken("lrptokentest") .setToken("lrptokentest")
@ -967,7 +968,7 @@ public class DomainApplicationCreateFlowTest
public void testFailure_landrushLrpApplication_usedToken() throws Exception { public void testFailure_landrushLrpApplication_usedToken() throws Exception {
createTld("tld", TldState.LANDRUSH); createTld("tld", TldState.LANDRUSH);
persistResource(Registry.get("tld").asBuilder() persistResource(Registry.get("tld").asBuilder()
.setLrpTldStates(ImmutableSet.of(TldState.LANDRUSH)) .setLrpPeriod(new Interval(clock.nowUtc().minusDays(1), clock.nowUtc().plusDays(1)))
.build()); .build());
persistResource(new LrpTokenEntity.Builder() persistResource(new LrpTokenEntity.Builder()
.setToken("lrptokentest") .setToken("lrptokentest")
@ -1003,10 +1004,10 @@ public class DomainApplicationCreateFlowTest
} }
@Test @Test
public void testSuccess_landrushApplicationWithLrpToken_differentLrpState() throws Exception { public void testSuccess_landrushApplicationWithLrpToken_noLongerLrp() throws Exception {
createTld("tld"); createTld("tld");
persistResource(Registry.get("tld").asBuilder() persistResource(Registry.get("tld").asBuilder()
.setLrpTldStates(ImmutableSet.of(TldState.SUNRISE)) .setLrpPeriod(new Interval(clock.nowUtc().minusDays(2), clock.nowUtc().minusDays(1)))
.setTldStateTransitions(ImmutableSortedMap.of( .setTldStateTransitions(ImmutableSortedMap.of(
START_OF_TIME, TldState.SUNRISE, START_OF_TIME, TldState.SUNRISE,
clock.nowUtc(), TldState.LANDRUSH)) clock.nowUtc(), TldState.LANDRUSH))

View file

@ -445,21 +445,4 @@ public class RegistryTest extends EntityTestCase {
.setEapFeeSchedule(ImmutableSortedMap.of(START_OF_TIME, Money.zero(EUR))) .setEapFeeSchedule(ImmutableSortedMap.of(START_OF_TIME, Money.zero(EUR)))
.build(); .build();
} }
@Test
public void testFailure_lrpTldState_notInTransitions() {
Registry registry = Registry.get("tld").asBuilder()
.setTldStateTransitions(ImmutableSortedMap.<DateTime, TldState>naturalOrder()
.put(START_OF_TIME, TldState.PREDELEGATION)
.put(clock.nowUtc().plusMonths(1), TldState.SUNRISE)
.put(clock.nowUtc().plusMonths(3), TldState.LANDRUSH)
.put(clock.nowUtc().plusMonths(4), TldState.QUIET_PERIOD)
.put(clock.nowUtc().plusMonths(5), TldState.GENERAL_AVAILABILITY)
.build())
.build();
thrown.expect(
IllegalArgumentException.class,
"Cannot specify an LRP TLD state that is not part of the TLD state transitions.");
registry.asBuilder().setLrpTldStates(ImmutableSet.of(TldState.SUNRUSH)).build();
}
} }

View file

@ -693,7 +693,6 @@ class google.registry.model.registry.Registry {
java.lang.String tldStr; java.lang.String tldStr;
java.lang.String tldUnicode; java.lang.String tldUnicode;
java.util.Set<com.googlecode.objectify.Key<google.registry.model.registry.label.ReservedList>> reservedLists; java.util.Set<com.googlecode.objectify.Key<google.registry.model.registry.label.ReservedList>> reservedLists;
java.util.Set<google.registry.model.registry.Registry$TldState> lrpTldStates;
java.util.Set<java.lang.String> allowedFullyQualifiedHostNames; java.util.Set<java.lang.String> allowedFullyQualifiedHostNames;
java.util.Set<java.lang.String> allowedRegistrantContactIds; java.util.Set<java.lang.String> allowedRegistrantContactIds;
org.joda.money.CurrencyUnit currency; org.joda.money.CurrencyUnit currency;
@ -701,6 +700,8 @@ class google.registry.model.registry.Registry {
org.joda.money.Money restoreBillingCost; org.joda.money.Money restoreBillingCost;
org.joda.money.Money serverStatusChangeBillingCost; org.joda.money.Money serverStatusChangeBillingCost;
org.joda.time.DateTime claimsPeriodEnd; org.joda.time.DateTime claimsPeriodEnd;
org.joda.time.DateTime lrpPeriodEnd;
org.joda.time.DateTime lrpPeriodStart;
org.joda.time.Duration addGracePeriodLength; org.joda.time.Duration addGracePeriodLength;
org.joda.time.Duration anchorTenantAddGracePeriodLength; org.joda.time.Duration anchorTenantAddGracePeriodLength;
org.joda.time.Duration autoRenewGracePeriodLength; org.joda.time.Duration autoRenewGracePeriodLength;

View file

@ -35,6 +35,7 @@ import java.io.PrintStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import org.joda.money.Money; import org.joda.money.Money;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -214,25 +215,14 @@ public class CreateTldCommandTest extends CommandTestCase<CreateTldCommand> {
} }
@Test @Test
public void testSuccess_addLrpTldState() throws Exception { public void testSuccess_addLrpPeriod() throws Exception {
runCommandForced( runCommandForced(
"--lrp_tld_states=SUNRISE", "--lrp_period=2004-06-09T12:30:00Z/2004-07-10T13:30:00Z",
"--initial_tld_state=SUNRISE",
"--roid_suffix=Q9JYB4C", "--roid_suffix=Q9JYB4C",
"xn--q9jyb4c"); "xn--q9jyb4c");
assertThat(Registry.get("xn--q9jyb4c").getLrpTldStates()).containsExactly(TldState.SUNRISE); assertThat(Registry.get("xn--q9jyb4c").getLrpPeriod()).isEqualTo(
} new Interval(
DateTime.parse("2004-06-09T12:30:00Z"), DateTime.parse("2004-07-10T13:30:00Z")));
@Test
public void testSuccess_addMultipleLrpTldStates() throws Exception {
DateTime now = DateTime.now(UTC);
runCommandForced(
"--lrp_tld_states=SUNRISE,LANDRUSH",
String.format("--tld_state_transitions=%s=SUNRISE,%s=LANDRUSH", START_OF_TIME, now.plus(1)),
"--roid_suffix=Q9JYB4C",
"xn--q9jyb4c");
assertThat(Registry.get("xn--q9jyb4c").getLrpTldStates())
.containsExactly(TldState.SUNRISE, TldState.LANDRUSH);
} }
@Test @Test
@ -434,27 +424,20 @@ public class CreateTldCommandTest extends CommandTestCase<CreateTldCommand> {
} }
@Test @Test
public void testFailure_lrpTldState_notInTldStateTransitions() throws Exception { public void testFailure_addLrpPeriod_backwardsInterval() throws Exception {
thrown.expect( thrown.expect(
IllegalArgumentException.class, ParameterException.class,
"Cannot specify an LRP TLD state that is not part of the TLD state transitions."); "--lrp_period=2005-06-09T12:30:00Z/2004-07-10T13:30:00Z not an ISO-8601 interval");
runCommandForced( runCommandForced(
"--lrp_tld_states=SUNRISE", "--lrp_period=2005-06-09T12:30:00Z/2004-07-10T13:30:00Z",
"--initial_tld_state=PREDELEGATION",
"--roid_suffix=Q9JYB4C", "--roid_suffix=Q9JYB4C",
"xn--q9jyb4c"); "xn--q9jyb4c");
} }
@Test @Test
public void testFailure_lrpTldState_badTldState() throws Exception { public void testFailure_addLrpPeriod_badInterval() throws Exception {
thrown.expect( thrown.expect(ParameterException.class, "--lrp_period=foobar not an ISO-8601 interval");
IllegalArgumentException.class, runCommandForced("--lrp_period=foobar", "--roid_suffix=Q9JYB4C", "xn--q9jyb4c");
"No enum constant google.registry.model.registry.Registry.TldState.LANDRISE");
runCommandForced(
"--lrp_tld_states=LANDRISE",
"--initial_tld_state=PREDELEGATION",
"--roid_suffix=Q9JYB4C",
"xn--q9jyb4c");
} }
private void runSuccessfulReservedListsTest(String reservedLists) throws Exception { private void runSuccessfulReservedListsTest(String reservedLists) throws Exception {

View file

@ -39,6 +39,7 @@ import java.io.ByteArrayOutputStream;
import java.io.PrintStream; import java.io.PrintStream;
import org.joda.money.Money; import org.joda.money.Money;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -405,6 +406,17 @@ public class UpdateTldCommandTest extends CommandTestCase<UpdateTldCommand> {
.containsExactly("ns2.example.com"); .containsExactly("ns2.example.com");
} }
@Test
public void testSuccess_removeLrpPeriod() throws Exception {
persistResource(
Registry.get("xn--q9jyb4c").asBuilder()
.setLrpPeriod(new Interval(
DateTime.parse("2004-06-09T12:30:00Z"), DateTime.parse("2004-07-10T13:30:00Z")))
.build());
runCommandForced("--lrp_period=null", "xn--q9jyb4c");
assertThat(Registry.get("xn--q9jyb4c").getLrpPeriod()).isNull();
}
@Test @Test
public void testFailure_invalidAddGracePeriod() throws Exception { public void testFailure_invalidAddGracePeriod() throws Exception {
thrown.expect(IllegalArgumentException.class); thrown.expect(IllegalArgumentException.class);
@ -815,65 +827,25 @@ public class UpdateTldCommandTest extends CommandTestCase<UpdateTldCommand> {
} }
@Test @Test
public void testSuccess_updateLrpTldState() throws Exception { public void testSuccess_updateLrpPeriod() throws Exception {
persistResource( runCommandForced("--lrp_period=2004-06-09T12:30:00Z/2004-07-10T13:30:00Z", "xn--q9jyb4c");
Registry.get("xn--q9jyb4c").asBuilder() assertThat(Registry.get("xn--q9jyb4c").getLrpPeriod()).isEqualTo(
.setTldStateTransitions( new Interval(
ImmutableSortedMap.of( DateTime.parse("2004-06-09T12:30:00Z"), DateTime.parse("2004-07-10T13:30:00Z")));
START_OF_TIME, TldState.PREDELEGATION,
now.minusMonths(2), TldState.SUNRISE,
now.minusMonths(1), TldState.LANDRUSH,
now, TldState.GENERAL_AVAILABILITY))
.setLrpTldStates(ImmutableSet.of(TldState.SUNRISE))
.build());
runCommandForced("--lrp_tld_states=LANDRUSH", "xn--q9jyb4c");
assertThat(Registry.get("xn--q9jyb4c").getLrpTldStates()).containsExactly(TldState.LANDRUSH);
} }
@Test @Test
public void testSuccess_updateMultipleLrpTldStates() throws Exception { public void testFailure_updateLrpPeriod_backwardsInterval() throws Exception {
persistResource(
Registry.get("xn--q9jyb4c").asBuilder()
.setTldStateTransitions(
ImmutableSortedMap.of(
START_OF_TIME, TldState.PREDELEGATION,
now.minusMonths(2), TldState.SUNRISE,
now.minusMonths(1), TldState.LANDRUSH,
now, TldState.GENERAL_AVAILABILITY))
.setLrpTldStates(ImmutableSet.<TldState>of())
.build());
runCommandForced("--lrp_tld_states=SUNRISE,LANDRUSH", "xn--q9jyb4c");
assertThat(Registry.get("xn--q9jyb4c").getLrpTldStates())
.containsExactly(TldState.LANDRUSH, TldState.SUNRISE);
}
@Test
public void testFailure_updateLrpTldStates_notInTransitions() throws Exception {
persistResource(
Registry.get("xn--q9jyb4c").asBuilder()
.setTldStateTransitions(
ImmutableSortedMap.of(
START_OF_TIME, TldState.PREDELEGATION,
now.minusMonths(2), TldState.SUNRISE,
now, TldState.GENERAL_AVAILABILITY))
.setLrpTldStates(ImmutableSet.of(TldState.SUNRISE))
.build());
thrown.expect( thrown.expect(
IllegalArgumentException.class, ParameterException.class,
"Cannot specify an LRP TLD state that is not part of the TLD state transitions."); "--lrp_period=2005-06-09T12:30:00Z/2004-07-10T13:30:00Z not an ISO-8601 interval");
runCommandForced("--lrp_tld_states=LANDRUSH", "xn--q9jyb4c"); runCommandForced("--lrp_period=2005-06-09T12:30:00Z/2004-07-10T13:30:00Z", "xn--q9jyb4c");
} }
@Test @Test
public void testFailure_updateLrpTldStates_badTldState() throws Exception { public void testFailure_updateLrpPeriod_badInterval() throws Exception {
thrown.expect( thrown.expect(ParameterException.class, "--lrp_period=foobar not an ISO-8601 interval");
IllegalArgumentException.class, runCommandForced("--lrp_period=foobar", "xn--q9jyb4c");
"No enum constant google.registry.model.registry.Registry.TldState.LOUD_PERIOD");
runCommandForced(
"--lrp_tld_states=LOUD_PERIOD",
"--initial_tld_state=PREDELEGATION",
"--roid_suffix=Q9JYB4C",
"xn--q9jyb4c");
} }
private void runSuccessfulReservedListsTest(String reservedLists) throws Exception { private void runSuccessfulReservedListsTest(String reservedLists) throws Exception {

View file

@ -0,0 +1,80 @@
// 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.tools.params;
import static com.google.common.truth.Truth.assertThat;
import com.beust.jcommander.ParameterException;
import google.registry.testing.ExceptionRule;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Unit tests for {@link IntervalParameter}. */
@RunWith(JUnit4.class)
public class IntervalParameterTest {
@Rule
public final ExceptionRule thrown = new ExceptionRule();
private final IntervalParameter instance = new IntervalParameter();
@Test
public void testConvert() throws Exception {
assertThat(instance.convert("2004-06-09T12:30:00Z/2004-07-10T13:30:00Z"))
.isEqualTo(new Interval(
DateTime.parse("2004-06-09T12:30:00Z"),
DateTime.parse("2004-07-10T13:30:00Z")));
}
@Test
public void testConvert_singleDate() throws Exception {
thrown.expect(IllegalArgumentException.class);
instance.convert("2004-06-09T12:30:00Z");
}
@Test
public void testConvert_backwardsInterval() throws Exception {
thrown.expect(IllegalArgumentException.class);
instance.convert("2004-07-10T13:30:00Z/2004-06-09T12:30:00Z");
}
@Test
public void testConvert_empty_throws() throws Exception {
thrown.expect(IllegalArgumentException.class);
instance.convert("");
}
@Test
public void testConvert_null_throws() throws Exception {
thrown.expect(NullPointerException.class);
instance.convert(null);
}
@Test
public void testConvert_sillyString_throws() throws Exception {
thrown.expect(IllegalArgumentException.class);
instance.convert("foo");
}
@Test
public void testValidate_sillyString_throws() throws Exception {
thrown.expect(ParameterException.class, "--time=foo not an");
instance.validate("--time", "foo");
}
}