Skip to content

Commit a372ee8

Browse files
author
jmhofer
committed
Fixed millisecond/nanosecond confusion in test scheduler, fixed schedulePeriodically to use now() instead of System.nanoTime() and added a test against scheduling periodically
1 parent eb9af4d commit a372ee8

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

rxjava-core/src/main/java/rx/Scheduler.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,21 @@
1515
*/
1616
package rx;
1717

18+
import static org.mockito.Matchers.anyLong;
19+
import static org.mockito.Mockito.mock;
20+
import static org.mockito.Mockito.never;
21+
import static org.mockito.Mockito.times;
22+
import static org.mockito.Mockito.verify;
23+
1824
import java.util.Date;
1925
import java.util.concurrent.TimeUnit;
2026
import java.util.concurrent.atomic.AtomicBoolean;
2127

28+
import org.junit.Test;
29+
import org.mockito.InOrder;
30+
import org.mockito.Mockito;
31+
32+
import rx.concurrency.TestScheduler;
2233
import rx.subscriptions.Subscriptions;
2334
import rx.util.functions.Action0;
2435
import rx.util.functions.Func0;
@@ -97,9 +108,9 @@ public <T> Subscription schedulePeriodically(T state, final Func2<Scheduler, T,
97108
@Override
98109
public Subscription call(Scheduler scheduler, T state0) {
99110
if (! complete.get()) {
100-
long startedAt = System.nanoTime();
111+
long startedAt = now();
101112
final Subscription sub1 = action.call(scheduler, state0);
102-
long timeTakenByActionInNanos = System.nanoTime() - startedAt;
113+
long timeTakenByActionInNanos = TimeUnit.MILLISECONDS.toNanos(now() - startedAt);
103114
final Subscription sub2 = schedule(state0, this, periodInNanos - timeTakenByActionInNanos, TimeUnit.NANOSECONDS);
104115
return Subscriptions.create(new Action0() {
105116
@Override
@@ -325,4 +336,39 @@ public long now() {
325336
return System.currentTimeMillis();
326337
}
327338

339+
public static class UnitTest {
340+
@SuppressWarnings("unchecked") // mocking is unchecked, unfortunately
341+
@Test
342+
public void testPeriodicScheduling() {
343+
final Func1<Long, Void> calledOp = mock(Func1.class);
344+
345+
final TestScheduler scheduler = new TestScheduler();
346+
scheduler.schedulePeriodically(new Action0() {
347+
@Override public void call() {
348+
System.out.println(scheduler.now());
349+
calledOp.call(scheduler.now());
350+
}
351+
}, 1, 2, TimeUnit.SECONDS);
352+
353+
verify(calledOp, never()).call(anyLong());
354+
355+
InOrder inOrder = Mockito.inOrder(calledOp);
356+
357+
scheduler.advanceTimeBy(999L, TimeUnit.MILLISECONDS);
358+
inOrder.verify(calledOp, never()).call(anyLong());
359+
360+
scheduler.advanceTimeBy(1L, TimeUnit.MILLISECONDS);
361+
inOrder.verify(calledOp, times(1)).call(1000L);
362+
363+
scheduler.advanceTimeBy(1999L, TimeUnit.MILLISECONDS);
364+
inOrder.verify(calledOp, never()).call(3000L);
365+
366+
scheduler.advanceTimeBy(1L, TimeUnit.MILLISECONDS);
367+
inOrder.verify(calledOp, times(1)).call(3000L);
368+
369+
scheduler.advanceTimeBy(5L, TimeUnit.SECONDS);
370+
inOrder.verify(calledOp, times(1)).call(5000L);
371+
inOrder.verify(calledOp, times(1)).call(7000L);
372+
}
373+
}
328374
}

rxjava-core/src/main/java/rx/concurrency/TestScheduler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,12 @@ public int compare(TimedAction<?> action1, TimedAction<?> action2) {
5454
}
5555
}
5656

57+
// Storing time in nanoseconds internally.
5758
private long time;
5859

5960
@Override
6061
public long now() {
61-
return time;
62+
return TimeUnit.NANOSECONDS.toMillis(time);
6263
}
6364

6465
public void advanceTimeBy(long delayTime, TimeUnit unit) {
@@ -96,7 +97,7 @@ public <T> Subscription schedule(T state, Func2<Scheduler, T, Subscription> acti
9697

9798
@Override
9899
public <T> Subscription schedule(T state, Func2<Scheduler, T, Subscription> action, long delayTime, TimeUnit unit) {
99-
queue.add(new TimedAction<T>(this, now() + unit.toNanos(delayTime), action, state));
100+
queue.add(new TimedAction<T>(this, time + unit.toNanos(delayTime), action, state));
100101
return Subscriptions.empty();
101102
}
102103
}

0 commit comments

Comments
 (0)