From 39dc883b342f4ffab175195bb0a2e809f8bcd164 Mon Sep 17 00:00:00 2001 From: Aaditya Gavandalkar Date: Wed, 21 Aug 2019 23:20:34 -0700 Subject: [PATCH] context: Implement equals and hashCode for Deadline (grpc#6075) --- context/build.gradle | 2 +- context/src/main/java/io/grpc/Deadline.java | 25 +++++++++++++++++++ .../src/test/java/io/grpc/DeadlineTest.java | 15 +++++++++++ .../java/io/grpc/internal/ClientCallImpl.java | 4 +-- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/context/build.gradle b/context/build.gradle index c38132ab50..1513cbcb88 100644 --- a/context/build.gradle +++ b/context/build.gradle @@ -1,7 +1,7 @@ description = 'gRPC: Context' dependencies { - testCompile libraries.jsr305 + testCompile libraries.jsr305, libraries.guava_testlib signature "org.codehaus.mojo.signature:java17:1.0@signature" signature "net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature" } diff --git a/context/src/main/java/io/grpc/Deadline.java b/context/src/main/java/io/grpc/Deadline.java index 778bdd4b49..c7b50e0929 100644 --- a/context/src/main/java/io/grpc/Deadline.java +++ b/context/src/main/java/io/grpc/Deadline.java @@ -16,6 +16,7 @@ package io.grpc; +import java.util.Arrays; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -231,6 +232,30 @@ public final class Deadline implements Comparable { return 0; } + @Override + public int hashCode() { + return Arrays.asList(this.ticker, this.deadlineNanos).hashCode(); + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof Deadline)) { + return false; + } + + final Deadline other = (Deadline) o; + if (this.ticker == null ? other.ticker != null : this.ticker != other.ticker) { + return false; + } + if (this.deadlineNanos != other.deadlineNanos) { + return false; + } + return true; + } + /** * Time source representing nanoseconds since fixed but arbitrary point in time. * diff --git a/context/src/test/java/io/grpc/DeadlineTest.java b/context/src/test/java/io/grpc/DeadlineTest.java index 5f35918796..69f849bea7 100644 --- a/context/src/test/java/io/grpc/DeadlineTest.java +++ b/context/src/test/java/io/grpc/DeadlineTest.java @@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import com.google.common.testing.EqualsTester; import com.google.common.truth.Truth; import java.util.Arrays; import java.util.concurrent.Future; @@ -310,6 +311,20 @@ public class DeadlineTest { assertEquals("0.000012000s from now (ticker=FAKE_TICKER)", d.toString()); } + @Test + public void equality() { + final Deadline d1 = Deadline.after(12, TimeUnit.MICROSECONDS, ticker); + final Deadline d2 = Deadline.after(12, TimeUnit.MICROSECONDS, ticker); + final Deadline d3 = Deadline.after(12, TimeUnit.MICROSECONDS, new FakeTicker()); + final Deadline d4 = Deadline.after(10, TimeUnit.MICROSECONDS, ticker); + + new EqualsTester() + .addEqualityGroup(d1, d2) + .addEqualityGroup(d3) + .addEqualityGroup(d4) + .testEquals(); + } + private static class FakeTicker extends Deadline.Ticker { private long time; diff --git a/core/src/main/java/io/grpc/internal/ClientCallImpl.java b/core/src/main/java/io/grpc/internal/ClientCallImpl.java index af212c0a31..b3e431bbab 100644 --- a/core/src/main/java/io/grpc/internal/ClientCallImpl.java +++ b/core/src/main/java/io/grpc/internal/ClientCallImpl.java @@ -296,7 +296,7 @@ final class ClientCallImpl extends ClientCall { context.addListener(cancellationListener, directExecutor()); if (effectiveDeadline != null // If the context has the effective deadline, we don't need to schedule an extra task. - && context.getDeadline() != effectiveDeadline + && !effectiveDeadline.equals(context.getDeadline()) // If the channel has been terminated, we don't need to schedule an extra task. && deadlineCancellationExecutor != null) { deadlineCancellationFuture = startDeadlineTimer(effectiveDeadline); @@ -314,7 +314,7 @@ final class ClientCallImpl extends ClientCall { Deadline effectiveDeadline, @Nullable Deadline outerCallDeadline, @Nullable Deadline callDeadline) { if (!log.isLoggable(Level.FINE) || effectiveDeadline == null - || outerCallDeadline != effectiveDeadline) { + || !effectiveDeadline.equals(outerCallDeadline)) { return; }