Skip to content

Commit 2611684

Browse files
Remove assertTrustedObservable
- Was no longer working once onError(Exception) changed to onError(Throwable) as the assertions throwing java.lang.Error no longer bypassed the composed Observables. - It was confusing while locally contextual JUnit verifications as used everywhere else are clear, readable and localized to each test
1 parent 7c04f6b commit 2611684

File tree

2 files changed

+27
-232
lines changed

2 files changed

+27
-232
lines changed

rxjava-core/src/main/java/rx/operators/OperationTake.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public static class UnitTest {
158158
@Test
159159
public void testTake1() {
160160
Observable<String> w = Observable.from("one", "two", "three");
161-
Observable<String> take = Observable.create(assertTrustedObservable(take(w, 2)));
161+
Observable<String> take = Observable.create(take(w, 2));
162162

163163
@SuppressWarnings("unchecked")
164164
Observer<String> aObserver = mock(Observer.class);
@@ -173,7 +173,7 @@ public void testTake1() {
173173
@Test
174174
public void testTake2() {
175175
Observable<String> w = Observable.from("one", "two", "three");
176-
Observable<String> take = Observable.create(assertTrustedObservable(take(w, 1)));
176+
Observable<String> take = Observable.create(take(w, 1));
177177

178178
@SuppressWarnings("unchecked")
179179
Observer<String> aObserver = mock(Observer.class);
@@ -197,7 +197,17 @@ public Subscription call(Observer<String> observer)
197197
return Subscriptions.empty();
198198
}
199199
});
200-
Observable.create(assertTrustedObservable(take(source, 1))).toBlockingObservable().last();
200+
201+
@SuppressWarnings("unchecked")
202+
Observer<String> aObserver = mock(Observer.class);
203+
204+
Observable.create(take(source, 1)).subscribe(aObserver);
205+
206+
verify(aObserver, times(1)).onNext("one");
207+
// even though onError is called we take(1) so shouldn't see it
208+
verify(aObserver, never()).onError(any(Throwable.class));
209+
verify(aObserver, times(1)).onCompleted();
210+
verifyNoMoreInteractions(aObserver);
201211
}
202212

203213
@Test
@@ -221,9 +231,19 @@ public void unsubscribe()
221231
};
222232
}
223233
});
224-
Observable.create(assertTrustedObservable(take(source, 0))).toBlockingObservable().lastOrDefault("ok");
234+
235+
@SuppressWarnings("unchecked")
236+
Observer<String> aObserver = mock(Observer.class);
237+
238+
Observable.create(take(source, 0)).subscribe(aObserver);
225239
assertTrue("source subscribed", subscribed.get());
226240
assertTrue("source unsubscribed", unSubscribed.get());
241+
242+
verify(aObserver, never()).onNext(anyString());
243+
// even though onError is called we take(0) so shouldn't see it
244+
verify(aObserver, never()).onError(any(Throwable.class));
245+
verify(aObserver, times(1)).onCompleted();
246+
verifyNoMoreInteractions(aObserver);
227247
}
228248

229249
@Test
@@ -233,7 +253,7 @@ public void testUnsubscribeAfterTake() {
233253

234254
@SuppressWarnings("unchecked")
235255
Observer<String> aObserver = mock(Observer.class);
236-
Observable<String> take = Observable.create(assertTrustedObservable(take(w, 1)));
256+
Observable<String> take = Observable.create(take(w, 1));
237257
take.subscribe(aObserver);
238258

239259
// wait for the Observable to complete
@@ -248,7 +268,9 @@ public void testUnsubscribeAfterTake() {
248268
verify(aObserver, times(1)).onNext("one");
249269
verify(aObserver, never()).onNext("two");
250270
verify(aObserver, never()).onNext("three");
271+
verify(aObserver, times(1)).onCompleted();
251272
verify(s, times(1)).unsubscribe();
273+
verifyNoMoreInteractions(aObserver);
252274
}
253275

254276
private static class TestObservable extends Observable<String> {

rxjava-core/src/main/java/rx/operators/OperatorTester.java

Lines changed: 0 additions & 227 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,6 @@ private OperatorTester() {
5555

5656
public static class UnitTest {
5757

58-
public static <T> Func1<Observer<T>, Subscription> assertTrustedObservable(final Func1<Observer<T>, Subscription> source)
59-
{
60-
return new Func1<Observer<T>, Subscription>()
61-
{
62-
@Override
63-
public Subscription call(Observer<T> observer)
64-
{
65-
return source.call(new TestingObserver<T>(observer));
66-
}
67-
};
68-
}
69-
7058
/**
7159
* Used for mocking of Schedulers since many Scheduler implementations are static/final.
7260
*
@@ -77,221 +65,6 @@ public static Scheduler forwardingScheduler(Scheduler underlying) {
7765
return new ForwardingScheduler(underlying);
7866
}
7967

80-
public static class TestingObserver<T> implements Observer<T> {
81-
82-
private final Observer<T> actual;
83-
private final AtomicBoolean isFinished = new AtomicBoolean(false);
84-
private final AtomicBoolean isInCallback = new AtomicBoolean(false);
85-
86-
public TestingObserver(Observer<T> actual) {
87-
this.actual = actual;
88-
}
89-
90-
@Override
91-
public void onCompleted() {
92-
assertFalse("previous call to onCompleted() or onError()", !isFinished.compareAndSet(false, true));
93-
assertFalse("concurrent callback pending", !isInCallback.compareAndSet(false, true));
94-
actual.onCompleted();
95-
isInCallback.set(false);
96-
}
97-
98-
@Override
99-
public void onError(Exception e) {
100-
assertFalse("previous call to onCompleted() or onError()", !isFinished.compareAndSet(false, true));
101-
assertFalse("concurrent callback pending", !isInCallback.compareAndSet(false, true));
102-
actual.onError(e);
103-
isInCallback.set(false);
104-
}
105-
106-
@Override
107-
public void onNext(T args) {
108-
assertFalse("previous call to onCompleted() or onError()", isFinished.get());
109-
assertFalse("concurrent callback pending", !isInCallback.compareAndSet(false, true));
110-
actual.onNext(args);
111-
isInCallback.set(false);
112-
}
113-
114-
}
115-
116-
@Test(expected = AssertionError.class)
117-
public void testDoubleCompleted() {
118-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
119-
{
120-
@Override
121-
public Subscription call(Observer<String> observer)
122-
{
123-
observer.onCompleted();
124-
observer.onCompleted();
125-
return Subscriptions.empty();
126-
}
127-
})).toBlockingObservable().lastOrDefault("end");
128-
129-
}
130-
131-
@Test(expected = AssertionError.class)
132-
public void testCompletedError() {
133-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
134-
{
135-
@Override
136-
public Subscription call(Observer<String> observer)
137-
{
138-
observer.onCompleted();
139-
observer.onError(new Exception());
140-
return Subscriptions.empty();
141-
}
142-
})).toBlockingObservable().lastOrDefault("end");
143-
}
144-
145-
@Test(expected = AssertionError.class)
146-
public void testCompletedNext() {
147-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
148-
{
149-
@Override
150-
public Subscription call(Observer<String> observer)
151-
{
152-
observer.onCompleted();
153-
observer.onNext("one");
154-
return Subscriptions.empty();
155-
}
156-
})).toBlockingObservable().lastOrDefault("end");
157-
}
158-
159-
@Test(expected = AssertionError.class)
160-
public void testErrorCompleted() {
161-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
162-
{
163-
@Override
164-
public Subscription call(Observer<String> observer)
165-
{
166-
observer.onError(new Exception());
167-
observer.onCompleted();
168-
return Subscriptions.empty();
169-
}
170-
})).toBlockingObservable().lastOrDefault("end");
171-
}
172-
173-
@Test(expected = AssertionError.class)
174-
public void testDoubleError() {
175-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
176-
{
177-
@Override
178-
public Subscription call(Observer<String> observer)
179-
{
180-
observer.onError(new Exception());
181-
observer.onError(new Exception());
182-
return Subscriptions.empty();
183-
}
184-
})).toBlockingObservable().lastOrDefault("end");
185-
}
186-
187-
@Test(expected = AssertionError.class)
188-
public void testErrorNext() {
189-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
190-
{
191-
@Override
192-
public Subscription call(Observer<String> observer)
193-
{
194-
observer.onError(new Exception());
195-
observer.onNext("one");
196-
return Subscriptions.empty();
197-
}
198-
})).toBlockingObservable().lastOrDefault("end");
199-
}
200-
201-
@Test
202-
public void testNextCompleted() {
203-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
204-
{
205-
@Override
206-
public Subscription call(Observer<String> observer)
207-
{
208-
observer.onNext("one");
209-
observer.onCompleted();
210-
return Subscriptions.empty();
211-
}
212-
})).toBlockingObservable().lastOrDefault("end");
213-
}
214-
215-
@Test
216-
public void testConcurrentNextNext() {
217-
final List<Thread> threads = new ArrayList<Thread>();
218-
final AtomicReference<Throwable> threadFailure = new AtomicReference<Throwable>();
219-
Observable.create(assertTrustedObservable(new Func1<Observer<String>, Subscription>()
220-
{
221-
@Override
222-
public Subscription call(final Observer<String> observer)
223-
{
224-
threads.add(new Thread(new Runnable()
225-
{
226-
@Override
227-
public void run()
228-
{
229-
observer.onNext("one");
230-
}
231-
}));
232-
threads.add(new Thread(new Runnable()
233-
{
234-
@Override
235-
public void run()
236-
{
237-
observer.onNext("two");
238-
}
239-
}));
240-
return Subscriptions.empty();
241-
}
242-
})).subscribe(new SlowObserver());
243-
for (Thread thread : threads) {
244-
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler()
245-
{
246-
@Override
247-
public void uncaughtException(Thread thread, Throwable throwable)
248-
{
249-
threadFailure.set(throwable);
250-
}
251-
});
252-
thread.start();
253-
}
254-
for (Thread thread : threads) {
255-
try {
256-
thread.join();
257-
} catch (InterruptedException ignored) {
258-
}
259-
}
260-
// Junit seems pretty bad about exposing test failures inside of created threads.
261-
assertNotNull("exception thrown by thread", threadFailure.get());
262-
assertEquals("class of exception thrown by thread", AssertionError.class, threadFailure.get().getClass());
263-
}
264-
265-
private static class SlowObserver implements Observer<String>
266-
{
267-
@Override
268-
public void onCompleted()
269-
{
270-
try {
271-
Thread.sleep(10);
272-
} catch (InterruptedException ignored) {
273-
}
274-
}
275-
276-
@Override
277-
public void onError(Exception e)
278-
{
279-
try {
280-
Thread.sleep(10);
281-
} catch (InterruptedException ignored) {
282-
}
283-
}
284-
285-
@Override
286-
public void onNext(String args)
287-
{
288-
try {
289-
Thread.sleep(10);
290-
} catch (InterruptedException ignored) {
291-
}
292-
}
293-
}
294-
29568
public static class ForwardingScheduler extends Scheduler {
29669
private final Scheduler underlying;
29770

0 commit comments

Comments
 (0)