Skip to content

Commit 3488c76

Browse files
committed
Rewrite tests for StackTraces to use real stacktraces as inputs.
1 parent 8846d73 commit 3488c76

File tree

3 files changed

+462
-261
lines changed

3 files changed

+462
-261
lines changed

Diff for: src/main/java/org/junit/internal/StackTraces.java

+30-20
Original file line numberDiff line numberDiff line change
@@ -24,41 +24,43 @@ private StackTraces() {
2424
* @return a trimmed stack trace, or the original trace if trimming wasn't possible
2525
*/
2626
public static String getTrimmedStackTrace(Throwable exception) {
27-
StringWriter stringWriter = new StringWriter();
28-
PrintWriter writer = new PrintWriter(stringWriter);
29-
exception.printStackTrace(writer);
30-
return trimStackTrace(exception.toString(), stringWriter.toString());
31-
}
32-
33-
static String trimStackTrace(String extractedExceptionMessage, String fullTrace) {
34-
StringBuilder trimmedTrace = new StringBuilder(extractedExceptionMessage);
27+
String fullTrace = getFullStackTrace(exception);
3528
BufferedReader reader = new BufferedReader(
36-
new StringReader(fullTrace.substring(extractedExceptionMessage.length())));
29+
new StringReader(fullTrace.substring(exception.toString().length())));
3730

3831
try {
3932
// Collect the stack trace lines for "exception" (but not the cause).
4033
List<String> stackTraceLines = new ArrayList<String>();
41-
List<String> remainingLines = new ArrayList<String>();
42-
collectStackTraceLines(reader, stackTraceLines, remainingLines);
34+
List<String> causedByLines = new ArrayList<String>();
35+
collectStackTraceLines(reader, stackTraceLines, causedByLines);
4336

4437
if (stackTraceLines.isEmpty()) {
4538
// No stack trace?
4639
return fullTrace;
4740
}
48-
boolean hasCause = !remainingLines.isEmpty();
41+
boolean hasCause = !causedByLines.isEmpty();
4942
stackTraceLines = trimStackTraceLines(stackTraceLines, hasCause);
5043
if (stackTraceLines.isEmpty()) {
5144
// Could not trim stack trace lines.
5245
return fullTrace;
5346
}
47+
48+
StringBuilder trimmedTrace = new StringBuilder(exception.toString());
5449
appendStackTraceLines(stackTraceLines, trimmedTrace);
55-
appendStackTraceLines(remainingLines, trimmedTrace);
50+
appendStackTraceLines(causedByLines, trimmedTrace);
5651
return trimmedTrace.toString();
5752
} catch (IOException e) {
5853
}
5954
return fullTrace;
6055
}
6156

57+
private static String getFullStackTrace(Throwable exception) {
58+
StringWriter stringWriter = new StringWriter();
59+
PrintWriter writer = new PrintWriter(stringWriter);
60+
exception.printStackTrace(writer);
61+
return stringWriter.toString();
62+
}
63+
6264
private static void collectStackTraceLines(
6365
BufferedReader reader,
6466
List<String> stackTraceLines,
@@ -94,8 +96,9 @@ private static List<String> trimStackTraceLines(
9496
if (!hasCause) {
9597
return trimmedLines;
9698
}
97-
List<String> copy = new ArrayList<String>(trimmedLines);
98-
copy.add("\t..." + (stackTraceLines.size() - copy.size()) + "more");
99+
List<String> copy = new ArrayList<String>(trimmedLines.size() + 1);
100+
copy.addAll(trimmedLines);
101+
copy.add("\t... " + (stackTraceLines.size() - trimmedLines.size()) + " trimmed");
99102
return copy;
100103
}
101104
linesToInclude--;
@@ -166,28 +169,35 @@ private enum State {
166169
"junit.",
167170
};
168171

172+
private static final String[] TEST_FRAMEWORK_TEST_METHOD_NAME_PREFIXES = {
173+
"org.junit.internal.StackTracesTest",
174+
};
175+
169176
private static boolean isTestFrameworkStackTraceLine(String line) {
170-
return isMatchingStackTraceLine(line, TEST_FRAMEWORK_METHOD_NAME_PREFIXES);
177+
return isMatchingStackTraceLine(line, TEST_FRAMEWORK_METHOD_NAME_PREFIXES) &&
178+
!isMatchingStackTraceLine(line, TEST_FRAMEWORK_TEST_METHOD_NAME_PREFIXES);
171179
}
172180

173181
private static final String[] REFLECTION_METHOD_NAME_PREFIXES = {
174182
"sun.reflect.",
175183
"java.lang.reflect.",
176-
"org.junit.rules.RunRules.evaluate(", // get better stack traces for failures in method rules
184+
"org.junit.rules.RunRules.<init>(",
185+
"org.junit.rules.RunRules.applyAll(", // calls TestRules
186+
"org.junit.runners.BlockJUnit4ClassRunner.withMethodRules(", // calls MethodRules
177187
"junit.framework.TestCase.runBare(", // runBare() directly calls setUp() and tearDown()
178188
};
179189

180190
private static boolean isReflectionStackTraceLine(String line) {
181191
return isMatchingStackTraceLine(line, REFLECTION_METHOD_NAME_PREFIXES);
182192
}
183193

184-
private static boolean isMatchingStackTraceLine(String line, String[] packagePrefixes) {
194+
private static boolean isMatchingStackTraceLine(String line, String[] methodNamePrefixes) {
185195
if (!line.startsWith("\tat ")) {
186196
return false;
187197
}
188198
line = line.substring(4);
189-
for (String packagePrefix : packagePrefixes) {
190-
if (line.startsWith(packagePrefix)) {
199+
for (String methodNamePrefix : methodNamePrefixes) {
200+
if (line.startsWith(methodNamePrefix)) {
191201
return true;
192202
}
193203
}

0 commit comments

Comments
 (0)