diff --git a/javatests/google/registry/flows/EppLifecycleDomainTest.java b/javatests/google/registry/flows/EppLifecycleDomainTest.java index c04bdae8c..a226f0b49 100644 --- a/javatests/google/registry/flows/EppLifecycleDomainTest.java +++ b/javatests/google/registry/flows/EppLifecycleDomainTest.java @@ -14,8 +14,12 @@ package google.registry.flows; +import static google.registry.model.eppoutput.Result.Code.SUCCESS; +import static google.registry.model.eppoutput.Result.Code.SUCCESS_AND_CLOSE; +import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING; import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTlds; +import static google.registry.testing.EppMetricSubject.assertThat; import static google.registry.util.DateTimeUtils.START_OF_TIME; import com.google.common.collect.ImmutableMap; @@ -36,10 +40,8 @@ import org.junit.runners.JUnit4; public class EppLifecycleDomainTest extends EppTestCase { @Rule - public final AppEngineRule appEngine = AppEngineRule.builder() - .withDatastore() - .withTaskQueue() - .build(); + public final AppEngineRule appEngine = + AppEngineRule.builder().withDatastore().withTaskQueue().build(); @Before public void initTld() { @@ -60,13 +62,9 @@ public class EppLifecycleDomainTest extends EppTestCase { "contact_create_response_jd1234.xml", startTime.plusMinutes(1)); assertCommandAndResponse( - "host_create.xml", - "host_create_response.xml", - startTime.plusMinutes(2)); + "host_create.xml", "host_create_response.xml", startTime.plusMinutes(2)); assertCommandAndResponse( - "host_create2.xml", - "host_create2_response.xml", - startTime.plusMinutes(3)); + "host_create2.xml", "host_create2_response.xml", startTime.plusMinutes(3)); } /** Creates the domain fakesite.example with two nameservers on it. */ @@ -175,7 +173,7 @@ public class EppLifecycleDomainTest extends EppTestCase { assertCommandAndResponse( "domain_info.xml", "domain_info_response_pendingdelete.xml", - DateTime.parse("2000-08-01T00:02:00Z")); // 1 day out. + DateTime.parse("2000-08-01T00:02:00Z")); // 1 day out. assertCommandAndResponse("logout.xml", "logout_response.xml"); } @@ -195,6 +193,12 @@ public class EppLifecycleDomainTest extends EppTestCase { @Test public void testDeletionOfDomain_afterRenameOfSubordinateHost_succeeds() throws Exception { assertCommandAndResponse("login_valid.xml", "login_response.xml"); + assertThat(getRecordedEppMetric()) + .hasClientId("NewRegistrar") + .and() + .hasCommandName("Login") + .and() + .hasStatus(SUCCESS); createFakesite(); createSubordinateHost(); // Update the ns3 host to no longer be on fakesite.example domain. @@ -202,17 +206,48 @@ public class EppLifecycleDomainTest extends EppTestCase { "host_update_fakesite.xml", "generic_success_response.xml", DateTime.parse("2002-05-30T01:01:00Z")); + // Add assert about EppMetric + assertThat(getRecordedEppMetric()) + .hasClientId("NewRegistrar") + .and() + .hasCommandName("HostUpdate") + .and() + .hasEppTarget("ns3.fakesite.example") + .and() + .hasStatus(SUCCESS); // Delete the fakesite.example domain (which should succeed since it no longer has subords). assertCommandAndResponse( "domain_delete_fakesite.xml", "generic_success_action_pending_response.xml", DateTime.parse("2002-05-30T01:02:00Z")); + assertThat(getRecordedEppMetric()) + .hasClientId("NewRegistrar") + .and() + .hasCommandName("DomainDelete") + .and() + .hasEppTarget("fakesite.example") + .and() + .hasStatus(SUCCESS_WITH_ACTION_PENDING); // Check info on the renamed host and verify that it's still around and wasn't deleted. assertCommandAndResponse( "host_info_ns9000_example.xml", "host_info_response_ns9000_example.xml", DateTime.parse("2002-06-30T01:03:00Z")); + assertThat(getRecordedEppMetric()) + .hasClientId("NewRegistrar") + .and() + .hasCommandName("HostInfo") + .and() + .hasEppTarget("ns9000.example.external") + .and() + .hasStatus(SUCCESS); assertCommandAndResponse("logout.xml", "logout_response.xml"); + assertThat(getRecordedEppMetric()) + .hasClientId("NewRegistrar") + .and() + .hasCommandName("Logout") + .and() + .hasStatus(SUCCESS_AND_CLOSE); } @Test @@ -259,10 +294,15 @@ public class EppLifecycleDomainTest extends EppTestCase { @Test public void testDomainCreation_failsBeforeSunrise() throws Exception { DateTime sunriseDate = DateTime.parse("2000-05-30T00:00:00Z"); - createTld("example", ImmutableSortedMap.of( - START_OF_TIME, TldState.PREDELEGATION, - sunriseDate, TldState.SUNRISE, - sunriseDate.plusMonths(2), TldState.GENERAL_AVAILABILITY)); + createTld( + "example", + ImmutableSortedMap.of( + START_OF_TIME, + TldState.PREDELEGATION, + sunriseDate, + TldState.SUNRISE, + sunriseDate.plusMonths(2), + TldState.GENERAL_AVAILABILITY)); assertCommandAndResponse("login_valid.xml", "login_response.xml"); @@ -284,9 +324,11 @@ public class EppLifecycleDomainTest extends EppTestCase { @Test public void testDomainCheckFee_succeeds() throws Exception { DateTime gaDate = DateTime.parse("2000-05-30T00:00:00Z"); - createTld("example", ImmutableSortedMap.of( - START_OF_TIME, TldState.PREDELEGATION, - gaDate, TldState.GENERAL_AVAILABILITY)); + createTld( + "example", + ImmutableSortedMap.of( + START_OF_TIME, TldState.PREDELEGATION, + gaDate, TldState.GENERAL_AVAILABILITY)); assertCommandAndResponse("login_valid_fee_extension.xml", "login_response.xml"); @@ -307,10 +349,11 @@ public class EppLifecycleDomainTest extends EppTestCase { // As the winning registrar, request a transfer. Capture the server trid; we'll need it later. assertCommandAndResponse("login2_valid.xml", "login_response.xml"); - String response = assertCommandAndResponse( - "domain_transfer_request_1_year.xml", - "domain_transfer_response_1_year.xml", - DateTime.parse("2001-01-01T00:00:00Z")); + String response = + assertCommandAndResponse( + "domain_transfer_request_1_year.xml", + "domain_transfer_response_1_year.xml", + DateTime.parse("2001-01-01T00:00:00Z")); Matcher matcher = Pattern.compile("(.*)").matcher(response); matcher.find(); String transferRequestTrid = matcher.group(1); @@ -327,7 +370,7 @@ public class EppLifecycleDomainTest extends EppTestCase { ImmutableMap.of("ID", "1-C-EXAMPLE-17-23"), "poll_ack_response_empty.xml", null, - DateTime.parse("2001-01-01T00:01:00Z")); + DateTime.parse("2001-01-01T00:01:00Z")); // Five days in the future, expect a server approval poll message to the loser, and ack it. assertCommandAndResponse( @@ -376,8 +419,7 @@ public class EppLifecycleDomainTest extends EppTestCase { assertCommandAndResponse("logout.xml", "logout_response.xml"); // Log back in as the first registrar and verify things. - assertCommandAndResponse( - "login_valid.xml", "login_response.xml"); + assertCommandAndResponse("login_valid.xml", "login_response.xml"); assertCommandAndResponse( "domain_info_fakesite.xml", "domain_info_response_fakesite_pending_transfer.xml", @@ -421,7 +463,8 @@ public class EppLifecycleDomainTest extends EppTestCase { // Log back in as the first registrar and verify domain is pending transfer. assertCommandAndResponse("login_valid.xml", "login_response.xml"); - assertCommandAndResponse("domain_info_fakesite.xml", + assertCommandAndResponse( + "domain_info_fakesite.xml", "domain_info_response_fakesite_3_nameservers_pending_transfer.xml", DateTime.parse("2002-05-30T01:00:00Z")); assertCommandAndResponse("logout.xml", "logout_response.xml"); @@ -502,7 +545,8 @@ public class EppLifecycleDomainTest extends EppTestCase { assertCommandAndResponse("login2_valid.xml", "login_response.xml"); assertCommandAndResponse( "domain_transfer_request_1_year.xml", - "domain_transfer_response_1_year.xml", DateTime.parse("2001-01-01T00:00:00Z")); + "domain_transfer_response_1_year.xml", + DateTime.parse("2001-01-01T00:00:00Z")); assertCommandAndResponse("logout.xml", "logout_response.xml"); assertCommandAndResponse("login_valid.xml", "login_response.xml"); @@ -587,7 +631,7 @@ public class EppLifecycleDomainTest extends EppTestCase { assertCommandAndResponse( "domain_transfer_query_fakesite.xml", "domain_transfer_query_response_no_transfer_history.xml", - DateTime.parse("2000-09-02T00:00:00Z")); + DateTime.parse("2000-09-02T00:00:00Z")); assertCommandAndResponse("logout.xml", "logout_response.xml"); // Request a transfer of the domain to the second registrar. assertCommandAndResponse("login2_valid.xml", "login_response.xml"); diff --git a/javatests/google/registry/flows/EppLifecycleLoginTest.java b/javatests/google/registry/flows/EppLifecycleLoginTest.java index 7a8bf4a15..21e9b691b 100644 --- a/javatests/google/registry/flows/EppLifecycleLoginTest.java +++ b/javatests/google/registry/flows/EppLifecycleLoginTest.java @@ -14,7 +14,9 @@ package google.registry.flows; -import static com.google.common.truth.Truth.assertThat; +import static google.registry.model.eppoutput.Result.Code.SUCCESS; +import static google.registry.model.eppoutput.Result.Code.SUCCESS_AND_CLOSE; +import static google.registry.testing.EppMetricSubject.assertThat; import google.registry.testing.AppEngineRule; import org.junit.Rule; @@ -31,10 +33,20 @@ public class EppLifecycleLoginTest extends EppTestCase { AppEngineRule.builder().withDatastore().withTaskQueue().build(); @Test - public void testLoginAndLogout_recordClientIdInEppMetric() throws Exception { + public void testLoginAndLogout_recordsEppMetric() throws Exception { assertCommandAndResponse("login_valid.xml", "login_response.xml"); - assertThat(getRecordedEppMetric().getClientId()).hasValue("NewRegistrar"); + assertThat(getRecordedEppMetric()) + .hasClientId("NewRegistrar") + .and() + .hasCommandName("Login") + .and() + .hasStatus(SUCCESS); assertCommandAndResponse("logout.xml", "logout_response.xml"); - assertThat(getRecordedEppMetric().getClientId()).hasValue("NewRegistrar"); + assertThat(getRecordedEppMetric()) + .hasClientId("NewRegistrar") + .and() + .hasCommandName("Logout") + .and() + .hasStatus(SUCCESS_AND_CLOSE); } } diff --git a/javatests/google/registry/testing/BUILD b/javatests/google/registry/testing/BUILD index cbb49cab2..c92218e05 100644 --- a/javatests/google/registry/testing/BUILD +++ b/javatests/google/registry/testing/BUILD @@ -26,6 +26,7 @@ java_library( "//java/google/registry/flows", "//java/google/registry/keyring/api", "//java/google/registry/model", + "//java/google/registry/monitoring/whitebox", "//java/google/registry/pricing", "//java/google/registry/request", "//java/google/registry/tmch", diff --git a/javatests/google/registry/testing/EppMetricSubject.java b/javatests/google/registry/testing/EppMetricSubject.java new file mode 100644 index 000000000..e937d8439 --- /dev/null +++ b/javatests/google/registry/testing/EppMetricSubject.java @@ -0,0 +1,78 @@ +// Copyright 2017 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.testing; + +import static com.google.common.truth.Truth.assertAbout; +import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; + +import com.google.common.base.Optional; +import com.google.common.truth.FailureStrategy; +import com.google.common.truth.Subject; +import com.google.common.truth.SubjectFactory; +import google.registry.model.eppoutput.Result.Code; +import google.registry.monitoring.whitebox.EppMetric; +import google.registry.testing.TruthChainer.And; +import java.util.Objects; +import javax.annotation.Nullable; + +/** Utility methods for asserting things about {@link EppMetric} instances. */ +public class EppMetricSubject extends Subject { + + public EppMetricSubject(FailureStrategy strategy, EppMetric subject) { + super(strategy, subject); + } + + public static EppMetricSubject assertThat(EppMetric subject) { + return assertAbout(SUBJECT_FACTORY).that(subject); + } + + public And hasClientId(String clientId) { + return hasValue(clientId, actual().getClientId(), "has clientId"); + } + + public And hasCommandName(String commandName) { + return hasValue(commandName, actual().getCommandName(), "has commandName"); + } + + public And hasEppTarget(String eppTarget) { + return hasValue(eppTarget, actual().getEppTarget(), "has eppTarget"); + } + + public And hasStatus(Code status) { + return hasValue(status, actual().getStatus(), "has status"); + } + + private And hasValue(E expected, Optional actual, String verb) { + checkArgumentNotNull(expected, "Expected value cannot be null"); + if (actual == null) { + fail("is non-null", expected); + } else if (!actual.isPresent()) { + fail("has value", expected); + } else if (!Objects.equals(expected, actual.get())) { + failWithBadResults(verb, expected, verb, actual); + } + return new And<>(this); + } + + /** {@link SubjectFactory} for assertions about {@link EppMetric} objects. */ + private static final SubjectFactory SUBJECT_FACTORY = + new SubjectFactory() { + @Override + public EppMetricSubject getSubject( + FailureStrategy failureStrategy, @Nullable EppMetric target) { + return new EppMetricSubject(failureStrategy, target); + } + }; +}