2020import org .mockito .InOrder ;
2121import org .mockito .Mock ;
2222import org .mockito .MockitoAnnotations ;
23+
2324import rx .Observable ;
2425import rx .Observable .OnSubscribe ;
2526import rx .Observer ;
2627import rx .Subscriber ;
2728import rx .exceptions .CompositeException ;
2829import rx .exceptions .TestException ;
30+ import rx .observers .TestSubscriber ;
2931
3032import java .util .ArrayList ;
33+ import java .util .Arrays ;
3134import java .util .List ;
3235import java .util .concurrent .CountDownLatch ;
36+ import java .util .concurrent .TimeUnit ;
3337
3438import static org .junit .Assert .*;
3539import static org .mockito .Matchers .any ;
@@ -475,4 +479,65 @@ public void onCompleted() {
475479 inOrder .verify (o ).onError (any (TestException .class ));
476480 verify (o , never ()).onCompleted ();
477481 }
478- }
482+
483+ @ Test
484+ public void testErrorInParentObservable () {
485+ TestSubscriber <Integer > ts = new TestSubscriber <Integer >();
486+ Observable .mergeDelayError (
487+ Observable .just (Observable .just (1 ), Observable .just (2 ))
488+ .startWith (Observable .<Integer > error (new RuntimeException ()))
489+ ).subscribe (ts );
490+ ts .awaitTerminalEvent ();
491+ ts .assertTerminalEvent ();
492+ ts .assertReceivedOnNext (Arrays .asList (1 , 2 ));
493+ assertEquals (1 , ts .getOnErrorEvents ().size ());
494+
495+ }
496+
497+ @ Test
498+ public void testErrorInParentObservableDelayed () throws Exception {
499+ final TestASynchronous1sDelayedObservable o1 = new TestASynchronous1sDelayedObservable ();
500+ final TestASynchronous1sDelayedObservable o2 = new TestASynchronous1sDelayedObservable ();
501+ Observable <Observable <String >> parentObservable = Observable .create (new Observable .OnSubscribe <Observable <String >>() {
502+ @ Override
503+ public void call (Subscriber <? super Observable <String >> op ) {
504+ op .onNext (Observable .create (o1 ));
505+ op .onNext (Observable .create (o2 ));
506+ op .onError (new NullPointerException ("throwing exception in parent" ));
507+ }
508+ });
509+
510+ TestSubscriber <String > ts = new TestSubscriber <String >(stringObserver );
511+ Observable <String > m = Observable .mergeDelayError (parentObservable );
512+ m .subscribe (ts );
513+ ts .awaitTerminalEvent (2000 , TimeUnit .MILLISECONDS );
514+ ts .assertTerminalEvent ();
515+
516+ verify (stringObserver , times (2 )).onNext ("hello" );
517+ verify (stringObserver , times (1 )).onError (any (NullPointerException .class ));
518+ verify (stringObserver , never ()).onCompleted ();
519+ }
520+
521+ private static class TestASynchronous1sDelayedObservable implements Observable .OnSubscribe <String > {
522+ Thread t ;
523+
524+ @ Override
525+ public void call (final Subscriber <? super String > observer ) {
526+ t = new Thread (new Runnable () {
527+
528+ @ Override
529+ public void run () {
530+ try {
531+ Thread .sleep (100 );
532+ } catch (InterruptedException e ) {
533+ observer .onError (e );
534+ }
535+ observer .onNext ("hello" );
536+ observer .onCompleted ();
537+ }
538+
539+ });
540+ t .start ();
541+ }
542+ }
543+ }
0 commit comments