@Test public void testReplayTimestampedAfterTermination() { TestScheduler scheduler = new TestScheduler(); ReplaySubject<Integer> source = ReplaySubject.createWithTime(1, TimeUnit.SECONDS, scheduler); source.onNext(1); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onNext(2); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onNext(3); source.onComplete(); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); Observer<Integer> o = TestHelper.mockObserver(); source.subscribe(o); verify(o, never()).onNext(1); verify(o, never()).onNext(2); verify(o, never()).onNext(3); verify(o).onComplete(); verify(o, never()).onError(any(Throwable.class)); }
@Test public void testReplayTimestampedDirectly() { TestScheduler scheduler = new TestScheduler(); ReplaySubject<Integer> source = ReplaySubject.createWithTime(1, TimeUnit.SECONDS, scheduler); source.onNext(1); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); Observer<Integer> o = TestHelper.mockObserver(); source.subscribe(o); source.onNext(2); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onNext(3); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onComplete(); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); verify(o, never()).onError(any(Throwable.class)); verify(o, never()).onNext(1); verify(o).onNext(2); verify(o).onNext(3); verify(o).onComplete(); }
@Test(timeout = 10000) public void testConcurrentSizeAndHasAnyValueTimeBounded() throws InterruptedException { final ReplaySubject<Object> rs = ReplaySubject.createWithTime(1, TimeUnit.MILLISECONDS, Schedulers.computation()); final CyclicBarrier cb = new CyclicBarrier(2);
@Test public void noHeadRetentionCompleteTime() { ReplaySubject<Integer> source = ReplaySubject.createWithTime(1, TimeUnit.MINUTES, Schedulers.computation()); source.onNext(1); source.onNext(2); source.onComplete(); SizeAndTimeBoundReplayBuffer<Integer> buf = (SizeAndTimeBoundReplayBuffer<Integer>)source.buffer; assertNull(buf.head.value); Object o = buf.head; source.cleanupBuffer(); assertSame(o, buf.head); }
@Test public void timedNoOutdatedData() { TestScheduler scheduler = new TestScheduler(); ReplaySubject<Integer> source = ReplaySubject.createWithTime(2, TimeUnit.SECONDS, scheduler); source.onNext(1); source.onComplete(); source.test().assertResult(1); source.test().assertResult(1); scheduler.advanceTimeBy(3, TimeUnit.SECONDS); source.test().assertResult(); }
@Test public void noHeadRetentionTime() { TestScheduler sch = new TestScheduler(); ReplaySubject<Integer> source = ReplaySubject.createWithTime(1, TimeUnit.MILLISECONDS, sch); source.onNext(1); sch.advanceTimeBy(2, TimeUnit.MILLISECONDS); source.onNext(2); SizeAndTimeBoundReplayBuffer<Integer> buf = (SizeAndTimeBoundReplayBuffer<Integer>)source.buffer; assertNotNull(buf.head.value); source.cleanupBuffer(); assertNull(buf.head.value); Object o = buf.head; source.cleanupBuffer(); assertSame(o, buf.head); }
@Test public void peekStateTimeAndSizeValueExpired() { TestScheduler scheduler = new TestScheduler(); ReplaySubject<Integer> rp = ReplaySubject.createWithTime(1, TimeUnit.DAYS, scheduler); assertNull(rp.getValue()); assertNull(rp.getValues(new Integer[2])[0]); rp.onNext(2); assertEquals((Integer)2, rp.getValue()); assertEquals(2, rp.getValues()[0]); scheduler.advanceTimeBy(2, TimeUnit.DAYS); assertEquals(null, rp.getValue()); assertEquals(0, rp.getValues().length); assertNull(rp.getValues(new Integer[2])[0]); }
@Test public void testSizeAndHasAnyValueTimeBounded() { TestScheduler to = new TestScheduler(); ReplaySubject<Object> rs = ReplaySubject.createWithTime(1, TimeUnit.SECONDS, to); assertEquals(0, rs.size()); assertFalse(rs.hasValue()); for (int i = 0; i < 1000; i++) { rs.onNext(i); assertEquals(1, rs.size()); assertTrue(rs.hasValue()); to.advanceTimeBy(2, TimeUnit.SECONDS); assertEquals(0, rs.size()); assertFalse(rs.hasValue()); } rs.onComplete(); assertEquals(0, rs.size()); assertFalse(rs.hasValue()); }