mirror of
https://github.com/google/nomulus.git
synced 2025-07-03 09:43:30 +02:00
Import code from internal repository to git
This commit is contained in:
commit
0ef0c933d2
2490 changed files with 281594 additions and 0 deletions
|
@ -0,0 +1,293 @@
|
|||
// Copyright 2016 Google Inc. 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 com.google.domain.registry.flows.async;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static com.google.domain.registry.model.EppResourceUtils.loadByUniqueId;
|
||||
import static com.google.domain.registry.model.ofy.ObjectifyService.ofy;
|
||||
import static com.google.domain.registry.testing.ContactResourceSubject.assertAboutContacts;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.assertNoBillingEvents;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.createTld;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.getPollMessages;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.newContactResource;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistActiveContact;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistContactWithPendingTransfer;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistResource;
|
||||
import static com.google.domain.registry.util.DateTimeUtils.END_OF_TIME;
|
||||
|
||||
import com.google.common.collect.FluentIterable;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.domain.registry.model.contact.ContactAddress;
|
||||
import com.google.domain.registry.model.contact.ContactPhoneNumber;
|
||||
import com.google.domain.registry.model.contact.ContactResource;
|
||||
import com.google.domain.registry.model.contact.PostalInfo;
|
||||
import com.google.domain.registry.model.domain.DomainResource;
|
||||
import com.google.domain.registry.model.domain.ReferenceUnion;
|
||||
import com.google.domain.registry.model.eppcommon.StatusValue;
|
||||
import com.google.domain.registry.model.eppcommon.Trid;
|
||||
import com.google.domain.registry.model.poll.PendingActionNotificationResponse;
|
||||
import com.google.domain.registry.model.poll.PollMessage;
|
||||
import com.google.domain.registry.model.reporting.HistoryEntry;
|
||||
import com.google.domain.registry.model.transfer.TransferResponse;
|
||||
import com.google.domain.registry.model.transfer.TransferStatus;
|
||||
import com.google.domain.registry.request.HttpException.BadRequestException;
|
||||
|
||||
import com.googlecode.objectify.Key;
|
||||
import com.googlecode.objectify.Ref;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
/** Unit tests for {@link DeleteContactResourceAction}. */
|
||||
@RunWith(JUnit4.class)
|
||||
public class DeleteContactResourceActionTest
|
||||
extends DeleteEppResourceActionTestCase<DeleteContactResourceAction> {
|
||||
|
||||
ContactResource contactUnused;
|
||||
|
||||
@Before
|
||||
public void setup() throws Exception {
|
||||
setupDeleteEppResourceAction(new DeleteContactResourceAction());
|
||||
contactUnused = persistActiveContact("blah1235");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_contact_referencedByActiveDomain_doesNotGetDeleted() throws Exception {
|
||||
contactUsed = persistResource(
|
||||
contactUsed.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
runMapreduceWithKeyParam(Key.create(contactUsed).getString());
|
||||
contactUsed = loadByUniqueId(ContactResource.class, "blah1234", now);
|
||||
assertAboutContacts().that(contactUsed).doesNotHaveStatusValue(StatusValue.PENDING_DELETE)
|
||||
.and().hasDeletionTime(END_OF_TIME);
|
||||
domain = loadByUniqueId(DomainResource.class, "example.tld", now);
|
||||
assertThat(domain.getReferencedContacts())
|
||||
.contains(ReferenceUnion.<ContactResource>create(Ref.create(contactUsed)));
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(contactUsed, HistoryEntry.Type.CONTACT_DELETE_FAILURE);
|
||||
assertPollMessageFor(
|
||||
historyEntry,
|
||||
"TheRegistrar",
|
||||
"Can't delete contact blah1234 because it is referenced by a domain.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_contact_notReferenced_getsDeleted() throws Exception {
|
||||
contactUnused = persistResource(
|
||||
contactUnused.asBuilder()
|
||||
.setLocalizedPostalInfo(
|
||||
new PostalInfo.Builder()
|
||||
.setType(PostalInfo.Type.LOCALIZED)
|
||||
.setAddress(new ContactAddress.Builder()
|
||||
.setStreet(ImmutableList.of("123 Grand Ave"))
|
||||
.build())
|
||||
.build())
|
||||
.setInternationalizedPostalInfo(
|
||||
new PostalInfo.Builder()
|
||||
.setType(PostalInfo.Type.INTERNATIONALIZED)
|
||||
.setAddress(new ContactAddress.Builder()
|
||||
.setStreet(ImmutableList.of("123 Avenida Grande"))
|
||||
.build())
|
||||
.build())
|
||||
.setEmailAddress("bob@bob.com")
|
||||
.setVoiceNumber(new ContactPhoneNumber.Builder().setPhoneNumber("555-1212").build())
|
||||
.setFaxNumber(new ContactPhoneNumber.Builder().setPhoneNumber("555-1212").build())
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
assertAboutContacts().that(contactUnused).hasNonNullLocalizedPostalInfo()
|
||||
.and().hasNonNullInternationalizedPostalInfo()
|
||||
.and().hasNonNullEmailAddress()
|
||||
.and().hasNonNullVoiceNumber()
|
||||
.and().hasNonNullFaxNumber();
|
||||
Key<ContactResource> key = Key.create(contactUnused);
|
||||
runMapreduceWithKeyParam(key.getString());
|
||||
assertThat(loadByUniqueId(ContactResource.class, "blah1235", now)).isNull();
|
||||
ContactResource contactAfterDeletion = ofy().load().key(key).now();
|
||||
assertAboutContacts().that(contactAfterDeletion).hasDeletionTime(now)
|
||||
// Note that there will be another history entry of CONTACT_PENDING_DELETE, but this is
|
||||
// added by the flow and not the mapreduce itself.
|
||||
.and().hasOnlyOneHistoryEntryWhich().hasType(HistoryEntry.Type.CONTACT_DELETE);
|
||||
assertAboutContacts().that(contactAfterDeletion).hasNullLocalizedPostalInfo()
|
||||
.and().hasNullInternationalizedPostalInfo()
|
||||
.and().hasNullEmailAddress()
|
||||
.and().hasNullVoiceNumber()
|
||||
.and().hasNullFaxNumber();
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(contactAfterDeletion, HistoryEntry.Type.CONTACT_DELETE);
|
||||
assertPollMessageFor(historyEntry, "TheRegistrar", "Deleted contact blah1235.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_contactWithPendingTransfer_getsDeleted() throws Exception {
|
||||
ContactResource contact = persistContactWithPendingTransfer(
|
||||
persistActiveContact("sh8013").asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build(),
|
||||
transferRequestTime,
|
||||
transferExpirationTime,
|
||||
clock.nowUtc());
|
||||
runMapreduceWithKeyParam(Key.create(contact).getString());
|
||||
// Check that the contact is deleted as of now.
|
||||
assertThat(loadByUniqueId(ContactResource.class, "sh8013", now)).isNull();
|
||||
// Check that it's still there (it wasn't deleted yesterday) and that it has history.
|
||||
assertAboutContacts()
|
||||
.that(loadByUniqueId(ContactResource.class, "sh8013", now.minusDays(1)))
|
||||
.hasOneHistoryEntryEachOfTypes(
|
||||
HistoryEntry.Type.CONTACT_TRANSFER_REQUEST,
|
||||
HistoryEntry.Type.CONTACT_DELETE);
|
||||
assertNoBillingEvents();
|
||||
PollMessage deletePollMessage = Iterables.getOnlyElement(
|
||||
getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1)));
|
||||
assertThat(deletePollMessage.getMsg()).isEqualTo("Deleted contact sh8013.");
|
||||
// The poll message in the future to the gaining registrar should be gone too, but there
|
||||
// should be one at the current time to the gaining registrar.
|
||||
PollMessage gainingPollMessage = Iterables.getOnlyElement(
|
||||
getPollMessages("NewRegistrar", clock.nowUtc()));
|
||||
System.out.println(gainingPollMessage);
|
||||
assertThat(gainingPollMessage.getEventTime()).isEqualTo(clock.nowUtc());
|
||||
assertThat(
|
||||
Iterables.getOnlyElement(FluentIterable.from(gainingPollMessage.getResponseData())
|
||||
.filter(TransferResponse.class))
|
||||
.getTransferStatus())
|
||||
.isEqualTo(TransferStatus.SERVER_CANCELLED);
|
||||
PendingActionNotificationResponse panData = Iterables.getOnlyElement(FluentIterable
|
||||
.from(gainingPollMessage.getResponseData())
|
||||
.filter(PendingActionNotificationResponse.class));
|
||||
assertThat(panData.getTrid())
|
||||
.isEqualTo(Trid.create("transferClient-trid", "transferServer-trid"));
|
||||
assertThat(panData.getActionResult()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_contact_referencedByDeleteDomain_getsDeleted() throws Exception {
|
||||
contactUsed = persistResource(
|
||||
contactUsed.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
domain = persistResource(
|
||||
domain.asBuilder()
|
||||
.setDeletionTime(now.minusDays(3))
|
||||
.build());
|
||||
runMapreduceWithKeyParam(Key.create(contactUsed).getString());
|
||||
assertThat(loadByUniqueId(ContactResource.class, "blah1234", now)).isNull();
|
||||
ContactResource contactBeforeDeletion =
|
||||
loadByUniqueId(ContactResource.class, "blah1234", now.minusDays(1));
|
||||
assertAboutContacts().that(contactBeforeDeletion).hasDeletionTime(now)
|
||||
.and().hasExactlyStatusValues(StatusValue.OK)
|
||||
// Note that there will be another history entry of CONTACT_PENDING_DELETE, but this is
|
||||
// added by the flow and not the mapreduce itself.
|
||||
.and().hasOnlyOneHistoryEntryWhich().hasType(HistoryEntry.Type.CONTACT_DELETE);
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(contactBeforeDeletion, HistoryEntry.Type.CONTACT_DELETE);
|
||||
assertPollMessageFor(historyEntry, "TheRegistrar", "Deleted contact blah1234.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_notPendingDelete() throws Exception {
|
||||
thrown.expect(IllegalStateException.class, "Resource blah1235 is not set as PENDING_DELETE");
|
||||
runMapreduceWithKeyParam(Key.create(contactUnused).getString());
|
||||
assertThat(
|
||||
loadByUniqueId(ContactResource.class, "blah1235", now)).isEqualTo(contactUnused);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_notRequestedByOwner_doesNotGetDeleted() throws Exception {
|
||||
contactUnused = persistResource(
|
||||
contactUnused.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
Key<ContactResource> key = Key.create(contactUnused);
|
||||
runMapreduceWithParams(key.getString(), "OtherRegistrar", false);
|
||||
contactUnused = loadByUniqueId(ContactResource.class, "blah1235", now);
|
||||
assertAboutContacts().that(contactUnused).doesNotHaveStatusValue(StatusValue.PENDING_DELETE)
|
||||
.and().hasDeletionTime(END_OF_TIME);
|
||||
domain = loadByUniqueId(DomainResource.class, "example.tld", now);
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(contactUnused, HistoryEntry.Type.CONTACT_DELETE_FAILURE);
|
||||
assertPollMessageFor(
|
||||
historyEntry,
|
||||
"OtherRegistrar",
|
||||
"Can't delete contact blah1235 because it was transferred prior to deletion.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_notRequestedByOwner_isSuperuser_getsDeleted() throws Exception {
|
||||
contactUnused = persistResource(
|
||||
contactUnused.asBuilder()
|
||||
.setLocalizedPostalInfo(
|
||||
new PostalInfo.Builder()
|
||||
.setType(PostalInfo.Type.LOCALIZED)
|
||||
.setAddress(new ContactAddress.Builder()
|
||||
.setStreet(ImmutableList.of("123 Grand Ave"))
|
||||
.build())
|
||||
.build())
|
||||
.setInternationalizedPostalInfo(
|
||||
new PostalInfo.Builder()
|
||||
.setType(PostalInfo.Type.INTERNATIONALIZED)
|
||||
.setAddress(new ContactAddress.Builder()
|
||||
.setStreet(ImmutableList.of("123 Avenida Grande"))
|
||||
.build())
|
||||
.build())
|
||||
.setEmailAddress("bob@bob.com")
|
||||
.setVoiceNumber(new ContactPhoneNumber.Builder().setPhoneNumber("555-1212").build())
|
||||
.setFaxNumber(new ContactPhoneNumber.Builder().setPhoneNumber("555-1212").build())
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
Key<ContactResource> key = Key.create(contactUnused);
|
||||
runMapreduceWithParams(key.getString(), "OtherRegistrar", true);
|
||||
assertThat(loadByUniqueId(ContactResource.class, "blah1235", now)).isNull();
|
||||
ContactResource contactAfterDeletion = ofy().load().key(key).now();
|
||||
assertAboutContacts().that(contactAfterDeletion).hasDeletionTime(now)
|
||||
// Note that there will be another history entry of CONTACT_PENDING_DELETE, but this is
|
||||
// added by the flow and not the mapreduce itself.
|
||||
.and().hasOnlyOneHistoryEntryWhich().hasType(HistoryEntry.Type.CONTACT_DELETE);
|
||||
assertAboutContacts().that(contactAfterDeletion).hasNullLocalizedPostalInfo()
|
||||
.and().hasNullInternationalizedPostalInfo()
|
||||
.and().hasNullEmailAddress()
|
||||
.and().hasNullVoiceNumber()
|
||||
.and().hasNullFaxNumber();
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(contactAfterDeletion, HistoryEntry.Type.CONTACT_DELETE);
|
||||
assertPollMessageFor(historyEntry, "OtherRegistrar", "Deleted contact blah1235.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_targetResourceDoesntExist() throws Exception {
|
||||
createTld("tld");
|
||||
ContactResource notPersisted = newContactResource("somecontact");
|
||||
thrown.expect(
|
||||
BadRequestException.class,
|
||||
"Could not load resource for key: Key<?>(ContactResource(\"7-ROID\"))");
|
||||
runMapreduceWithKeyParam(Key.create(notPersisted).getString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_contactAlreadyDeleted() throws Exception {
|
||||
ContactResource contactDeleted = persistResource(
|
||||
newContactResource("blah1236").asBuilder()
|
||||
.setCreationTimeForTest(clock.nowUtc().minusDays(2))
|
||||
.setDeletionTime(clock.nowUtc().minusDays(1))
|
||||
.build());
|
||||
thrown.expect(
|
||||
IllegalStateException.class,
|
||||
"Resource blah1236 is already deleted.");
|
||||
runMapreduceWithKeyParam(Key.create(contactDeleted).getString());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
// Copyright 2016 Google Inc. 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 com.google.domain.registry.flows.async;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static com.google.domain.registry.model.EppResourceUtils.loadByUniqueId;
|
||||
import static com.google.domain.registry.model.ofy.ObjectifyService.ofy;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.createTld;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.getOnlyPollMessageForHistoryEntry;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.newDomainResource;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistActiveContact;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistActiveDomain;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistActiveHost;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistResource;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.domain.registry.mapreduce.MapreduceRunner;
|
||||
import com.google.domain.registry.model.contact.ContactResource;
|
||||
import com.google.domain.registry.model.domain.DomainResource;
|
||||
import com.google.domain.registry.model.domain.ReferenceUnion;
|
||||
import com.google.domain.registry.model.host.HostResource;
|
||||
import com.google.domain.registry.model.ofy.Ofy;
|
||||
import com.google.domain.registry.model.poll.PollMessage;
|
||||
import com.google.domain.registry.model.poll.PollMessage.OneTime;
|
||||
import com.google.domain.registry.model.registry.Registry;
|
||||
import com.google.domain.registry.model.reporting.HistoryEntry;
|
||||
import com.google.domain.registry.request.HttpException.BadRequestException;
|
||||
import com.google.domain.registry.testing.ExceptionRule;
|
||||
import com.google.domain.registry.testing.FakeClock;
|
||||
import com.google.domain.registry.testing.FakeResponse;
|
||||
import com.google.domain.registry.testing.InjectRule;
|
||||
import com.google.domain.registry.testing.mapreduce.MapreduceTestCase;
|
||||
|
||||
import com.googlecode.objectify.Key;
|
||||
|
||||
import org.joda.time.DateTime;
|
||||
import org.joda.time.DateTimeZone;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
/** Unit tests for {@link DeleteEppResourceAction}. */
|
||||
public abstract class DeleteEppResourceActionTestCase<T extends DeleteEppResourceAction<?>>
|
||||
extends MapreduceTestCase<T> {
|
||||
|
||||
@Rule
|
||||
public final ExceptionRule thrown = new ExceptionRule();
|
||||
|
||||
@Rule
|
||||
public final InjectRule inject = new InjectRule();
|
||||
|
||||
DateTime now = DateTime.now(DateTimeZone.UTC);
|
||||
FakeClock clock = new FakeClock(now);
|
||||
final DateTime transferRequestTime = now.minusDays(3);
|
||||
final DateTime transferExpirationTime =
|
||||
transferRequestTime.plus(Registry.DEFAULT_TRANSFER_GRACE_PERIOD);
|
||||
|
||||
ContactResource contactUsed;
|
||||
HostResource hostUsed;
|
||||
DomainResource domain;
|
||||
|
||||
public void setupDeleteEppResourceAction(T deleteEppResourceAction) throws Exception {
|
||||
action = deleteEppResourceAction;
|
||||
action.mrRunner = new MapreduceRunner(Optional.<Integer>absent(), Optional.<Integer>absent());
|
||||
action.response = new FakeResponse();
|
||||
inject.setStaticField(Ofy.class, "clock", clock);
|
||||
inject.setStaticField(DeleteEppResourceAction.class, "clock", clock);
|
||||
|
||||
createTld("tld");
|
||||
contactUsed = persistActiveContact("blah1234");
|
||||
hostUsed = persistActiveHost("ns1.example.tld");
|
||||
domain = persistResource(
|
||||
newDomainResource("example.tld", contactUsed).asBuilder()
|
||||
.setNameservers(ImmutableSet.of(ReferenceUnion.create(hostUsed)))
|
||||
.build());
|
||||
}
|
||||
|
||||
void runMapreduce() throws Exception {
|
||||
clock.advanceOneMilli();
|
||||
action.run();
|
||||
executeTasksUntilEmpty("mapreduce");
|
||||
ofy().clearSessionCache();
|
||||
now = clock.nowUtc();
|
||||
}
|
||||
|
||||
void runMapreduceWithParams(
|
||||
String resourceKeyString,
|
||||
String requestingClientId,
|
||||
boolean isSuperuser) throws Exception {
|
||||
action.resourceKeyString = resourceKeyString;
|
||||
action.requestingClientId = requestingClientId;
|
||||
action.isSuperuser = isSuperuser;
|
||||
runMapreduce();
|
||||
}
|
||||
|
||||
void runMapreduceWithKeyParam(String resourceKeyString) throws Exception {
|
||||
runMapreduceWithParams(resourceKeyString, "TheRegistrar", false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to check that one poll message exists with a given history entry, resource,
|
||||
* client id, and message.
|
||||
*/
|
||||
void assertPollMessageFor(
|
||||
HistoryEntry historyEntry,
|
||||
String clientId,
|
||||
String msg) {
|
||||
PollMessage.OneTime pollMessage = (OneTime) getOnlyPollMessageForHistoryEntry(historyEntry);
|
||||
assertThat(msg).isEqualTo(pollMessage.getMsg());
|
||||
assertThat(now).isEqualTo(pollMessage.getEventTime());
|
||||
assertThat(clientId).isEqualTo(pollMessage.getClientId());
|
||||
assertThat(pollMessage.getClientId()).isEqualTo(clientId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_domainKeyPassed() throws Exception {
|
||||
DomainResource domain = persistActiveDomain("fail.tld");
|
||||
thrown.expect(
|
||||
IllegalArgumentException.class, "Cannot delete a DomainResource via this action.");
|
||||
runMapreduceWithKeyParam(Key.create(domain).getString());
|
||||
assertThat(loadByUniqueId(DomainResource.class, "fail.tld", now)).isEqualTo(domain);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_badKeyPassed() throws Exception {
|
||||
createTld("tld");
|
||||
thrown.expect(BadRequestException.class, "Could not parse key string: a bad key");
|
||||
runMapreduceWithKeyParam("a bad key");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,226 @@
|
|||
// Copyright 2016 Google Inc. 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 com.google.domain.registry.flows.async;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static com.google.domain.registry.model.EppResourceUtils.loadByUniqueId;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.assertNoBillingEvents;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.createTld;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.newDomainResource;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.newHostResource;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistActiveHost;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistResource;
|
||||
import static com.google.domain.registry.testing.HostResourceSubject.assertAboutHosts;
|
||||
import static com.google.domain.registry.testing.TaskQueueHelper.assertDnsTasksEnqueued;
|
||||
import static com.google.domain.registry.util.DateTimeUtils.END_OF_TIME;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.domain.registry.model.domain.DomainResource;
|
||||
import com.google.domain.registry.model.domain.ReferenceUnion;
|
||||
import com.google.domain.registry.model.eppcommon.StatusValue;
|
||||
import com.google.domain.registry.model.host.HostResource;
|
||||
import com.google.domain.registry.model.reporting.HistoryEntry;
|
||||
import com.google.domain.registry.request.HttpException.BadRequestException;
|
||||
|
||||
import com.googlecode.objectify.Key;
|
||||
import com.googlecode.objectify.Ref;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
/** Unit tests for {@link DeleteHostResourceAction}. */
|
||||
@RunWith(JUnit4.class)
|
||||
public class DeleteHostResourceActionTest
|
||||
extends DeleteEppResourceActionTestCase<DeleteHostResourceAction> {
|
||||
|
||||
HostResource hostUnused;
|
||||
|
||||
@Before
|
||||
public void setup() throws Exception {
|
||||
setupDeleteEppResourceAction(new DeleteHostResourceAction());
|
||||
hostUnused = persistActiveHost("ns2.example.tld");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_host_referencedByActiveDomain_doesNotGetDeleted() throws Exception {
|
||||
hostUsed = persistResource(
|
||||
hostUsed.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
runMapreduceWithKeyParam(Key.create(hostUsed).getString());
|
||||
hostUsed = loadByUniqueId(HostResource.class, "ns1.example.tld", now);
|
||||
assertAboutHosts().that(hostUsed).doesNotHaveStatusValue(StatusValue.PENDING_DELETE)
|
||||
.and().hasDeletionTime(END_OF_TIME);
|
||||
domain = loadByUniqueId(DomainResource.class, "example.tld", now);
|
||||
assertThat(domain.getNameservers())
|
||||
.contains(ReferenceUnion.<HostResource>create(Ref.create(hostUsed)));
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(hostUsed, HistoryEntry.Type.HOST_DELETE_FAILURE);
|
||||
assertPollMessageFor(
|
||||
historyEntry,
|
||||
"TheRegistrar",
|
||||
"Can't delete host ns1.example.tld because it is referenced by a domain.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_host_notReferenced_getsDeleted() throws Exception {
|
||||
hostUnused = persistResource(
|
||||
hostUnused.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
runMapreduceWithKeyParam(Key.create(hostUnused).getString());
|
||||
assertThat(loadByUniqueId(HostResource.class, "ns2.example.tld", now)).isNull();
|
||||
HostResource hostBeforeDeletion =
|
||||
loadByUniqueId(HostResource.class, "ns2.example.tld", now.minusDays(1));
|
||||
assertAboutHosts().that(hostBeforeDeletion).hasDeletionTime(now)
|
||||
.and().hasExactlyStatusValues(StatusValue.OK)
|
||||
// Note that there will be another history entry of HOST_PENDING_DELETE, but this is
|
||||
// added by the flow and not the mapreduce itself.
|
||||
.and().hasOnlyOneHistoryEntryWhich().hasType(HistoryEntry.Type.HOST_DELETE);
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(hostBeforeDeletion, HistoryEntry.Type.HOST_DELETE);
|
||||
assertPollMessageFor(historyEntry, "TheRegistrar", "Deleted host ns2.example.tld.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_host_referencedByDeletedDomain_getsDeleted() throws Exception {
|
||||
hostUsed = persistResource(
|
||||
hostUsed.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
domain = persistResource(
|
||||
domain.asBuilder()
|
||||
.setDeletionTime(now.minusDays(3))
|
||||
.build());
|
||||
runMapreduceWithKeyParam(Key.create(hostUsed).getString());
|
||||
assertThat(loadByUniqueId(HostResource.class, "ns1.example.tld", now)).isNull();
|
||||
HostResource hostBeforeDeletion =
|
||||
loadByUniqueId(HostResource.class, "ns1.example.tld", now.minusDays(1));
|
||||
assertAboutHosts().that(hostBeforeDeletion).hasDeletionTime(now)
|
||||
.and().hasExactlyStatusValues(StatusValue.OK)
|
||||
// Note that there will be another history entry of HOST_PENDING_DELETE, but this is
|
||||
// added by the flow and not the mapreduce itself.
|
||||
.and().hasOnlyOneHistoryEntryWhich().hasType(HistoryEntry.Type.HOST_DELETE);
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(hostBeforeDeletion, HistoryEntry.Type.HOST_DELETE);
|
||||
assertPollMessageFor(historyEntry, "TheRegistrar", "Deleted host ns1.example.tld.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_subordinateHost_getsDeleted() throws Exception {
|
||||
domain = persistResource(
|
||||
newDomainResource("example.tld").asBuilder()
|
||||
.setSubordinateHosts(ImmutableSet.of("ns2.example.tld"))
|
||||
.build());
|
||||
persistResource(
|
||||
hostUnused.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.setSuperordinateDomain(Ref.create(domain))
|
||||
.build());
|
||||
runMapreduceWithKeyParam(Key.create(hostUnused).getString());
|
||||
// Check that the host is deleted as of now.
|
||||
assertThat(loadByUniqueId(HostResource.class, "ns2.example.tld", clock.nowUtc()))
|
||||
.isNull();
|
||||
assertNoBillingEvents();
|
||||
assertThat(loadByUniqueId(DomainResource.class, "example.tld", clock.nowUtc())
|
||||
.getSubordinateHosts())
|
||||
.isEmpty();
|
||||
assertDnsTasksEnqueued("ns2.example.tld");
|
||||
HostResource hostBeforeDeletion =
|
||||
loadByUniqueId(HostResource.class, "ns2.example.tld", now.minusDays(1));
|
||||
assertAboutHosts().that(hostBeforeDeletion).hasDeletionTime(now)
|
||||
.and().hasExactlyStatusValues(StatusValue.OK)
|
||||
.and().hasOnlyOneHistoryEntryWhich().hasType(HistoryEntry.Type.HOST_DELETE);
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(hostBeforeDeletion, HistoryEntry.Type.HOST_DELETE);
|
||||
assertPollMessageFor(historyEntry, "TheRegistrar", "Deleted host ns2.example.tld.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_notPendingDelete() throws Exception {
|
||||
thrown.expect(
|
||||
IllegalStateException.class, "Resource ns2.example.tld is not set as PENDING_DELETE");
|
||||
runMapreduceWithKeyParam(Key.create(hostUnused).getString());
|
||||
assertThat(
|
||||
loadByUniqueId(HostResource.class, "ns2.example.tld", now)).isEqualTo(hostUnused);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_notRequestedByOwner_doesNotGetDeleted() throws Exception {
|
||||
hostUnused = persistResource(
|
||||
hostUnused.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
Key<HostResource> key = Key.create(hostUnused);
|
||||
runMapreduceWithParams(key.getString(), "OtherRegistrar", false);
|
||||
hostUnused = loadByUniqueId(HostResource.class, "ns2.example.tld", now);
|
||||
assertAboutHosts().that(hostUnused).doesNotHaveStatusValue(StatusValue.PENDING_DELETE)
|
||||
.and().hasDeletionTime(END_OF_TIME);
|
||||
domain = loadByUniqueId(DomainResource.class, "example.tld", now);
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(hostUnused, HistoryEntry.Type.HOST_DELETE_FAILURE);
|
||||
assertPollMessageFor(
|
||||
historyEntry,
|
||||
"OtherRegistrar",
|
||||
"Can't delete host ns2.example.tld because it was transferred prior to deletion.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_notRequestedByOwner_isSuperuser_getsDeleted() throws Exception {
|
||||
hostUnused = persistResource(
|
||||
hostUnused.asBuilder()
|
||||
.addStatusValue(StatusValue.PENDING_DELETE)
|
||||
.build());
|
||||
Key<HostResource> key = Key.create(hostUnused);
|
||||
runMapreduceWithParams(key.getString(), "OtherRegistrar", true);
|
||||
assertThat(loadByUniqueId(HostResource.class, "ns2.example.tld", now)).isNull();
|
||||
HostResource hostBeforeDeletion =
|
||||
loadByUniqueId(HostResource.class, "ns2.example.tld", now.minusDays(1));
|
||||
assertAboutHosts().that(hostBeforeDeletion).hasDeletionTime(now)
|
||||
.and().hasExactlyStatusValues(StatusValue.OK)
|
||||
// Note that there will be another history entry of HOST_PENDING_DELETE, but this is
|
||||
// added by the flow and not the mapreduce itself.
|
||||
.and().hasOnlyOneHistoryEntryWhich().hasType(HistoryEntry.Type.HOST_DELETE);
|
||||
HistoryEntry historyEntry =
|
||||
getOnlyHistoryEntryOfType(hostBeforeDeletion, HistoryEntry.Type.HOST_DELETE);
|
||||
assertPollMessageFor(historyEntry, "OtherRegistrar", "Deleted host ns2.example.tld.");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_targetResourceDoesntExist() throws Exception {
|
||||
createTld("tld");
|
||||
HostResource notPersisted = newHostResource("ns1.example.tld");
|
||||
thrown.expect(
|
||||
BadRequestException.class,
|
||||
"Could not load resource for key: Key<?>(HostResource(\"7-ROID\"))");
|
||||
runMapreduceWithKeyParam(Key.create(notPersisted).getString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_hostAlreadyDeleted() throws Exception {
|
||||
HostResource hostDeleted = persistResource(
|
||||
newHostResource("ns3.example.tld").asBuilder()
|
||||
.setCreationTimeForTest(clock.nowUtc().minusDays(2))
|
||||
.setDeletionTime(clock.nowUtc().minusDays(1))
|
||||
.build());
|
||||
thrown.expect(
|
||||
IllegalStateException.class,
|
||||
"Resource ns3.example.tld is already deleted.");
|
||||
runMapreduceWithKeyParam(Key.create(hostDeleted).getString());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
// Copyright 2016 Google Inc. 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 com.google.domain.registry.flows.async;
|
||||
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.createTld;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.newDomainApplication;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.newDomainResource;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.newHostResource;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistActiveHost;
|
||||
import static com.google.domain.registry.testing.DatastoreHelper.persistResource;
|
||||
import static com.google.domain.registry.util.DateTimeUtils.START_OF_TIME;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.domain.registry.dns.DnsQueue;
|
||||
import com.google.domain.registry.mapreduce.MapreduceRunner;
|
||||
import com.google.domain.registry.model.domain.ReferenceUnion;
|
||||
import com.google.domain.registry.model.host.HostResource;
|
||||
import com.google.domain.registry.request.HttpException.BadRequestException;
|
||||
import com.google.domain.registry.testing.ExceptionRule;
|
||||
import com.google.domain.registry.testing.FakeResponse;
|
||||
import com.google.domain.registry.testing.InjectRule;
|
||||
import com.google.domain.registry.testing.mapreduce.MapreduceTestCase;
|
||||
|
||||
import com.googlecode.objectify.Key;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
|
||||
/** Unit tests for {@link DnsRefreshForHostRenameAction}. */
|
||||
@RunWith(JUnit4.class)
|
||||
public class DnsRefreshForHostRenameActionTest
|
||||
extends MapreduceTestCase<DnsRefreshForHostRenameAction> {
|
||||
|
||||
@Rule
|
||||
public final ExceptionRule thrown = new ExceptionRule();
|
||||
|
||||
@Rule
|
||||
public InjectRule inject = new InjectRule();
|
||||
|
||||
private final DnsQueue dnsQueue = mock(DnsQueue.class);
|
||||
|
||||
@Before
|
||||
public void setup() throws Exception {
|
||||
inject.setStaticField(DnsRefreshForHostRenameAction.class, "dnsQueue", dnsQueue);
|
||||
}
|
||||
|
||||
private void runMapreduce(String hostKeyString) throws Exception {
|
||||
action = new DnsRefreshForHostRenameAction();
|
||||
action.hostKeyString = hostKeyString;
|
||||
action.mrRunner = new MapreduceRunner(Optional.<Integer>absent(), Optional.<Integer>absent());
|
||||
action.response = new FakeResponse();
|
||||
action.run();
|
||||
executeTasksUntilEmpty("mapreduce");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_dnsUpdateEnqueued() throws Exception {
|
||||
createTld("tld");
|
||||
HostResource renamedHost = persistActiveHost("ns1.example.tld");
|
||||
HostResource otherHost = persistActiveHost("ns2.example.tld");
|
||||
persistResource(newDomainApplication("notadomain.tld").asBuilder()
|
||||
.setNameservers(ImmutableSet.of(ReferenceUnion.create(renamedHost)))
|
||||
.build());
|
||||
persistResource(newDomainResource("example.tld").asBuilder()
|
||||
.setNameservers(ImmutableSet.of(ReferenceUnion.create(renamedHost)))
|
||||
.build());
|
||||
persistResource(newDomainResource("otherexample.tld").asBuilder()
|
||||
.setNameservers(ImmutableSet.of(ReferenceUnion.create(renamedHost)))
|
||||
.build());
|
||||
persistResource(newDomainResource("untouched.tld").asBuilder()
|
||||
.setNameservers(ImmutableSet.of(ReferenceUnion.create(otherHost)))
|
||||
.build());
|
||||
runMapreduce(Key.create(renamedHost).getString());
|
||||
verify(dnsQueue).addDomainRefreshTask("example.tld");
|
||||
verify(dnsQueue).addDomainRefreshTask("otherexample.tld");
|
||||
verifyNoMoreInteractions(dnsQueue);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_noDnsTasksForDeletedDomain() throws Exception {
|
||||
createTld("tld");
|
||||
HostResource renamedHost = persistActiveHost("ns1.example.tld");
|
||||
persistResource(newDomainResource("example.tld").asBuilder()
|
||||
.setNameservers(ImmutableSet.of(ReferenceUnion.create(renamedHost)))
|
||||
.setDeletionTime(START_OF_TIME)
|
||||
.build());
|
||||
runMapreduce(Key.create(renamedHost).getString());
|
||||
verifyZeroInteractions(dnsQueue);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_badKeyPassed() throws Exception {
|
||||
createTld("tld");
|
||||
thrown.expect(BadRequestException.class, "Could not parse key string: a bad key");
|
||||
runMapreduce("a bad key");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_hostDoesntExist() throws Exception {
|
||||
createTld("tld");
|
||||
HostResource notPersistedHost = newHostResource("ns1.example.tld");
|
||||
thrown.expect(
|
||||
BadRequestException.class,
|
||||
"Could not load resource for key: Key<?>(HostResource(\"2-ROID\"))");
|
||||
runMapreduce(Key.create(notPersistedHost).getString());
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue