diff --git a/core/src/main/java/hudson/maven/reporters/SurefireAggregatedReport.java b/core/src/main/java/hudson/maven/reporters/SurefireAggregatedReport.java index 2364835507..c41aea415a 100644 --- a/core/src/main/java/hudson/maven/reporters/SurefireAggregatedReport.java +++ b/core/src/main/java/hudson/maven/reporters/SurefireAggregatedReport.java @@ -5,10 +5,10 @@ import hudson.maven.MavenBuild; import hudson.maven.MavenModule; import hudson.maven.MavenModuleSet; import hudson.maven.MavenModuleSetBuild; +import hudson.model.Action; import hudson.tasks.test.AbstractTestResultAction; import hudson.tasks.test.AggregatedTestResultAction; import hudson.tasks.test.TestResultProjectAction; -import hudson.model.Action; import java.util.List; import java.util.Map; @@ -41,7 +41,7 @@ public class SurefireAggregatedReport extends AggregatedTestResultAction impleme } @Override - protected MavenBuild resolveChild(Child child) { + public MavenBuild resolveChild(Child child) { MavenModuleSet mms = (MavenModuleSet) owner.getProject(); MavenModule m = mms.getModule(child.name); if(m!=null) diff --git a/core/src/main/java/hudson/tasks/junit/CaseResult.java b/core/src/main/java/hudson/tasks/junit/CaseResult.java index d21e3121f7..93e519b32a 100644 --- a/core/src/main/java/hudson/tasks/junit/CaseResult.java +++ b/core/src/main/java/hudson/tasks/junit/CaseResult.java @@ -1,8 +1,8 @@ package hudson.tasks.junit; -import hudson.Util; import hudson.model.AbstractBuild; import org.dom4j.Element; +import org.kohsuke.stapler.export.Exported; import java.util.Comparator; import java.text.DecimalFormat; @@ -96,6 +96,7 @@ public final class CaseResult extends TestObject implements Comparable * Note that this may contain any URL-unfriendly character. */ + @Exported public String getName() { return testName; } @@ -103,6 +104,7 @@ public final class CaseResult extends TestObject implements Comparable getChildren() { return cases; } + // TODO: wait for stapler 1.60 @Exported public float getDuration() { return duration; } + @Exported public int getPassCount() { return passCount; } + @Exported public int getFailCount() { return failCount; } diff --git a/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java b/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java index b9b4bf5966..fe7464a01f 100644 --- a/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java +++ b/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java @@ -3,16 +3,15 @@ package hudson.tasks.junit; import hudson.FilePath.FileCallable; import hudson.Launcher; import hudson.Util; +import hudson.maven.MavenModuleSet; +import hudson.maven.AbstractMavenProject; import hudson.matrix.MatrixAggregatable; import hudson.matrix.MatrixAggregator; import hudson.matrix.MatrixBuild; -import hudson.model.AbstractBuild; -import hudson.model.Action; -import hudson.model.BuildListener; -import hudson.model.Descriptor; -import hudson.model.Result; +import hudson.model.*; import hudson.remoting.VirtualChannel; import hudson.tasks.Publisher; +import hudson.tasks.BuildStepDescriptor; import hudson.tasks.test.TestResultAggregator; import hudson.tasks.test.TestResultProjectAction; import hudson.util.FormFieldValidator; @@ -106,7 +105,7 @@ public class JUnitResultArchiver extends Publisher implements Serializable, Matr private static final long serialVersionUID = 1L; - public static class DescriptorImpl extends Descriptor { + public static class DescriptorImpl extends BuildStepDescriptor { public static final Descriptor DESCRIPTOR = new DescriptorImpl(); public DescriptorImpl() { @@ -131,5 +130,10 @@ public class JUnitResultArchiver extends Publisher implements Serializable, Matr public Publisher newInstance(StaplerRequest req) { return new JUnitResultArchiver(req.getParameter("junitreport_includes")); } + + public boolean isApplicable(Class jobType) { + // for Maven we have SurefireArchiver that automatically kicks in. + return !AbstractMavenProject.class.isAssignableFrom(jobType); + } } } diff --git a/core/src/main/java/hudson/tasks/junit/PackageResult.java b/core/src/main/java/hudson/tasks/junit/PackageResult.java index d5cba7ee4a..65d180d9f8 100644 --- a/core/src/main/java/hudson/tasks/junit/PackageResult.java +++ b/core/src/main/java/hudson/tasks/junit/PackageResult.java @@ -3,6 +3,7 @@ package hudson.tasks.junit; import hudson.model.AbstractBuild; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.export.Exported; import java.util.ArrayList; import java.util.Collection; @@ -34,6 +35,7 @@ public final class PackageResult extends MetaTabulatedResult { this.parent = parent; } + @Exported public String getName() { return packageName; } @@ -56,14 +58,17 @@ public final class PackageResult extends MetaTabulatedResult { return "Class"; } + // TODO: wait until stapler 1.60 to do this @Exported public float getDuration() { return duration; } + @Exported public int getPassCount() { return passCount; } + @Exported public int getFailCount() { return failCount; } @@ -72,6 +77,7 @@ public final class PackageResult extends MetaTabulatedResult { return classes.get(name); } + @Exported(name="child") public Collection getChildren() { return classes.values(); } diff --git a/core/src/main/java/hudson/tasks/junit/TestObject.java b/core/src/main/java/hudson/tasks/junit/TestObject.java index 13ee0de4bd..a43e5f68b6 100644 --- a/core/src/main/java/hudson/tasks/junit/TestObject.java +++ b/core/src/main/java/hudson/tasks/junit/TestObject.java @@ -2,15 +2,19 @@ package hudson.tasks.junit; import hudson.model.AbstractBuild; import hudson.model.ModelObject; +import hudson.model.Api; import hudson.Util; import java.io.Serializable; +import org.kohsuke.stapler.export.ExportedBean; + /** * Base class for all test result objects. * * @author Kohsuke Kawaguchi */ +@ExportedBean public abstract class TestObject implements ModelObject, Serializable { public abstract AbstractBuild getOwner(); @@ -35,6 +39,13 @@ public abstract class TestObject implements ModelObject, Serializable { return Util.getTimeSpanString((long)(getDuration()*1000)); } + /** + * Exposes this object through the remote API. + */ + public Api getApi() { + return new Api(this); + } + /** * Replaces URL-unasfe characters. */ diff --git a/core/src/main/java/hudson/tasks/junit/TestResult.java b/core/src/main/java/hudson/tasks/junit/TestResult.java index 121c76a4f1..fc5d24876e 100644 --- a/core/src/main/java/hudson/tasks/junit/TestResult.java +++ b/core/src/main/java/hudson/tasks/junit/TestResult.java @@ -7,6 +7,7 @@ import org.apache.tools.ant.DirectoryScanner; import org.dom4j.DocumentException; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.export.Exported; import java.io.File; import java.io.IOException; @@ -157,26 +158,31 @@ public final class TestResult extends MetaTabulatedResult { return "Package"; } + // TODO once stapler 1.60 is released: @Exported public float getDuration() { return duration; } + @Exported(visibility=999) @Override public int getPassCount() { return totalTests-getFailCount(); } + @Exported(visibility=999) @Override public int getFailCount() { return failedTests.size(); } + @Exported @Override public List getFailedTests() { return failedTests; } @Override + @Exported(name="child") public Collection getChildren() { return byPackages.values(); } diff --git a/core/src/main/java/hudson/tasks/junit/TestResultAction.java b/core/src/main/java/hudson/tasks/junit/TestResultAction.java index 62898bcec5..f7085f027c 100644 --- a/core/src/main/java/hudson/tasks/junit/TestResultAction.java +++ b/core/src/main/java/hudson/tasks/junit/TestResultAction.java @@ -9,6 +9,7 @@ import hudson.tasks.test.AbstractTestResultAction; import hudson.util.StringConverter2; import hudson.util.XStream2; import org.kohsuke.stapler.StaplerProxy; +import org.kohsuke.stapler.export.Exported; import java.io.File; import java.io.IOException; @@ -83,6 +84,7 @@ public class TestResultAction extends AbstractTestResultAction } @Override + @Exported public int getFailCount() { if(totalCount==null) getResult(); // this will compute the result @@ -90,6 +92,7 @@ public class TestResultAction extends AbstractTestResultAction } @Override + @Exported public int getTotalCount() { if(totalCount==null) getResult(); // this will compute the result diff --git a/core/src/main/java/hudson/tasks/test/AbstractTestResultAction.java b/core/src/main/java/hudson/tasks/test/AbstractTestResultAction.java index 761a4f3763..37c526ce7e 100644 --- a/core/src/main/java/hudson/tasks/test/AbstractTestResultAction.java +++ b/core/src/main/java/hudson/tasks/test/AbstractTestResultAction.java @@ -21,6 +21,7 @@ import org.jfree.data.category.CategoryDataset; import org.jfree.ui.RectangleInsets; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.export.ExportedBean; import java.awt.Color; import java.io.IOException; @@ -34,6 +35,7 @@ import java.io.IOException; * * @author Kohsuke Kawaguchi */ +@ExportedBean public abstract class AbstractTestResultAction implements HealthReportingAction { public final AbstractBuild owner; @@ -90,6 +92,25 @@ public abstract class AbstractTestResultAction + * If such a concept doesn't make sense for a particular subtype, + * return this. + */ + public abstract Object getResult(); + /** * Gets the test result of the previous build, if it's recorded, or null. */ diff --git a/core/src/main/java/hudson/tasks/test/AggregatedTestResultAction.java b/core/src/main/java/hudson/tasks/test/AggregatedTestResultAction.java index fc4bf18f52..dd7bf70471 100644 --- a/core/src/main/java/hudson/tasks/test/AggregatedTestResultAction.java +++ b/core/src/main/java/hudson/tasks/test/AggregatedTestResultAction.java @@ -2,7 +2,10 @@ package hudson.tasks.test; import hudson.maven.MavenBuild; import hudson.model.AbstractBuild; +import org.kohsuke.stapler.export.Exported; +import org.kohsuke.stapler.export.ExportedBean; +import java.util.AbstractList; import java.util.ArrayList; import java.util.List; @@ -12,6 +15,7 @@ import java.util.List; * * @author Kohsuke Kawaguchi */ +@ExportedBean public abstract class AggregatedTestResultAction extends AbstractTestResultAction { private int failCount,totalCount; @@ -53,14 +57,65 @@ public abstract class AggregatedTestResultAction extends AbstractTestResultActio this.children.add(new Child(getChildName(child),child.owner.number)); } + @Exported public int getFailCount() { return failCount; } + @Exported public int getTotalCount() { return totalCount; } + public List getResult() { + // I think this is a reasonable default. + return getChildReports(); + } + + /** + * Data-binding bean for the remote API. + */ + @ExportedBean(defaultVisibility=2) + public static final class ChildReport { + @Exported + public final AbstractBuild child; + @Exported + public final Object result; + + public ChildReport(AbstractBuild child, AbstractTestResultAction result) { + this.child = child; + this.result = result.getResult(); + } + } + + /** + * Mainly for the remote API. Expose results from children. + */ + @Exported + public List getChildReports() { + return new AbstractList() { + public ChildReport get(int index) { + return new ChildReport( + resolveChild(children.get(index)), + getChildReport(children.get(index))); + } + + public int size() { + return children.size(); + } + }; + } + protected abstract String getChildName(AbstractTestResultAction tr); - protected abstract AbstractBuild resolveChild(Child child); + public abstract AbstractBuild resolveChild(Child child); + + /** + * Uses {@link #resolveChild(Child)} and obtain the + * {@link AbstractTestResultAction} object for the given child. + */ + protected AbstractTestResultAction getChildReport(Child child) { + AbstractBuild b = resolveChild(child); + if(b==null) return null; + return b.getAction(AbstractTestResultAction.class); + } } diff --git a/core/src/main/java/hudson/tasks/test/MatrixTestResult.java b/core/src/main/java/hudson/tasks/test/MatrixTestResult.java index 9b765fda45..892abbc516 100644 --- a/core/src/main/java/hudson/tasks/test/MatrixTestResult.java +++ b/core/src/main/java/hudson/tasks/test/MatrixTestResult.java @@ -25,7 +25,7 @@ public class MatrixTestResult extends AggregatedTestResultAction { } @Override - protected AbstractBuild resolveChild(Child child) { + public AbstractBuild resolveChild(Child child) { MatrixBuild b = (MatrixBuild)owner; return b.getRun(Combination.fromString(child.name)); } diff --git a/core/src/main/resources/hudson/maven/reporters/SurefireAggregatedReport/index.jelly b/core/src/main/resources/hudson/maven/reporters/SurefireAggregatedReport/index.jelly index 9350034096..c086088f80 100644 --- a/core/src/main/resources/hudson/maven/reporters/SurefireAggregatedReport/index.jelly +++ b/core/src/main/resources/hudson/maven/reporters/SurefireAggregatedReport/index.jelly @@ -20,7 +20,11 @@ - ${c.name} + + + ${c.name} + + ${p.failCount} ${h.getDiffString2(p.failCount-prev.failCount)}