Skip to content

Commit 84a37e9

Browse files
Issue 10245 fix for long, TimeUnit to java.time.Duration to API's
1 parent db6c21f commit 84a37e9

File tree

7 files changed

+154
-105
lines changed

7 files changed

+154
-105
lines changed

api/src/context/java/io/grpc/Deadline.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.grpc;
1818

19+
import java.time.Duration;
1920
import java.util.Arrays;
2021
import java.util.Locale;
2122
import java.util.concurrent.ScheduledExecutorService;
@@ -68,6 +69,10 @@ public static Deadline after(long duration, TimeUnit units) {
6869
return after(duration, units, SYSTEM_TICKER);
6970
}
7071

72+
public static Deadline after(Duration duration) {
73+
return after(TimeUnit.NANOSECONDS.convert(duration.getSeconds(), TimeUnit.SECONDS), TimeUnit.NANOSECONDS, SYSTEM_TICKER);
74+
}
75+
7176
/**
7277
* Create a deadline that will expire at the specified offset based on the given {@link Ticker}.
7378
*
@@ -95,6 +100,10 @@ public static Deadline after(long duration, TimeUnit units, Ticker ticker) {
95100
return new Deadline(ticker, units.toNanos(duration), true);
96101
}
97102

103+
public static Deadline after(Duration duration, Ticker ticker) {
104+
return after(TimeUnit.NANOSECONDS.convert(duration.getSeconds(), TimeUnit.SECONDS), TimeUnit.NANOSECONDS, ticker);
105+
}
106+
98107
private final Ticker ticker;
99108
private final long deadlineNanos;
100109
private volatile boolean expired;

api/src/main/java/io/grpc/CallOptions.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import com.google.common.base.MoreObjects;
2222
import com.google.common.base.Preconditions;
23+
import java.time.Duration;
2324
import java.util.ArrayList;
2425
import java.util.Arrays;
2526
import java.util.Collections;
@@ -176,6 +177,11 @@ public CallOptions withDeadlineAfter(long duration, TimeUnit unit) {
176177
return withDeadline(Deadline.after(duration, unit));
177178
}
178179

180+
public CallOptions withDeadlineAfter(Duration duration) {
181+
return withDeadlineAfter(TimeUnit.NANOSECONDS.convert(duration.getSeconds(), TimeUnit.SECONDS),
182+
TimeUnit.NANOSECONDS);
183+
}
184+
179185
/**
180186
* Returns the deadline or {@code null} if the deadline is not set.
181187
*/

api/src/main/java/io/grpc/SynchronizationContext.java

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -150,16 +150,16 @@ public final ScheduledHandle schedule(
150150
final Runnable task, long delay, TimeUnit unit, ScheduledExecutorService timerService) {
151151
final ManagedRunnable runnable = new ManagedRunnable(task);
152152
ScheduledFuture<?> future = timerService.schedule(new Runnable() {
153-
@Override
154-
public void run() {
155-
execute(runnable);
156-
}
153+
@Override
154+
public void run() {
155+
execute(runnable);
156+
}
157157

158-
@Override
159-
public String toString() {
160-
return task.toString() + "(scheduled in SynchronizationContext)";
161-
}
162-
}, delay, unit);
158+
@Override
159+
public String toString() {
160+
return task.toString() + "(scheduled in SynchronizationContext)";
161+
}
162+
}, delay, unit);
163163
return new ScheduledHandle(runnable, future);
164164
}
165165

@@ -194,30 +194,11 @@ public String toString() {
194194
return new ScheduledHandle(runnable, future);
195195
}
196196

197-
public final ScheduledHandle scheduleWithFixedDelay(
198-
final Runnable task, Duration initialDelay, Duration delay, TimeUnit unit,
197+
public final ScheduledHandle scheduleWithFixedDelay (
198+
final Runnable task, Duration initialDelay, Duration delay,
199199
ScheduledExecutorService timerService) {
200-
final ManagedRunnable runnable = new ManagedRunnable(task);
201-
ScheduledFuture<?> future = timerService.scheduleWithFixedDelay(new Runnable() {
202-
@Override
203-
public void run() {
204-
execute(runnable);
205-
}
206-
207-
@Override
208-
public String toString() {
209-
return task.toString() + "(scheduled in SynchronizationContext with delay of " + delay
210-
+ ")";
211-
}
212-
}, toNanosSaturated(initialDelay), toNanosSaturated(delay), unit);
213-
return new ScheduledHandle(runnable, future);
214-
}
215-
static long toNanosSaturated(Duration duration) {
216-
try {
217-
return duration.toNanos();
218-
} catch (ArithmeticException tooBig) {
219-
return duration.isNegative() ? Long.MIN_VALUE : Long.MAX_VALUE;
220-
}
200+
return scheduleWithFixedDelay(task, TimeUnit.NANOSECONDS.convert(initialDelay.getSeconds(), TimeUnit.SECONDS),
201+
TimeUnit.NANOSECONDS.convert(delay.getSeconds(), TimeUnit.SECONDS), TimeUnit.NANOSECONDS, timerService);
221202
}
222203

223204
private static class ManagedRunnable implements Runnable {
@@ -272,4 +253,4 @@ public boolean isPending() {
272253
return !(runnable.hasStarted || runnable.isCancelled);
273254
}
274255
}
275-
}
256+
}

api/src/test/java/io/grpc/CallOptionsTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.google.common.base.Objects;
3333
import io.grpc.ClientStreamTracer.StreamInfo;
3434
import io.grpc.internal.SerializingExecutor;
35+
import java.time.Duration;
3536
import java.util.concurrent.Executor;
3637
import org.junit.Test;
3738
import org.junit.runner.RunWith;
@@ -150,6 +151,14 @@ public void withDeadlineAfter() {
150151
assertAbout(deadline()).that(actual).isWithin(10, MILLISECONDS).of(expected);
151152
}
152153

154+
@Test
155+
public void withDeadlineAfterDuration() {
156+
Deadline actual = CallOptions.DEFAULT.withDeadlineAfter(Duration.ofMinutes(1l)).getDeadline();
157+
Deadline expected = Deadline.after(1, MINUTES);
158+
159+
assertAbout(deadline()).that(actual).isWithin(10, MILLISECONDS).of(expected);
160+
}
161+
153162
@Test
154163
public void toStringMatches_noDeadline_default() {
155164
String actual = allSet

api/src/test/java/io/grpc/DeadlineTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import com.google.common.testing.EqualsTester;
3131
import com.google.common.truth.Truth;
32+
import java.time.Duration;
3233
import java.util.Arrays;
3334
import java.util.concurrent.Future;
3435
import java.util.concurrent.ScheduledExecutorService;
@@ -137,6 +138,11 @@ public void deadlineMatchesLongValue() {
137138
assertEquals(10, Deadline.after(10, TimeUnit.MINUTES, ticker).timeRemaining(TimeUnit.MINUTES));
138139
}
139140

141+
@Test
142+
public void deadLineMatchesDurationValue(){
143+
assertEquals(10, Deadline.after(Duration.ofMinutes(10), ticker).timeRemaining(TimeUnit.MINUTES));
144+
}
145+
140146
@Test
141147
public void pastDeadlineIsExpired() {
142148
Deadline d = Deadline.after(-1, TimeUnit.SECONDS, ticker);
@@ -305,6 +311,36 @@ public void tickersDontMatch() {
305311
assertFalse(success);
306312
}
307313

314+
@Test
315+
public void tickersDontMatchDuration() {
316+
Deadline d1 = Deadline.after(Duration.ofSeconds(10));
317+
Deadline d2 = Deadline.after(Duration.ofSeconds(10), ticker);
318+
boolean success = false;
319+
try {
320+
d1.compareTo(d2);
321+
success = true;
322+
} catch (AssertionError e) {
323+
// Expected
324+
}
325+
assertFalse(success);
326+
327+
try {
328+
d1.minimum(d2);
329+
success = true;
330+
} catch (AssertionError e) {
331+
// Expected
332+
}
333+
assertFalse(success);
334+
335+
try {
336+
d1.isBefore(d2);
337+
success = true;
338+
} catch (AssertionError e) {
339+
// Expected
340+
}
341+
assertFalse(success);
342+
}
343+
308344
@Test
309345
public void toString_before() {
310346
Deadline d = Deadline.after(12, TimeUnit.MICROSECONDS, ticker);

0 commit comments

Comments
 (0)