Skip to content

Commit

Permalink
Merge pull request #769 from dnadolny/master
Browse files Browse the repository at this point in the history
[FIXED JENKINS-17478] Add extension point to rewrite JUnit test names
  • Loading branch information
dnadolny committed May 2, 2013
2 parents 53d1e20 + d658f55 commit 4e37084
Show file tree
Hide file tree
Showing 11 changed files with 94 additions and 18 deletions.
13 changes: 8 additions & 5 deletions core/src/main/java/hudson/tasks/junit/CaseResult.java
Expand Up @@ -214,7 +214,7 @@ private static String getSkippedMessage(Element testCase) {
}

public String getDisplayName() {
return testName;
return TestNameTransformer.getTransformedName(testName);
}

/**
Expand All @@ -233,7 +233,7 @@ public String getDisplayName() {
*/
@Override
public String getTitle() {
return "Case Result: " + getName();
return "Case Result: " + getDisplayName();
}

/**
Expand Down Expand Up @@ -285,11 +285,14 @@ public String getPackageName() {
if(idx<0) return "(root)";
else return className.substring(0,idx);
}

public String getFullName() {
return className+'.'+getName();
return className+'.'+getName();
}

public String getFullDisplayName() {
return TestNameTransformer.getTransformedName(getFullName());
}


@Override
public int getFailCount() {
Expand Down
10 changes: 7 additions & 3 deletions core/src/main/java/hudson/tasks/junit/ClassResult.java
Expand Up @@ -98,7 +98,7 @@ public hudson.tasks.test.TestResult findCorrespondingResult(String id) {
}

public String getTitle() {
return Messages.ClassResult_getTitle(getName());
return Messages.ClassResult_getTitle(getDisplayName());
}

@Override
Expand Down Expand Up @@ -223,11 +223,15 @@ public int compareTo(ClassResult that) {
}

public String getDisplayName() {
return getName();
return TestNameTransformer.getTransformedName(getName());
}

public String getFullName() {
return getParent().getDisplayName() + "." + className;
return getParent().getName() + "." + className;
}

public String getFullDisplayName() {
return getParent().getDisplayName() + "." + TestNameTransformer.getTransformedName(className);
}

/**
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/hudson/tasks/junit/PackageResult.java
Expand Up @@ -110,7 +110,7 @@ public TestResult findCorrespondingResult(String id) {

@Override
public String getTitle() {
return Messages.PackageResult_getTitle(getName());
return Messages.PackageResult_getTitle(getDisplayName());
}

@Override
Expand Down Expand Up @@ -303,6 +303,6 @@ public int compareTo(PackageResult that) {
}

public String getDisplayName() {
return packageName;
return TestNameTransformer.getTransformedName(packageName);
}
}
42 changes: 42 additions & 0 deletions core/src/main/java/hudson/tasks/junit/TestNameTransformer.java
@@ -0,0 +1,42 @@
package hudson.tasks.junit;

import hudson.ExtensionList;
import hudson.ExtensionPoint;
import jenkins.model.Jenkins;

/**
* Allow extensions to transform the class/package/method name for JUnit test
* cases which will be displayed on the test result page.
*
* This is useful for alternative JVM languages like Scala that allow
* identifiers with invalid characters by encoding them: an extension can
* decode the identifier so it is displayed correctly.
*
* @since 1.515
*/

public abstract class TestNameTransformer implements ExtensionPoint {
/**
* Transform the class/package/method name.
*
* @param name
* Class name (may be simple or fully qualified), package name, or
* method name from a JUnit test.
* @return
* The transformed name, or the name that was passed in if it doesn't
* need to be changed.
*/
public abstract String transformName(String name);

public static String getTransformedName(String name) {
String transformedName = name;
for (TestNameTransformer transformer : all()) {
transformedName = transformer.transformName(transformedName);
}
return transformedName;
}

public static ExtensionList<TestNameTransformer> all() {
return Jenkins.getInstance().getExtensionList(TestNameTransformer.class);
}
}
Expand Up @@ -34,7 +34,7 @@ THE SOFTWARE.
</h1>
<p>
<span style="font-weight:bold">
<st:out value="${it.fullName}"/>
<st:out value="${it.fullDisplayName}"/>
</span>
<j:if test="${it.suiteResult != null &amp;&amp; it.className != it.suiteResult.name}">
(from <st:out value="${it.suiteResult.name}"/>)
Expand Down
Expand Up @@ -36,7 +36,7 @@ THE SOFTWARE.
<j:forEach var="p" items="${it.children}" varStatus="status">
<tr>
<td class="pane">
<a href="${p.safeName}" class="model-link inside"><span style="${p.previousResult==null?'font-weight:bold':''}"><st:out value="${p.name}" /></span></a>
<a href="${p.safeName}" class="model-link inside"><span style="${p.previousResult==null?'font-weight:bold':''}"><st:out value="${p.displayName}" /></span></a>
<j:forEach var="badge" items="${p.testActions}">
<st:include it="${badge}" page="badge.jelly" optional="true"/>
</j:forEach>
Expand Down
Expand Up @@ -66,7 +66,7 @@ THE SOFTWARE.
<!-- child test results are referenced from their parent builds -->
<j:set var="build" value="${testObject.owner}" />
<a href="${it.getTestResultPath(testObject)}">
<st:out value="${testObject.fullName}" />
<st:out value="${testObject.fullDisplayName}" />
</a>
</li>
</j:while>
Expand Down
Expand Up @@ -63,7 +63,7 @@ THE SOFTWARE.
<a id="test-${f.fullName}-hidelink" style="display:none"
href="javascript:hideStackTrace('test-${h.jsStringEscape(f.fullName)}')">&lt;&lt;&lt;</a>
<st:nbsp/>
<a href="${f.getRelativePathFrom(it)}" class="model-link inside"><st:out value="${f.fullName}"/></a>
<a href="${f.getRelativePathFrom(it)}" class="model-link inside"><st:out value="${f.fullDisplayName}"/></a>
<j:forEach var="badge" items="${f.testActions}">
<st:include it="${badge}" page="badge.jelly" optional="true"/>
</j:forEach>
Expand Down Expand Up @@ -102,7 +102,7 @@ THE SOFTWARE.
<j:set var="prev" value="${prevAll.findCorrespondingResult(p.id)}" />
<tr>
<td class="pane">
<a href="${p.safeName}/" class="model-link inside"><span style="${prev==null?'font-weight:bold':''}"><st:out value="${p.name}" /></span></a>
<a href="${p.safeName}/" class="model-link inside"><span style="${prev==null?'font-weight:bold':''}"><st:out value="${p.displayName}" /></span></a>
<j:forEach var="badge" items="${p.testActions}">
<st:include it="${badge}" page="badge.jelly" optional="true"/>
</j:forEach>
Expand Down
4 changes: 2 additions & 2 deletions core/src/test/java/hudson/tasks/junit/SuiteResultTest.java
Expand Up @@ -82,7 +82,7 @@ public void testIssue1463() throws Exception {

List<CaseResult> cases = result.getCases();
for (CaseResult caseResult : cases) {
assertEquals("Test class name is incorrect in " + caseResult.getDisplayName(), "WLI-FI-Tests-Fake", caseResult.getClassName());
assertEquals("Test class name is incorrect in " + caseResult.getName(), "WLI-FI-Tests-Fake", caseResult.getClassName());
}
assertEquals("Test name is incorrect", "IF_importTradeConfirmationToDwh", cases.get(0).getName());
assertEquals("Test name is incorrect", "IF_getAmartaDisbursements", cases.get(1).getName());
Expand Down Expand Up @@ -119,7 +119,7 @@ public void testErrorDetails() throws Exception {

List<CaseResult> cases = result.getCases();
for (CaseResult caseResult : cases) {
assertEquals("Test class name is incorrect in " + caseResult.getDisplayName(), "some.package.somewhere.WhooHoo", caseResult.getClassName());
assertEquals("Test class name is incorrect in " + caseResult.getName(), "some.package.somewhere.WhooHoo", caseResult.getClassName());
}
assertEquals("this normally has the string like, expected mullet, but got bream", cases.get(0).getErrorDetails());
}
Expand Down
27 changes: 27 additions & 0 deletions test/src/test/java/hudson/tasks/junit/TestNameTransformerTest.java
@@ -0,0 +1,27 @@
package hudson.tasks.junit;

import hudson.Extension;

import org.jvnet.hudson.test.HudsonTestCase;

public class TestNameTransformerTest extends HudsonTestCase {

private static final String UniqueNameForTest = "unique-name-to-test-name-transformer";

@Extension
public static class TestTransformer extends TestNameTransformer {
@Override
public String transformName(String name) {
if (UniqueNameForTest.equals(name)) {
return name + "-transformed";
}
return name;
}
}

public void testNameIsTransformed() {
assertEquals(UniqueNameForTest + "-transformed", TestNameTransformer.getTransformedName(UniqueNameForTest));
}

}

Expand Up @@ -286,7 +286,7 @@ void assertStringEmptyOrNull(String msg, String str) {
}

void assertPaneDiffText(String msg, int expectedValue, Object paneObj) {
assertTrue( "paneObj should be an HtmlElement", paneObj instanceof HtmlElement );
assertTrue( "paneObj should be an HtmlElement, it was " + paneObj.getClass(), paneObj instanceof HtmlElement );
String paneText = ((HtmlElement) paneObj).asText();
if (expectedValue==0) {
assertStringEmptyOrNull(msg, paneText);
Expand Down

0 comments on commit 4e37084

Please sign in to comment.