diff --git a/context/src/main/java/io/grpc/Deadline.java b/context/src/main/java/io/grpc/Deadline.java index 1152ee32bf..dc091e6c8a 100644 --- a/context/src/main/java/io/grpc/Deadline.java +++ b/context/src/main/java/io/grpc/Deadline.java @@ -36,6 +36,7 @@ public final class Deadline implements Comparable { // to prevent wraparound as long as process runs for less than ~100 years. private static final long MAX_OFFSET = TimeUnit.DAYS.toNanos(100 * 365); private static final long MIN_OFFSET = -MAX_OFFSET; + private static final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1); /** * Create a deadline that will expire at the specified offset from the current system clock. @@ -89,6 +90,7 @@ public final class Deadline implements Comparable { * Is {@code this} deadline before another. */ public boolean isBefore(Deadline other) { + assert this.ticker == other.ticker : "Tickers don't match"; return this.deadlineNanos - other.deadlineNanos < 0; } @@ -97,6 +99,7 @@ public final class Deadline implements Comparable { * @param other deadline to compare with {@code this}. */ public Deadline minimum(Deadline other) { + assert this.ticker == other.ticker : "Tickers don't match"; return isBefore(other) ? this : other; } @@ -142,11 +145,25 @@ public final class Deadline implements Comparable { @Override public String toString() { - return timeRemaining(TimeUnit.NANOSECONDS) + " ns from now"; + long remainingNanos = timeRemaining(TimeUnit.NANOSECONDS); + long seconds = Math.abs(remainingNanos) / NANOS_PER_SECOND; + long nanos = Math.abs(remainingNanos) % NANOS_PER_SECOND; + + StringBuilder buf = new StringBuilder(); + if (remainingNanos < 0) { + buf.append('-'); + } + buf.append(seconds); + if (nanos > 0) { + buf.append(String.format(".%09d", nanos)); + } + buf.append("s from now"); + return buf.toString(); } @Override public int compareTo(Deadline that) { + assert this.ticker == that.ticker : "Tickers don't match"; long diff = this.deadlineNanos - that.deadlineNanos; if (diff < 0) { return -1; diff --git a/context/src/test/java/io/grpc/DeadlineTest.java b/context/src/test/java/io/grpc/DeadlineTest.java index 548ebe59ca..1c98ac592a 100644 --- a/context/src/test/java/io/grpc/DeadlineTest.java +++ b/context/src/test/java/io/grpc/DeadlineTest.java @@ -211,13 +211,25 @@ public class DeadlineTest { @Test public void toString_exact() { Deadline d = Deadline.after(0, TimeUnit.MILLISECONDS, ticker); - assertEquals("0 ns from now", d.toString()); + assertEquals("0s from now", d.toString()); } @Test public void toString_after() { - Deadline d = Deadline.after(-1, TimeUnit.MINUTES, ticker); - assertEquals("-60000000000 ns from now", d.toString()); + Deadline d; + + d = Deadline.after(-1, TimeUnit.MINUTES, ticker); + assertEquals("-60s from now", d.toString()); + d = Deadline.after(-1, TimeUnit.MILLISECONDS, ticker); + assertEquals("-0.001000000s from now", d.toString()); + d = Deadline.after(-500, TimeUnit.MILLISECONDS, ticker); + assertEquals("-0.500000000s from now", d.toString()); + d = Deadline.after(-1000, TimeUnit.MILLISECONDS, ticker); + assertEquals("-1s from now", d.toString()); + d = Deadline.after(-1500, TimeUnit.MILLISECONDS, ticker); + assertEquals("-1.500000000s from now", d.toString()); + d = Deadline.after(-1023456789, TimeUnit.NANOSECONDS, ticker); + assertEquals("-1.023456789s from now", d.toString()); } @Test @@ -246,7 +258,7 @@ public class DeadlineTest { @Test public void toString_before() { Deadline d = Deadline.after(12, TimeUnit.MICROSECONDS, ticker); - assertEquals("12000 ns from now", d.toString()); + assertEquals("0.000012000s from now", d.toString()); } private static class FakeTicker extends Deadline.Ticker { diff --git a/core/src/test/java/io/grpc/CallOptionsTest.java b/core/src/test/java/io/grpc/CallOptionsTest.java index 7b311489c7..2a54e406ab 100644 --- a/core/src/test/java/io/grpc/CallOptionsTest.java +++ b/core/src/test/java/io/grpc/CallOptionsTest.java @@ -168,7 +168,7 @@ public class CallOptionsTest { @Test public void toStringMatches_withDeadline() { - assertThat(allSet.toString()).contains("1 ns from now"); + assertThat(allSet.toString()).contains("0.000000001s from now"); } @Test