junit: move ComparisonFailure detection to some common place (to be used by junit5)

This commit is contained in:
Anna Kozlova
2016-03-10 13:51:39 +01:00
parent bffa94da84
commit 02cdec08bb
3 changed files with 59 additions and 56 deletions
@@ -15,8 +15,9 @@
*/
package com.intellij.junit4;
import com.intellij.rt.execution.testFrameworks.AbstractExpectedPatterns;
import com.intellij.rt.execution.junit.ComparisonFailureData;
import com.intellij.rt.execution.testFrameworks.AbstractExpectedPatterns;
import junit.framework.ComparisonFailure;
import java.util.ArrayList;
import java.util.List;
@@ -35,6 +36,10 @@ public class ExpectedPatterns extends AbstractExpectedPatterns {
".*?\\s*expected: (.*)\\s*but was: (.*)"
};
private static final String MESSAGE_LENGTH_FOR_PATTERN_MATCHING = "idea.junit.message.length.threshold";
private static final String JUNIT_FRAMEWORK_COMPARISON_NAME = ComparisonFailure.class.getName();
private static final String ORG_JUNIT_COMPARISON_NAME = "org.junit.ComparisonFailure";
static {
registerPatterns(PATTERN_STRINGS, PATTERNS);
}
@@ -42,4 +47,55 @@ public class ExpectedPatterns extends AbstractExpectedPatterns {
public static ComparisonFailureData createExceptionNotification(String message) {
return createExceptionNotification(message, PATTERNS);
}
public static ComparisonFailureData createExceptionNotification(Throwable assertion) {
if (isComparisonFailure(assertion)) {
return ComparisonFailureData.create(assertion);
}
try {
final Throwable cause = assertion.getCause();
if (isComparisonFailure(cause)) {
return ComparisonFailureData.create(cause);
}
}
catch (Throwable ignore) {
}
final String message = assertion.getMessage();
if (message != null && acceptedByThreshold(message.length())) {
try {
return createExceptionNotification(message);
}
catch (Throwable ignored) {}
}
return null;
}
private static boolean isComparisonFailure(Throwable throwable) {
if (throwable == null) return false;
return isComparisonFailure(throwable.getClass());
}
private static boolean isComparisonFailure(Class aClass) {
if (aClass == null) return false;
final String throwableClassName = aClass.getName();
if (throwableClassName.equals(JUNIT_FRAMEWORK_COMPARISON_NAME) || throwableClassName.equals(ORG_JUNIT_COMPARISON_NAME)) return true;
return isComparisonFailure(aClass.getSuperclass());
}
private static boolean acceptedByThreshold(int messageLength) {
int threshold = 10000;
try {
final String property = System.getProperty(MESSAGE_LENGTH_FOR_PATTERN_MATCHING);
if (property != null) {
try {
threshold = Integer.parseInt(property);
}
catch (NumberFormatException ignore) {}
}
}
catch (SecurityException ignored) {}
return messageLength < threshold;
}
}
@@ -22,7 +22,6 @@ package com.intellij.junit4;
import com.intellij.rt.execution.junit.ComparisonFailureData;
import com.intellij.rt.execution.junit.MapSerializerUtil;
import junit.framework.ComparisonFailure;
import org.junit.Ignore;
import org.junit.runner.Description;
import org.junit.runner.Result;
@@ -36,9 +35,6 @@ import java.lang.annotation.Annotation;
import java.util.*;
public class JUnit4TestListener extends RunListener {
private static final String MESSAGE_LENGTH_FOR_PATTERN_MATCHING = "idea.junit.message.length.threshold";
private static final String JUNIT_FRAMEWORK_COMPARISON_NAME = ComparisonFailure.class.getName();
private static final String ORG_JUNIT_COMPARISON_NAME = "org.junit.ComparisonFailure";
public static final String EMPTY_SUITE_NAME = "junit.framework.TestSuite$1";
public static final String EMPTY_SUITE_WARNING = "warning";
@@ -202,7 +198,7 @@ public class JUnit4TestListener extends RunListener {
if (failure != null) {
final String trace = getTrace(failure);
final Throwable ex = failure.getException();
final ComparisonFailureData notification = createExceptionNotification(ex);
final ComparisonFailureData notification = ExpectedPatterns.createExceptionNotification(ex);
ComparisonFailureData.registerSMAttributes(notification, trace, failure.getMessage(), attrs, ex);
}
}
@@ -283,55 +279,6 @@ public class JUnit4TestListener extends RunListener {
testFinished(description);
}
private static boolean isComparisonFailure(Throwable throwable) {
if (throwable == null) return false;
return isComparisonFailure(throwable.getClass());
}
private static boolean isComparisonFailure(Class aClass) {
if (aClass == null) return false;
final String throwableClassName = aClass.getName();
if (throwableClassName.equals(JUNIT_FRAMEWORK_COMPARISON_NAME) || throwableClassName.equals(ORG_JUNIT_COMPARISON_NAME)) return true;
return isComparisonFailure(aClass.getSuperclass());
}
static ComparisonFailureData createExceptionNotification(Throwable assertion) {
if (isComparisonFailure(assertion)) {
return ComparisonFailureData.create(assertion);
}
try {
final Throwable cause = assertion.getCause();
if (isComparisonFailure(cause)) {
return ComparisonFailureData.create(cause);
}
}
catch (Throwable ignore) {
}
final String message = assertion.getMessage();
if (message != null && acceptedByThreshold(message.length())) {
try {
return ExpectedPatterns.createExceptionNotification(message);
}
catch (Throwable ignored) {}
}
return null;
}
private static boolean acceptedByThreshold(int messageLength) {
int threshold = 10000;
try {
final String property = System.getProperty(MESSAGE_LENGTH_FOR_PATTERN_MATCHING);
if (property != null) {
try {
threshold = Integer.parseInt(property);
}
catch (NumberFormatException ignore) {}
}
}
catch (SecurityException ignored) {}
return messageLength < threshold;
}
private void sendTree(Description description, Description parent, List currentParents) {
List pParents = new ArrayList(3);
pParents.addAll(currentParents);
@@ -98,7 +98,7 @@ public class JUnit4TestResultsSender extends RunListener {
private static PacketFactory createExceptionNotification(Throwable assertion) {
if (assertion instanceof KnownException) return ((KnownException)assertion).getPacketFactory();
final ComparisonFailureData notification = JUnit4TestListener.createExceptionNotification(assertion);
final ComparisonFailureData notification = ExpectedPatterns.createExceptionNotification(assertion);
if (notification != null) {
return ComparisonDetailsExtractor.create(assertion, notification.getExpected(), notification.getActual());
}