Skip to content

Commit d7d94ba

Browse files
committed
Merge pull request #2902 from davidmoten/exceptions-test
Prevent ExceptionsTest from hanging when testing stack overflow
2 parents 9fb5614 + 7a6dd8d commit d7d94ba

File tree

1 file changed

+25
-29
lines changed

1 file changed

+25
-29
lines changed

src/test/java/rx/exceptions/ExceptionsTest.java

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import static org.junit.Assert.assertTrue;
1919
import static org.junit.Assert.fail;
2020

21+
import java.util.concurrent.atomic.AtomicInteger;
22+
2123
import org.junit.Test;
2224

2325
import 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

Comments
 (0)