From 46a7956f7753df12f672f7932bf84c6d4baaeaf7 Mon Sep 17 00:00:00 2001 From: Weimin Yu Date: Thu, 1 Dec 2022 18:35:15 -0500 Subject: [PATCH] Fix nomulus GetEppResourceCommand (#1865) * Fix nomulus GetEppResourceCommand Fixes a bug in read_timestamp validation. Fixes string representation of Collection fields in Epp Resources. --- .../registry/model/ImmutableObject.java | 3 +- .../registry/tools/GetEppResourceCommand.java | 6 +- .../tools/GetEppResourceCommandTest.java | 58 +++++++++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java diff --git a/core/src/main/java/google/registry/model/ImmutableObject.java b/core/src/main/java/google/registry/model/ImmutableObject.java index 157c81e73..4efe5ef53 100644 --- a/core/src/main/java/google/registry/model/ImmutableObject.java +++ b/core/src/main/java/google/registry/model/ImmutableObject.java @@ -14,6 +14,7 @@ package google.registry.model; +import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Maps.transformValues; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.RetentionPolicy.RUNTIME; @@ -178,7 +179,7 @@ public abstract class ImmutableObject implements Cloneable { return transformValues((Map) value, ImmutableObject::hydrate); } if (value instanceof Collection) { - return ((Collection) value).stream().map(ImmutableObject::hydrate); + return transform((Collection) value, ImmutableObject::hydrate); } if (value instanceof ImmutableObject) { return ((ImmutableObject) value).toHydratedString(); diff --git a/core/src/main/java/google/registry/tools/GetEppResourceCommand.java b/core/src/main/java/google/registry/tools/GetEppResourceCommand.java index 2a2552caf..fcd6d052f 100644 --- a/core/src/main/java/google/registry/tools/GetEppResourceCommand.java +++ b/core/src/main/java/google/registry/tools/GetEppResourceCommand.java @@ -60,11 +60,11 @@ abstract class GetEppResourceCommand implements CommandWithRemoteApi { @Override public void run() { + DateTime now = clock.nowUtc(); if (readTimestamp == null) { - readTimestamp = clock.nowUtc(); + readTimestamp = now; } - checkArgument( - !readTimestamp.isBefore(clock.nowUtc()), "--read_timestamp may not be in the past"); + checkArgument(!readTimestamp.isBefore(now), "--read_timestamp may not be in the past"); runAndPrint(); } } diff --git a/core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java b/core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java new file mode 100644 index 000000000..73e5b405d --- /dev/null +++ b/core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java @@ -0,0 +1,58 @@ +// Copyright 2022 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; + +import static org.junit.Assert.assertThrows; + +import com.google.common.truth.Truth; +import google.registry.testing.FakeClock; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +/** Unit tests for {@link GetEppResourceCommand}. */ +public class GetEppResourceCommandTest { + + private static final DateTime TEST_TIME = DateTime.now(DateTimeZone.UTC); + + private final FakeClock clock = new FakeClock(TEST_TIME); + private GetEppResourceCommand commandUnderTest; + + @BeforeEach + public void setup() { + commandUnderTest = Mockito.spy(GetEppResourceCommand.class); + commandUnderTest.clock = clock; + } + + @Test + public void readTimestampAfterNow_noException() { + commandUnderTest.readTimestamp = clock.nowUtc().plusMillis(1); + commandUnderTest.run(); + } + + @Test + public void readTimestampBeforeNow_throwsException() { + commandUnderTest.readTimestamp = clock.nowUtc().minusMillis(1); + assertThrows(IllegalArgumentException.class, () -> commandUnderTest.run()); + } + + @Test + public void readTimestampNotProvided_setToNow_noException() { + commandUnderTest.run(); + Truth.assertThat(commandUnderTest.readTimestamp).isEqualTo(clock.nowUtc()); + } +}