Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 4930a1e

Browse files
committedMar 29, 2015
Experimental code to filter stack traces
1 parent 9c337dc commit 4930a1e

File tree

7 files changed

+403
-63
lines changed

7 files changed

+403
-63
lines changed
 

‎src/main/java/junit/runner/BaseTestRunner.java

+6-42
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package junit.runner;
22

3-
import java.io.BufferedReader;
43
import java.io.File;
54
import java.io.FileInputStream;
65
import java.io.FileOutputStream;
76
import java.io.IOException;
87
import java.io.InputStream;
98
import java.io.PrintWriter;
10-
import java.io.StringReader;
119
import java.io.StringWriter;
1210
import java.lang.reflect.InvocationTargetException;
1311
import java.lang.reflect.Method;
@@ -19,6 +17,7 @@
1917
import junit.framework.Test;
2018
import junit.framework.TestListener;
2119
import junit.framework.TestSuite;
20+
import org.junit.internal.StackTraces;
2221

2322
/**
2423
* Base class for all test runners.
@@ -264,6 +263,10 @@ public static int getPreference(String key, int dflt) {
264263
* Returns a filtered stack trace
265264
*/
266265
public static String getFilteredTrace(Throwable e) {
266+
if (!showStackRaw()) {
267+
return StackTraces.getTrimmedStackTrace(e);
268+
}
269+
267270
StringWriter stringWriter = new StringWriter();
268271
PrintWriter writer = new PrintWriter(stringWriter);
269272
e.printStackTrace(writer);
@@ -275,53 +278,14 @@ public static String getFilteredTrace(Throwable e) {
275278
* Filters stack frames from internal JUnit classes
276279
*/
277280
public static String getFilteredTrace(String stack) {
278-
if (showStackRaw()) {
279-
return stack;
280-
}
281-
282-
StringWriter sw = new StringWriter();
283-
PrintWriter pw = new PrintWriter(sw);
284-
StringReader sr = new StringReader(stack);
285-
BufferedReader br = new BufferedReader(sr);
286-
287-
String line;
288-
try {
289-
while ((line = br.readLine()) != null) {
290-
if (!filterLine(line)) {
291-
pw.println(line);
292-
}
293-
}
294-
} catch (Exception IOException) {
295-
return stack; // return the stack unfiltered
296-
}
297-
return sw.toString();
281+
return showStackRaw() ? stack : StackTraces.trimStackTrace(stack);
298282
}
299283

300284
protected static boolean showStackRaw() {
301285
return !getPreference("filterstack").equals("true") || fgFilterStack == false;
302286
}
303287

304-
static boolean filterLine(String line) {
305-
String[] patterns = new String[]{
306-
"junit.framework.TestCase",
307-
"junit.framework.TestResult",
308-
"junit.framework.TestSuite",
309-
"junit.framework.Assert.", // don't filter AssertionFailure
310-
"junit.swingui.TestRunner",
311-
"junit.awtui.TestRunner",
312-
"junit.textui.TestRunner",
313-
"java.lang.reflect.Method.invoke("
314-
};
315-
for (int i = 0; i < patterns.length; i++) {
316-
if (line.indexOf(patterns[i]) > 0) {
317-
return true;
318-
}
319-
}
320-
return false;
321-
}
322-
323288
static {
324289
fgMaxMessageLength = getPreference("maxmessage", fgMaxMessageLength);
325290
}
326-
327291
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
package org.junit.internal;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.PrintWriter;
6+
import java.io.StringReader;
7+
import java.io.StringWriter;
8+
import java.util.AbstractList;
9+
import java.util.ArrayList;
10+
import java.util.Collections;
11+
import java.util.List;
12+
13+
/**
14+
* Utility class for working with stack traces.
15+
*/
16+
public class StackTraces {
17+
private StackTraces() {
18+
}
19+
20+
/**
21+
* Gets a trimmed version of the stack trace of the given exception. Stack trace
22+
* elements that are below the test method are filtered out.
23+
*
24+
* @return a trimmed stack trace, or the original trace if trimming wasn't possible
25+
*/
26+
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+
/**
34+
* Trims the given stack trace. Stack trace elements that are below the test method are
35+
* filtered. out.
36+
*
37+
* @param fullTrace the full stack trace
38+
* @return a trimmed stack trace, or the original trace if trimming wasn't possible
39+
*/
40+
public static String trimStackTrace(String fullTrace) {
41+
return trimStackTrace("", fullTrace);
42+
}
43+
44+
static String trimStackTrace(String extracedExceptionMessage, String fullTrace) {
45+
StringBuilder trimmedTrace = new StringBuilder(extracedExceptionMessage);
46+
BufferedReader reader = new BufferedReader(
47+
new StringReader(fullTrace.substring(extracedExceptionMessage.length())));
48+
49+
try {
50+
// Collect the stack trace lines for "exception" (but not the cause).
51+
List<String> stackTraceLines = new ArrayList<String>();
52+
String line;
53+
boolean hasCause = false;
54+
while ((line = reader.readLine()) != null) {
55+
if (line.startsWith("Caused by: ")) {
56+
hasCause= true;
57+
break;
58+
}
59+
stackTraceLines.add(line);
60+
}
61+
if (stackTraceLines.isEmpty()) {
62+
// No stack trace?
63+
return fullTrace;
64+
}
65+
stackTraceLines = trimStackTraceLines(stackTraceLines, hasCause);
66+
if (stackTraceLines.isEmpty()) {
67+
// Could not trim stack trace lines.
68+
return fullTrace;
69+
}
70+
appendStackTraceLines(stackTraceLines, trimmedTrace);
71+
if (line != null) {
72+
// Print remaining stack trace lines.
73+
do {
74+
trimmedTrace.append(line).append("\n");
75+
line = reader.readLine();
76+
} while (line != null);
77+
}
78+
return trimmedTrace.toString();
79+
} catch (IOException e) {
80+
}
81+
return fullTrace;
82+
}
83+
84+
private static void appendStackTraceLines(
85+
List<String> stackTraceLines, StringBuilder destBuilder) {
86+
for (String stackTraceLine : stackTraceLines) {
87+
destBuilder.append(stackTraceLine).append("\n");
88+
}
89+
}
90+
91+
private static List<String> trimStackTraceLines(
92+
List<String> stackTraceLines, boolean hasCause) {
93+
State state = State.PROCESSING_OTHER_CODE;
94+
int linesToInclude = stackTraceLines.size();
95+
for (String stackTraceLine : asReversedList(stackTraceLines)) {
96+
state = state.processLine(stackTraceLine);
97+
if (state == State.DONE) {
98+
List<String> trimmedLines = stackTraceLines.subList(0, linesToInclude);
99+
if (!hasCause) {
100+
return trimmedLines;
101+
}
102+
List<String> copy = new ArrayList<String>(trimmedLines);
103+
copy.add("\t..." + (stackTraceLines.size() - copy.size()) + "more");
104+
return copy;
105+
}
106+
linesToInclude--;
107+
}
108+
return Collections.emptyList();
109+
}
110+
111+
private static <T> List<T> asReversedList(final List<T> list) {
112+
return new AbstractList<T>() {
113+
114+
@Override
115+
public T get(int index) {
116+
return list.get(list.size() - index - 1);
117+
}
118+
119+
@Override
120+
public int size() {
121+
return list.size();
122+
}
123+
};
124+
}
125+
126+
private enum State {
127+
PROCESSING_OTHER_CODE {
128+
@Override public State processLine(String line) {
129+
if (isTestFrameworkStackTraceLine(line)) {
130+
return PROCESSING_TEST_FRAMEWORK_CODE;
131+
}
132+
return this;
133+
}
134+
},
135+
PROCESSING_TEST_FRAMEWORK_CODE {
136+
@Override public State processLine(String line) {
137+
if (isReflectionStackTraceLine(line)) {
138+
return PROCESSING_REFLECTION_CODE;
139+
} else if (isTestFrameworkStackTraceLine(line)) {
140+
return this;
141+
}
142+
return PROCESSING_OTHER_CODE;
143+
}
144+
},
145+
PROCESSING_REFLECTION_CODE {
146+
@Override public State processLine(String line) {
147+
if (isReflectionStackTraceLine(line)) {
148+
return this;
149+
} else if (isTestFrameworkStackTraceLine(line)) {
150+
// This is here to handle TestCase.runBare() calling TestCase.runTest().
151+
return PROCESSING_TEST_FRAMEWORK_CODE;
152+
}
153+
return DONE;
154+
}
155+
},
156+
DONE {
157+
@Override public State processLine(String line) {
158+
return this;
159+
}
160+
};
161+
162+
/** Processes a stack trace line, possibly moving to a new state. */
163+
public abstract State processLine(String line);
164+
}
165+
166+
private static final String[] TEST_FRAMEWORK_METHOD_NAME_PREFIXES = {
167+
"org.junit.runner.",
168+
"org.junit.runners.",
169+
"org.junit.experimental.runners.",
170+
"org.junit.internal.",
171+
"junit.",
172+
"org.apache.maven.surefire."
173+
};
174+
175+
private static boolean isTestFrameworkStackTraceLine(String line) {
176+
return isMatchingStackTraceLine(line, TEST_FRAMEWORK_METHOD_NAME_PREFIXES);
177+
}
178+
179+
private static final String[] REFLECTION_METHOD_NAME_PREFIXES = {
180+
"sun.reflect.",
181+
"java.lang.reflect.",
182+
"org.junit.rules.RunRules.evaluate(", // get better stack traces for failures in method rules
183+
"junit.framework.TestCase.runBare(", // runBare() directly calls setUp() and tearDown()
184+
};
185+
186+
private static boolean isReflectionStackTraceLine(String line) {
187+
return isMatchingStackTraceLine(line, REFLECTION_METHOD_NAME_PREFIXES);
188+
}
189+
190+
private static boolean isMatchingStackTraceLine(String line, String[] packagePrefixes) {
191+
if (!line.startsWith("\tat ")) {
192+
return false;
193+
}
194+
line = line.substring(4);
195+
for (String packagePrefix : packagePrefixes) {
196+
if (line.startsWith(packagePrefix)) {
197+
return true;
198+
}
199+
}
200+
201+
return false;
202+
}
203+
}

‎src/main/java/org/junit/internal/TextListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ protected void printFailures(Result result) {
7474

7575
protected void printFailure(Failure each, String prefix) {
7676
getWriter().println(prefix + ") " + each.getTestHeader());
77-
getWriter().print(each.getTrace());
77+
getWriter().print(each.getTrimmedTrace());
7878
}
7979

8080
protected void printFooter(Result result) {

‎src/main/java/org/junit/runner/notification/Failure.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.io.Serializable;
55
import java.io.StringWriter;
66

7+
import org.junit.internal.StackTraces;
78
import org.junit.runner.Description;
89

910
/**
@@ -65,9 +66,7 @@ public String toString() {
6566
}
6667

6768
/**
68-
* Convenience method
69-
*
70-
* @return the printed form of the exception
69+
* Gets the printed form of the exception and its stack trace.
7170
*/
7271
public String getTrace() {
7372
StringWriter stringWriter = new StringWriter();
@@ -76,6 +75,15 @@ public String getTrace() {
7675
return stringWriter.toString();
7776
}
7877

78+
/**
79+
* Gets a the printed form of the exception, with a trimmed version of the stack trace.
80+
* This method will attempt to filter out frames of the stack trace that are below
81+
* the test method call.
82+
*/
83+
public String getTrimmedTrace() {
84+
return StackTraces.getTrimmedStackTrace(getException());
85+
}
86+
7987
/**
8088
* Convenience method
8189
*

‎src/test/java/junit/tests/runner/StackFilterTest.java

+20-17
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,31 @@ protected void setUp() {
1515
StringWriter swin = new StringWriter();
1616
PrintWriter pwin = new PrintWriter(swin);
1717
pwin.println("junit.framework.AssertionFailedError");
18-
pwin.println(" at junit.framework.Assert.fail(Assert.java:144)");
19-
pwin.println(" at junit.framework.Assert.assert(Assert.java:19)");
20-
pwin.println(" at junit.framework.Assert.assert(Assert.java:26)");
21-
pwin.println(" at MyTest.f(MyTest.java:13)");
22-
pwin.println(" at MyTest.testStackTrace(MyTest.java:8)");
23-
pwin.println(" at java.lang.reflect.Method.invoke(Native Method)");
24-
pwin.println(" at junit.framework.TestCase.runTest(TestCase.java:156)");
25-
pwin.println(" at junit.framework.TestCase.runBare(TestCase.java:130)");
26-
pwin.println(" at junit.framework.TestResult$1.protect(TestResult.java:100)");
27-
pwin.println(" at junit.framework.TestResult.runProtected(TestResult.java:118)");
28-
pwin.println(" at junit.framework.TestResult.run(TestResult.java:103)");
29-
pwin.println(" at junit.framework.TestCase.run(TestCase.java:121)");
30-
pwin.println(" at junit.framework.TestSuite.runTest(TestSuite.java:157)");
31-
pwin.println(" at junit.framework.TestSuite.run(TestSuite.java, Compiled Code)");
32-
pwin.println(" at junit.swingui.TestRunner$17.run(TestRunner.java:669)");
18+
pwin.println("\tat junit.framework.Assert.fail(Assert.java:144)");
19+
pwin.println("\tat junit.framework.Assert.assert(Assert.java:19)");
20+
pwin.println("\tat junit.framework.Assert.assert(Assert.java:26)");
21+
pwin.println("\tat MyTest.f(MyTest.java:13)");
22+
pwin.println("\tat MyTest.testStackTrace(MyTest.java:8)");
23+
pwin.println("\tat java.lang.reflect.Method.invoke(Native Method)");
24+
pwin.println("\tat junit.framework.TestCase.runTest(TestCase.java:156)");
25+
pwin.println("\tat junit.framework.TestCase.runBare(TestCase.java:130)");
26+
pwin.println("\tat junit.framework.TestResult$1.protect(TestResult.java:100)");
27+
pwin.println("\tat junit.framework.TestResult.runProtected(TestResult.java:118)");
28+
pwin.println("\tat junit.framework.TestResult.run(TestResult.java:103)");
29+
pwin.println("\tat junit.framework.TestCase.run(TestCase.java:121)");
30+
pwin.println("\tat junit.framework.TestSuite.runTest(TestSuite.java:157)");
31+
pwin.println("\tat junit.framework.TestSuite.run(TestSuite.java, Compiled Code)");
32+
pwin.println("\tat junit.swingui.TestRunner$17.run(TestRunner.java:669)");
3333
fUnfiltered = swin.toString();
3434

3535
StringWriter swout = new StringWriter();
3636
PrintWriter pwout = new PrintWriter(swout);
3737
pwout.println("junit.framework.AssertionFailedError");
38-
pwout.println(" at MyTest.f(MyTest.java:13)");
39-
pwout.println(" at MyTest.testStackTrace(MyTest.java:8)");
38+
pwout.println("\tat junit.framework.Assert.fail(Assert.java:144)");
39+
pwout.println("\tat junit.framework.Assert.assert(Assert.java:19)");
40+
pwout.println("\tat junit.framework.Assert.assert(Assert.java:26)");
41+
pwout.println("\tat MyTest.f(MyTest.java:13)");
42+
pwout.println("\tat MyTest.testStackTrace(MyTest.java:8)");
4043
fFiltered = swout.toString();
4144
}
4245

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package org.junit.internal;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import org.junit.Test;
5+
6+
public class StackTracesTest {
7+
8+
@Test
9+
public void trimStackTraceForJUnit4TestFailingInTestMethod() {
10+
String exceptionMessage = "java.lang.AssertionError: message\n"
11+
+ "with multiple lines";
12+
String expectedTrace = exceptionMessage + "\n"
13+
+ "\tat org.junit.Assert.fail(Assert.java:88)\n"
14+
+ "\tat com.example.Example.methodUnderTest(Example.java:18)\n"
15+
+ "\tat com.example.ExampleTest.testMethodUnderTest(ExampleTest.java:11)\n";
16+
String fullTrace = expectedTrace
17+
+ "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
18+
+ "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
19+
+ "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
20+
+ "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
21+
+ "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
22+
+ "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
23+
+ "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)\n"
24+
+ "\tat org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)\n"
25+
+ "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
26+
+ "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:87)\n"
27+
+ "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:1)\n"
28+
+ "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
29+
+ "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
30+
+ "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
31+
+ "\tat org.junit.runners.ParentRunner.access$0(ParentRunner.java:284)\n"
32+
+ "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
33+
+ "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
34+
+ "\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n"
35+
+ "\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n"
36+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)\n"
37+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)\n"
38+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)\n"
39+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)\n";
40+
41+
assertEquals(expectedTrace, StackTraces.trimStackTrace(exceptionMessage, fullTrace));
42+
}
43+
44+
@Test
45+
public void trimStackTraceForJUnit4TestFailingInBeforeMethod() {
46+
String exceptionMessage = "java.lang.AssertionError: message\n"
47+
+ "with multiple lines";
48+
String expectedTrace = exceptionMessage + "\n"
49+
+ "\tat org.junit.Assert.fail(Assert.java:88)\n"
50+
+ "\tat com.example.ExampleTest.beforeMethod(ExampleTest.java:28)\n";
51+
String fullTrace = expectedTrace
52+
+ "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
53+
+ "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
54+
+ "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
55+
+ "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
56+
+ "\tat org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)\n"
57+
+ "\tat org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)\n"
58+
+ "\tat org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)\n"
59+
+ "\tat org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)\n"
60+
+ "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
61+
+ "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:87)\n"
62+
+ "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:1)\n"
63+
+ "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
64+
+ "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
65+
+ "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
66+
+ "\tat org.junit.runners.ParentRunner.access$0(ParentRunner.java:284)\n"
67+
+ "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
68+
+ "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
69+
+ "\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n"
70+
+ "\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n" + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)\n" + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)\n" + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)\n" + "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)\n";
71+
72+
assertEquals(expectedTrace, StackTraces.trimStackTrace(exceptionMessage, fullTrace));
73+
}
74+
75+
@Test
76+
public void trimStackTraceForJUnit4TestFailingInRule() {
77+
String exceptionMessage = "java.lang.AssertionError: message\n"
78+
+ "with multiple lines";
79+
String expectedTrace = exceptionMessage + "\n"
80+
+ "\tat org.junit.Assert.fail(Assert.java:88)\n"
81+
+ "\tat org.example.ExampleRule$1.evaluate(ExampleRule.java:46)\n";
82+
String fullTrace = expectedTrace
83+
+ "\tat org.junit.rules.RunRules.evaluate(RunRules.java:20)\n"
84+
+ "\tat org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)\n"
85+
+ "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:87)\n"
86+
+ "\tat org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:1)\n"
87+
+ "\tat org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)\n"
88+
+ "\tat org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)\n"
89+
+ "\tat org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)\n"
90+
+ "\tat org.junit.runners.ParentRunner.access$0(ParentRunner.java:284)\n"
91+
+ "\tat org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)\n"
92+
+ "\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\n"
93+
+ "\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n"
94+
+ "\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n"
95+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)\n"
96+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)\n"
97+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)\n"
98+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)\n";
99+
100+
assertEquals(expectedTrace, StackTraces.trimStackTrace(exceptionMessage, fullTrace));
101+
}
102+
103+
@Test
104+
public void trimStackTraceForJUnit3TestFailingInTestMethod() {
105+
String exceptionMessage = "java.lang.AssertionError: message\n"
106+
+ "with multiple lines";
107+
String expectedTrace = exceptionMessage + "\n"
108+
+ "\tat junit.framework.TestCase.fail(TestCase.java:223)\n"
109+
+ "\tat com.example.ExampleTest.testFilter(ExampleTest.java:48)\n";
110+
String fullTrace = expectedTrace
111+
+ "\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n"
112+
+ "\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n"
113+
+ "\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"
114+
+ "\tat java.lang.reflect.Method.invoke(Method.java:606)\n"
115+
+ "\tat junit.framework.TestCase.runTest(TestCase.java:177)\n"
116+
+ "\tat junit.framework.TestCase.runBare(TestCase.java:142)\n"
117+
+ "\tat junit.framework.TestResult$1.protect(TestResult.java:125)\n"
118+
+ "\tat junit.framework.TestResult.runProtected(TestResult.java:145)\n"
119+
+ "\tat junit.framework.TestResult.run(TestResult.java:128)\n"
120+
+ "\tat junit.framework.TestCase.run(TestCase.java:130)\n"
121+
+ "\tat junit.framework.TestSuite.runTest(TestSuite.java:252)\n"
122+
+ "\tat junit.framework.TestSuite.run(TestSuite.java:247)\n"
123+
+ "\tat org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)\n"
124+
+ "\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n"
125+
+ "\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n"
126+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)\n"
127+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)\n"
128+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)\n"
129+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)\n";
130+
131+
assertEquals(expectedTrace, StackTraces.trimStackTrace(exceptionMessage, fullTrace));
132+
}
133+
134+
@Test
135+
public void trimStackTraceForJUnit3TestFailingInSetUpMethod() {
136+
String exceptionMessage = "java.lang.AssertionError: message\n"
137+
+ "with multiple lines";
138+
String expectedTrace = exceptionMessage + "\n"
139+
+ "\tat junit.framework.Assert.fail(Assert.java:57)\n"
140+
+ "\tat junit.framework.TestCase.fail(TestCase.java:223)\n"
141+
+ "\tat com.example.ExampleTest.setUp(StackFilterTest.java:44)\n";
142+
String fullTrace = expectedTrace
143+
+ "\tat junit.framework.TestCase.runBare(TestCase.java:140)\n"
144+
+ "\tat junit.framework.TestResult$1.protect(TestResult.java:125)\n"
145+
+ "\tat junit.framework.TestResult.runProtected(TestResult.java:145)\n"
146+
+ "\tat junit.framework.TestResult.run(TestResult.java:128)\n"
147+
+ "\tat junit.framework.TestCase.run(TestCase.java:130)\n"
148+
+ "\tat junit.framework.TestSuite.runTest(TestSuite.java:252)\n"
149+
+ "\tat junit.framework.TestSuite.run(TestSuite.java:247)\n"
150+
+ "\tat org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)\n"
151+
+ "\tat org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)\n"
152+
+ "\tat org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)\n"
153+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)\n"
154+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)\n"
155+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)\n"
156+
+ "\tat org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)\n";
157+
158+
assertEquals(expectedTrace, StackTraces.trimStackTrace(exceptionMessage, fullTrace));
159+
}
160+
}

‎src/test/java/org/junit/tests/AllTests.java

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.junit.AssumptionViolatedExceptionTest;
77
import org.junit.experimental.categories.CategoryFilterFactoryTest;
88
import org.junit.internal.MethodSorterTest;
9+
import org.junit.internal.StackTracesTest;
910
import org.junit.internal.matchers.StacktracePrintingMatcherTest;
1011
import org.junit.internal.matchers.ThrowableCauseMatcherTest;
1112
import org.junit.rules.DisableOnDebugTest;
@@ -235,6 +236,7 @@
235236
ForwardCompatibilityPrintingTest.class,
236237
DescriptionTest.class,
237238
ErrorReportingRunnerTest.class,
239+
StackTracesTest.class,
238240
TemporaryFolderRuleAssuredDeletionTest.class
239241
})
240242
public class AllTests {

0 commit comments

Comments
 (0)
Please sign in to comment.