20
20
import org .mockito .InOrder ;
21
21
import org .mockito .Mock ;
22
22
import org .mockito .MockitoAnnotations ;
23
+
23
24
import rx .Observable ;
24
25
import rx .Observable .OnSubscribe ;
25
26
import rx .Observer ;
26
27
import rx .Subscriber ;
27
28
import rx .exceptions .CompositeException ;
28
29
import rx .exceptions .TestException ;
30
+ import rx .observers .TestSubscriber ;
29
31
30
32
import java .util .ArrayList ;
33
+ import java .util .Arrays ;
31
34
import java .util .List ;
32
35
import java .util .concurrent .CountDownLatch ;
36
+ import java .util .concurrent .TimeUnit ;
33
37
34
38
import static org .junit .Assert .*;
35
39
import static org .mockito .Matchers .any ;
@@ -475,4 +479,65 @@ public void onCompleted() {
475
479
inOrder .verify (o ).onError (any (TestException .class ));
476
480
verify (o , never ()).onCompleted ();
477
481
}
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