package hudson.plugins.junitattachments;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.tasks.junit.CaseResult;
import hudson.tasks.junit.ClassResult;
import hudson.tasks.junit.TestAction;
import hudson.tasks.junit.TestDataPublisher;
import hudson.tasks.junit.TestObject;
import hudson.tasks.junit.TestResult;
import hudson.tasks.junit.TestResultAction;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.kohsuke.stapler.DataBoundConstructor;
public class AttachmentPublisher extends TestDataPublisher {
@DataBoundConstructor
public AttachmentPublisher() {
}
public static FilePath getAttachmentPath(AbstractBuild<?, ?> build) {
// return new FilePath(Hudson.MasterComputer.localChannel,
// build.getRootDir().getAbsolutePath()).child("junit-attachments");
return new FilePath(new File(build.getRootDir().getAbsolutePath()))
.child("junit-attachments");
}
@Override
public Data getTestData(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener, TestResult testResult) throws IOException,
InterruptedException {
final GetTestDataMethodObject methodObject = new GetTestDataMethodObject(build, launcher, listener, testResult);
Map<String, List<String>> attachments = methodObject.getAttachments();
if (attachments.isEmpty()) {
return null;
}
return new Data(attachments);
}
public static class Data extends TestResultAction.Data {
private final Map<String, List<String>> attachments;
public Data(Map<String, List<String>> attachments) {
this.attachments = attachments;
}
@Override
public List<TestAction> getTestAction(TestObject testObject) {
ClassResult cr;
if (testObject instanceof ClassResult) {
cr = (ClassResult) testObject;
} else if (testObject instanceof CaseResult) {
cr = (ClassResult) testObject.getParent();
} else {
return Collections.emptyList();
}
String className = cr.getParent().getName() + "." + cr.getName();
List<String> attachments = this.attachments.get(className);
if (attachments != null) {
return Collections
.<TestAction> singletonList(new AttachmentTestAction(
cr, getAttachmentPath(testObject.getOwner())
.child(className), attachments));
} else {
return Collections.emptyList();
}
}
}
@Extension
public static class DescriptorImpl extends Descriptor<TestDataPublisher> {
@Override
public String getDisplayName() {
return "Publish test attachments";
}
}
}