Skip to content

Commit

Permalink
UI and descriptors for pluggable storage (#155)
Browse files Browse the repository at this point in the history
  • Loading branch information
timja committed Sep 16, 2020
1 parent 66920dd commit 415e114
Show file tree
Hide file tree
Showing 22 changed files with 245 additions and 85 deletions.
15 changes: 15 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,16 @@
<version>1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.jenkins</groupId>
<artifactId>configuration-as-code</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.jenkins.configuration-as-code</groupId>
<artifactId>test-harness</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
Expand All @@ -157,6 +167,11 @@
<artifactId>error_prone_annotations</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
9 changes: 5 additions & 4 deletions src/main/java/hudson/tasks/junit/CaseResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@
package hudson.tasks.junit;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.tasks.junit.storage.TestResultImpl;
import hudson.tasks.junit.storage.TestResultStorage;
import io.jenkins.plugins.junit.storage.FileJunitTestResultStorage;
import io.jenkins.plugins.junit.storage.TestResultImpl;
import io.jenkins.plugins.junit.storage.JunitTestResultStorage;
import hudson.util.TextFile;
import org.apache.commons.collections.iterators.ReverseListIterator;
import org.apache.commons.io.FileUtils;
Expand Down Expand Up @@ -447,8 +448,8 @@ else if (getRun() != null) {
}

public Run<?,?> getFailedSinceRun() {
TestResultStorage storage = TestResultStorage.find();
if (storage != null) {
JunitTestResultStorage storage = JunitTestResultStorage.find();
if (!(storage instanceof FileJunitTestResultStorage)) {
Run<?, ?> run = Stapler.getCurrentRequest().findAncestorObject(Run.class);
TestResultImpl pluggableStorage = storage.load(run.getParent().getFullName(), run.getNumber());
return pluggableStorage.getFailedSinceRun(this);
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/hudson/tasks/junit/ClassResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@
package hudson.tasks.junit;

import hudson.model.Run;
import hudson.tasks.junit.storage.TestResultImpl;
import hudson.tasks.junit.storage.TestResultStorage;
import io.jenkins.plugins.junit.storage.FileJunitTestResultStorage;
import io.jenkins.plugins.junit.storage.TestResultImpl;
import io.jenkins.plugins.junit.storage.JunitTestResultStorage;
import hudson.tasks.test.TabulatedResult;
import hudson.tasks.test.TestResult;
import hudson.tasks.test.TestObject;
Expand Down Expand Up @@ -131,9 +132,9 @@ public CaseResult getCaseResult(String name) {

@Override
public Object getDynamic(String name, StaplerRequest req, StaplerResponse rsp) {
TestResultStorage storage = TestResultStorage.find();
JunitTestResultStorage storage = JunitTestResultStorage.find();
CaseResult c;
if (storage != null) {
if (!(storage instanceof FileJunitTestResultStorage)) {
Run<?, ?> run = Stapler.getCurrentRequest().findAncestorObject(Run.class);
TestResultImpl pluggableStorage = storage.load(run.getParent().getFullName(), run.getNumber());
c = pluggableStorage.getCaseResult(name);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/hudson/tasks/junit/History.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@
import edu.hm.hafner.echarts.ChartModelConfiguration;
import edu.hm.hafner.echarts.JacksonFacade;
import edu.hm.hafner.echarts.LinesChartModel;
import hudson.tasks.junit.storage.TestResultImpl;
import hudson.tasks.test.TestObject;
import hudson.tasks.test.TestObjectIterable;
import hudson.tasks.test.TestResultDurationChart;
import hudson.tasks.test.TestResultTrendChart;
import io.jenkins.plugins.junit.storage.TestResultImpl;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.bind.JavaScriptMethod;
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/hudson/tasks/junit/JUnitParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@
import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.remoting.VirtualChannel;
import hudson.tasks.junit.storage.TestResultStorage;
import io.jenkins.plugins.junit.storage.JunitTestResultStorage;

import io.jenkins.plugins.junit.storage.JunitTestResultStorage.RemotePublisher;
import java.io.IOException;
import java.io.File;

Expand Down Expand Up @@ -107,7 +108,7 @@ public TestResult parseResult(String testResultLocations, Run<?,?> build, Pipeli
}

public TestResultSummary summarizeResult(String testResultLocations, Run<?,?> build, PipelineTestDetails pipelineTestDetails,
FilePath workspace, Launcher launcher, TaskListener listener, TestResultStorage storage)
FilePath workspace, Launcher launcher, TaskListener listener, JunitTestResultStorage storage)
throws InterruptedException, IOException {
return workspace.act(new StorageParseResultCallable(testResultLocations, build, keepLongStdio, allowEmptyResults, pipelineTestDetails, storage.createRemotePublisher(build), listener));
}
Expand Down Expand Up @@ -173,10 +174,10 @@ protected TestResult handle(TestResult result) throws IOException {

private static final class StorageParseResultCallable extends ParseResultCallable<TestResultSummary> {

private final TestResultStorage.RemotePublisher publisher;
private final RemotePublisher publisher;
private final TaskListener listener;

StorageParseResultCallable(String testResults, Run<?,?> build, boolean keepLongStdio, boolean allowEmptyResults, PipelineTestDetails pipelineTestDetails, TestResultStorage.RemotePublisher publisher, TaskListener listener) {
StorageParseResultCallable(String testResults, Run<?,?> build, boolean keepLongStdio, boolean allowEmptyResults, PipelineTestDetails pipelineTestDetails, RemotePublisher publisher, TaskListener listener) {
super(testResults, build, keepLongStdio, allowEmptyResults, pipelineTestDetails);
this.publisher = publisher;
this.listener = listener;
Expand Down
13 changes: 7 additions & 6 deletions src/main/java/hudson/tasks/junit/JUnitResultArchiver.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@
import hudson.tasks.Publisher;
import hudson.tasks.Recorder;
import hudson.tasks.junit.TestResultAction.Data;
import hudson.tasks.junit.storage.TestResultStorage;
import io.jenkins.plugins.junit.storage.FileJunitTestResultStorage;
import io.jenkins.plugins.junit.storage.JunitTestResultStorage;
import hudson.tasks.test.PipelineTestDetails;
import hudson.util.DescribableList;
import hudson.util.FormValidation;
Expand Down Expand Up @@ -220,16 +221,16 @@ public static TestResultAction parseAndAttach(@Nonnull JUnitTask task, PipelineT
public static TestResultSummary parseAndSummarize(@Nonnull JUnitTask task, PipelineTestDetails pipelineTestDetails,
Run<?, ?> build, FilePath workspace, Launcher launcher, TaskListener listener)
throws InterruptedException, IOException {
TestResultStorage storage = TestResultStorage.find();
if (storage == null) {
JunitTestResultStorage storage = JunitTestResultStorage.find();
if (storage instanceof FileJunitTestResultStorage) {
listener.getLogger().println(Messages.JUnitResultArchiver_Recording());
} // else let storage decide what to print

String testResults = build.getEnvironment(listener).expand(task.getTestResults());

TestResult result;
TestResultSummary summary;
if (storage == null) {
if (storage instanceof FileJunitTestResultStorage) {
result = parse(task, pipelineTestDetails, testResults, build, workspace, launcher, listener);
summary = null; // see below
} else {
Expand All @@ -246,13 +247,13 @@ public static TestResultSummary parseAndSummarize(@Nonnull JUnitTask task, Pipel
action = new TestResultAction(build, result, listener);
} else {
appending = true;
if (storage == null) {
if (storage instanceof FileJunitTestResultStorage) {
result.freeze(action);
action.mergeResult(result, listener);
}
}
if (summary == null) {
assert storage == null;
assert storage instanceof FileJunitTestResultStorage;
// Cannot do this above since the result has not yet been frozen.
summary = new TestResultSummary(result);
}
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/hudson/tasks/junit/PackageResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@
package hudson.tasks.junit;

import hudson.model.Run;
import hudson.tasks.junit.storage.TestResultImpl;
import hudson.tasks.junit.storage.TestResultStorage;
import io.jenkins.plugins.junit.storage.FileJunitTestResultStorage;
import io.jenkins.plugins.junit.storage.TestResultImpl;
import io.jenkins.plugins.junit.storage.JunitTestResultStorage;
import hudson.tasks.test.MetaTabulatedResult;
import hudson.tasks.test.TestResult;
import org.kohsuke.stapler.Stapler;
Expand Down Expand Up @@ -147,9 +148,9 @@ public int getSkipCount() {

@Override
public Object getDynamic(String name, StaplerRequest req, StaplerResponse rsp) {
TestResultStorage storage = TestResultStorage.find();
JunitTestResultStorage storage = JunitTestResultStorage.find();
ClassResult result;
if (storage != null) {
if (!(storage instanceof FileJunitTestResultStorage)) {
Run<?, ?> run = Stapler.getCurrentRequest().findAncestorObject(Run.class);
TestResultImpl pluggableStorage = storage.load(run.getParent().getFullName(), run.getNumber());
result = pluggableStorage.getClassResult(name);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/hudson/tasks/junit/TestResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import hudson.AbortException;
import hudson.Util;
import hudson.model.Run;
import hudson.tasks.junit.storage.TestResultImpl;
import io.jenkins.plugins.junit.storage.TestResultImpl;
import hudson.tasks.test.AbstractTestResultAction;
import hudson.tasks.test.PipelineTestDetails;
import hudson.tasks.test.PipelineBlockWithTests;
Expand Down
25 changes: 13 additions & 12 deletions src/main/java/hudson/tasks/junit/TestResultAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
import hudson.model.Job;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.tasks.junit.storage.TestResultStorage;
import io.jenkins.plugins.junit.storage.FileJunitTestResultStorage;
import io.jenkins.plugins.junit.storage.JunitTestResultStorage;
import hudson.tasks.test.AbstractTestResultAction;
import hudson.tasks.test.TestObject;
import hudson.tasks.test.TestResultProjectAction;
Expand Down Expand Up @@ -66,7 +67,7 @@
public class TestResultAction extends AbstractTestResultAction<TestResultAction> implements StaplerProxy, SimpleBuildStep.LastBuildAction {
private transient WeakReference<TestResult> result;

/** null only if there is a {@link TestResultStorage} */
/** null only if there is a {@link JunitTestResultStorage} */
private @Nullable Integer failCount;
private @Nullable Integer skipCount;
// Hudson < 1.25 didn't set these fields, so use Integer
Expand All @@ -85,7 +86,7 @@ public TestResultAction(AbstractBuild owner, TestResult result, BuildListener li
*/
public TestResultAction(Run owner, TestResult result, TaskListener listener) {
super(owner);
if (TestResultStorage.find() == null) {
if (JunitTestResultStorage.find() instanceof FileJunitTestResultStorage) {
setResult(result, listener);
}
}
Expand All @@ -110,7 +111,7 @@ public TestResultAction(TestResult result, BuildListener listener) {
* @since 1.2-beta-1
*/
public synchronized void setResult(TestResult result, TaskListener listener) {
assert TestResultStorage.find() == null;
assert JunitTestResultStorage.find() instanceof FileJunitTestResultStorage;
result.freeze(this);

totalCount = result.getTotalCount();
Expand Down Expand Up @@ -140,8 +141,8 @@ private XmlFile getDataFile() {

@Override
public synchronized TestResult getResult() {
TestResultStorage storage = TestResultStorage.find();
if (storage != null) {
JunitTestResultStorage storage = JunitTestResultStorage.find();
if (!(storage instanceof FileJunitTestResultStorage)) {
return new TestResult(storage.load(run.getParent().getFullName(), run.getNumber()));
}
TestResult r;
Expand All @@ -166,8 +167,8 @@ public synchronized TestResult getResult() {

@Override
public synchronized int getFailCount() {
TestResultStorage storage = TestResultStorage.find();
if (storage != null) {
JunitTestResultStorage storage = JunitTestResultStorage.find();
if (!(storage instanceof FileJunitTestResultStorage)) {
return new TestResult(storage.load(run.getParent().getFullName(), run.getNumber())).getFailCount();
}
if(totalCount==null)
Expand All @@ -177,8 +178,8 @@ public synchronized int getFailCount() {

@Override
public synchronized int getSkipCount() {
TestResultStorage storage = TestResultStorage.find();
if (storage != null) {
JunitTestResultStorage storage = JunitTestResultStorage.find();
if (!(storage instanceof FileJunitTestResultStorage)) {
return new TestResult(storage.load(run.getParent().getFullName(), run.getNumber())).getSkipCount();
}
if(totalCount==null)
Expand All @@ -188,8 +189,8 @@ public synchronized int getSkipCount() {

@Override
public synchronized int getTotalCount() {
TestResultStorage storage = TestResultStorage.find();
if (storage != null) {
JunitTestResultStorage storage = JunitTestResultStorage.find();
if (!(storage instanceof FileJunitTestResultStorage)) {
return new TestResult(storage.load(run.getParent().getFullName(), run.getNumber())).getTotalCount();
}
if(totalCount==null)
Expand Down
28 changes: 0 additions & 28 deletions src/main/java/hudson/tasks/junit/storage/package-info.java

This file was deleted.

10 changes: 5 additions & 5 deletions src/main/java/hudson/tasks/test/TestResultProjectAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@
import hudson.model.Job;
import hudson.model.Run;
import hudson.tasks.junit.JUnitResultArchiver;
import hudson.tasks.junit.storage.TestResultImpl;
import hudson.tasks.junit.storage.TestResultStorage;
import io.jenkins.plugins.junit.storage.FileJunitTestResultStorage;
import io.jenkins.plugins.junit.storage.TestResultImpl;
import io.jenkins.plugins.junit.storage.JunitTestResultStorage;
import io.jenkins.plugins.echarts.AsyncTrendChart;
import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

Expand Down Expand Up @@ -113,8 +113,8 @@ public AbstractTestResultAction getLastTestResultAction() {
protected LinesChartModel createChartModel() {
Run<?, ?> lastCompletedBuild = job.getLastCompletedBuild();

TestResultStorage storage = TestResultStorage.find();
if (storage != null) {
JunitTestResultStorage storage = JunitTestResultStorage.find();
if (!(storage instanceof FileJunitTestResultStorage)) {
TestResultImpl pluggableStorage = storage.load(lastCompletedBuild.getParent().getFullName(), lastCompletedBuild.getNumber());
return new TestResultTrendChart().create(pluggableStorage.getTrendTestResultSummary());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.jenkins.plugins.junit.storage;

import hudson.Extension;
import hudson.model.Run;
import java.io.IOException;
import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.Beta;
import org.kohsuke.stapler.DataBoundConstructor;

@Extension
@Restricted(Beta.class)
public class FileJunitTestResultStorage extends JunitTestResultStorage {

@DataBoundConstructor
public FileJunitTestResultStorage() {
}

@Override
public RemotePublisher createRemotePublisher(Run<?, ?> build) throws IOException {
return null;
}

@Override
public TestResultImpl load(String job, int build) {
return null;
}

@Extension
@Symbol("file")
public static class DescriptorImpl extends JunitTestResultStorageDescriptor {

@Override
public String getDisplayName() {
return Messages.FileJunitTestResultStorage_displayName();
}

}
}
Loading

0 comments on commit 415e114

Please sign in to comment.