forked from ReactiveX/RxJava
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathOnNextValueTest.java
181 lines (149 loc) · 5.85 KB
/
OnNextValueTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/**
* Copyright (c) 2016-present, RxJava Contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.reactivex.exceptions;
import static org.junit.Assert.*;
import java.io.*;
import org.junit.*;
import io.reactivex.*;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
/**
* ```java
* public OnNextValue(Object value) {
* super("OnError while emitting onNext value: " + value);
* this.value = value;
* }
* ```
* I know this is probably a helpful error message in some cases but this can be a really costly operation when an objects toString is an expensive call or contains a lot of output. I don't think we should be printing this in any case but if so it should be on demand (overload of getMessage()) rather than eagerly.
* <p/>
* In my case it is causing a toString of a large context object that is normally only used for debugging purposes which makes the exception logs hard to use and they are rolling over the log files very quickly.
* <p/>
* There is an added danger that if there is a bug in the toString method it will cause inconsistent exception creation. If the object throws an exception while rendering a string it will actually end up not seeing the real exception.
*/
public final class OnNextValueTest {
private static final class BadToString {
private final boolean throwDuringToString;
private BadToString(boolean throwDuringToString) {
this.throwDuringToString = throwDuringToString;
}
@Override
public String toString() {
if (throwDuringToString) {
throw new IllegalArgumentException("Error Making toString");
} else {
return "BadToString";
}
}
}
private static class BadToStringObserver implements Observer<BadToString> {
@Override
public void onComplete() {
System.out.println("On Complete");
fail("OnComplete shouldn't be reached");
}
@Override
public void onError(Throwable e) {
String trace = stackTraceAsString(e);
System.out.println("On Error: " + trace);
assertTrue(trace, trace.contains("OnNextValue"));
assertTrue("No Cause on throwable" + e, e.getCause() != null);
// assertTrue(e.getCause().getClass().getSimpleName() + " no OnNextValue",
// e.getCause() instanceof OnErrorThrowable.OnNextValue);
}
@Override
public void onNext(BadToString badToString) {
System.out.println("On Next");
fail("OnNext shouldn't be reached");
}
@Override
public void onSubscribe(Disposable d) {
}
}
public static String stackTraceAsString(Throwable e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
@Ignore("Not sure what this does")
@Test
public void addOnNextValueExceptionAdded() throws Exception {
Observer<BadToString> observer = new BadToStringObserver();
Observable.just(new BadToString(false))
.map(new Function<BadToString, BadToString>() {
@Override
public BadToString apply(BadToString badToString) {
throw new IllegalArgumentException("Failure while handling");
}
}).subscribe(observer);
}
@Ignore("Not sure what this does")
@Test
public void addOnNextValueExceptionNotAddedWithBadString() throws Exception {
Observer<BadToString> observer = new BadToStringObserver();
Observable.just(new BadToString(true))
.map(new Function<BadToString, BadToString>() {
@Override
public BadToString apply(BadToString badToString) {
throw new IllegalArgumentException("Failure while handling");
}
}).subscribe(observer);
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderInteger() {
// assertEquals("123", OnNextValue.renderValue(123));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderByte() {
// assertEquals("10", OnNextValue.renderValue((byte) 10));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderBoolean() {
// assertEquals("true", OnNextValue.renderValue(true));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderShort() {
// assertEquals("10", OnNextValue.renderValue((short) 10));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderLong() {
// assertEquals("10", OnNextValue.renderValue(10L));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderCharacter() {
// assertEquals("10", OnNextValue.renderValue(10L));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderFloat() {
// assertEquals("10.0", OnNextValue.renderValue(10.0f));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderDouble() {
// assertEquals("10.0", OnNextValue.renderValue(10.0));
}
@Ignore("OnNextValue not ported")
@Test
public void testRenderVoid() {
// assertEquals("null", OnNextValue.renderValue((Void) null));
}
}