2323import java .util .concurrent .CountDownLatch ;
2424import java .util .concurrent .atomic .AtomicInteger ;
2525
26+ import java .util .concurrent .atomic .AtomicReference ;
2627import org .junit .Test ;
2728
29+ import org .mockito .Mockito ;
2830import rx .*;
2931import rx .Observable ;
3032import rx .Scheduler .Worker ;
3941
4042public class RxJavaHooksTest {
4143
44+ public static class TestExceptionWithUnknownCause extends RuntimeException {
45+ TestExceptionWithUnknownCause () {
46+ super ((Throwable ) null );
47+ }
48+ }
49+
4250 static Observable <Integer > createObservable () {
4351 return Observable .range (1 , 5 ).map (new Func1 <Integer , Integer >() {
4452 @ Override
@@ -48,6 +56,15 @@ public Integer call(Integer t) {
4856 });
4957 }
5058
59+ static Observable <Integer > createObservableThrowingUnknownCause () {
60+ return Observable .range (1 , 5 ).map (new Func1 <Integer , Integer >() {
61+ @ Override
62+ public Integer call (Integer t ) {
63+ throw new TestExceptionWithUnknownCause ();
64+ }
65+ });
66+ }
67+
5168 @ Test
5269 public void constructorShouldBePrivate () {
5370 TestUtil .checkUtilityClass (RxJavaHooks .class );
@@ -89,6 +106,31 @@ public void assemblyTrackingObservable() {
89106 }
90107 }
91108
109+ @ Test
110+ public void assemblyTrackingObservableUnknownCause () {
111+ RxJavaHooks .enableAssemblyTracking ();
112+ try {
113+ final AtomicReference <Throwable > onErrorThrowableRef = new AtomicReference <Throwable >();
114+ RxJavaHooks .setOnError (new Action1 <Throwable >() {
115+ @ Override
116+ public void call (Throwable throwable ) {
117+ onErrorThrowableRef .set (throwable );
118+ }
119+ });
120+ TestSubscriber <Integer > ts = TestSubscriber .create ();
121+
122+ createObservableThrowingUnknownCause ().subscribe (ts );
123+
124+ ts .assertError (TestExceptionWithUnknownCause .class );
125+
126+ Throwable receivedError = onErrorThrowableRef .get ();
127+ assertNotNull (receivedError );
128+ assertTrue (receivedError .getMessage ().contains ("cause set to null" ));
129+ } finally {
130+ RxJavaHooks .reset ();
131+ }
132+ }
133+
92134 static Single <Integer > createSingle () {
93135 return Single .just (1 ).map (new Func1 <Integer , Integer >() {
94136 @ Override
0 commit comments