1818import static org .junit .Assert .assertTrue ;
1919import static org .junit .Assert .fail ;
2020
21+ import java .util .concurrent .atomic .AtomicInteger ;
22+
2123import org .junit .Test ;
2224
2325import rx .Observable ;
@@ -39,27 +41,13 @@ public void call(Integer t1) {
3941 });
4042 }
4143
42- @ Test ( expected = StackOverflowError . class )
43- public void testStackOverflowIsThrown () {
44+ @ Test
45+ public void testStackOverflowWouldOccur () {
4446 final PublishSubject <Integer > a = PublishSubject .create ();
4547 final PublishSubject <Integer > b = PublishSubject .create ();
46- new Observer <Integer >() {
47-
48- @ Override
49- public void onCompleted () {
50-
51- }
52-
53- @ Override
54- public void onError (Throwable e ) {
55- e .printStackTrace ();
56- }
57-
58- @ Override
59- public void onNext (Integer args ) {
60- System .out .println (args );
61- }
62- };
48+ final int MAX_STACK_DEPTH = 1000 ;
49+ final AtomicInteger depth = new AtomicInteger ();
50+
6351 a .subscribe (new Observer <Integer >() {
6452
6553 @ Override
@@ -73,12 +61,11 @@ public void onError(Throwable e) {
7361 }
7462
7563 @ Override
76- public void onNext (Integer args ) {
77- System . out . println ( args );
64+ public void onNext (Integer n ) {
65+ b . onNext ( n + 1 );
7866 }
7967 });
80- b .subscribe ();
81- a .subscribe (new Observer <Integer >() {
68+ b .subscribe (new Observer <Integer >() {
8269
8370 @ Override
8471 public void onCompleted () {
@@ -91,11 +78,20 @@ public void onError(Throwable e) {
9178 }
9279
9380 @ Override
94- public void onNext (Integer args ) {
95- b .onNext (args + 1 );
81+ public void onNext (Integer n ) {
82+ if (depth .get () < MAX_STACK_DEPTH ) {
83+ depth .set (Thread .currentThread ().getStackTrace ().length );
84+ a .onNext (n + 1 );
85+ }
9686 }
9787 });
98- b .subscribe (new Observer <Integer >() {
88+ a .onNext (1 );
89+ assertTrue (depth .get () > MAX_STACK_DEPTH );
90+ }
91+
92+ @ Test (expected = StackOverflowError .class )
93+ public void testStackOverflowErrorIsThrown () {
94+ Observable .just (1 ).subscribe (new Observer <Integer >() {
9995
10096 @ Override
10197 public void onCompleted () {
@@ -108,11 +104,11 @@ public void onError(Throwable e) {
108104 }
109105
110106 @ Override
111- public void onNext (Integer args ) {
112- a . onNext ( args + 1 );
107+ public void onNext (Integer t ) {
108+ throw new StackOverflowError ( );
113109 }
110+
114111 });
115- a .onNext (1 );
116112 }
117113
118114 @ Test (expected = ThreadDeath .class )
0 commit comments