Skip to content

Commit

Permalink
[JENKINS-43507] Refactoring MockSCM to traits
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenc committed May 4, 2017
1 parent 37da6da commit a3485be
Show file tree
Hide file tree
Showing 11 changed files with 526 additions and 163 deletions.
28 changes: 28 additions & 0 deletions src/test/java/jenkins/scm/impl/mock/MockSCMBuilder.java
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,28 @@
package jenkins.scm.impl.mock;

import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import jenkins.scm.api.SCMBuilder;
import jenkins.scm.api.SCMHead;
import jenkins.scm.api.SCMRevision;

public class MockSCMBuilder extends SCMBuilder<MockSCMBuilder,MockSCM> {

private final MockSCMSource source;

public MockSCMBuilder(@NonNull MockSCMSource source, @NonNull SCMHead head,
@CheckForNull SCMRevision revision) {
super(MockSCM.class, head, revision);
this.source = source;
}

@Override
public MockSCM build() {
SCMRevision revision = getRevision();
return new MockSCM(source, getHead(),
revision instanceof MockSCMRevision || revision instanceof MockChangeRequestSCMRevision
? revision
: null);
}

}
49 changes: 49 additions & 0 deletions src/test/java/jenkins/scm/impl/mock/MockSCMDiscoverBranches.java
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,49 @@
package jenkins.scm.impl.mock;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.scm.SCMDescriptor;
import jenkins.scm.api.SCMHeadCategory;
import jenkins.scm.api.trait.SCMSourceRequest;
import jenkins.scm.api.trait.SCMSourceRequestBuilder;
import jenkins.scm.api.trait.SCMSourceTrait;
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
import org.kohsuke.stapler.DataBoundConstructor;

public class MockSCMDiscoverBranches extends SCMSourceTrait {

@DataBoundConstructor
public MockSCMDiscoverBranches() {
}

@Override
protected <B extends SCMSourceRequestBuilder<B, R>, R extends SCMSourceRequest> void decorateRequest(B builder) {
if (builder instanceof MockSCMSourceRequestBuilder) {
((MockSCMSourceRequestBuilder) builder).withBranches(true);
}
}

@Override
public boolean isCategoryEnabled(@NonNull SCMHeadCategory category) {
return category.isUncategorized();
}

@Extension
public static final class DescriptorImpl extends SCMSourceTraitDescriptor {

@Override
public String getDisplayName() {
return "";
}

@Override
public boolean isApplicableTo(Class<? extends SCMSourceRequestBuilder> requestBuilderClass) {
return MockSCMSourceRequestBuilder.class.isAssignableFrom(requestBuilderClass);
}

@Override
public boolean isApplicableTo(SCMDescriptor<?> scm) {
return scm instanceof MockSCM.DescriptorImpl;
}
}
}
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,90 @@
package jenkins.scm.impl.mock;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.scm.SCMDescriptor;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Set;
import jenkins.scm.api.SCMHeadCategory;
import jenkins.scm.api.mixin.ChangeRequestCheckoutStrategy;
import jenkins.scm.api.trait.SCMSourceRequest;
import jenkins.scm.api.trait.SCMSourceRequestBuilder;
import jenkins.scm.api.trait.SCMSourceTrait;
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
import jenkins.scm.impl.ChangeRequestSCMHeadCategory;
import org.codehaus.plexus.util.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;

public class MockSCMDiscoverChangeRequests extends SCMSourceTrait {

private final Set<ChangeRequestCheckoutStrategy> strategies;

public MockSCMDiscoverChangeRequests(Collection<ChangeRequestCheckoutStrategy> strategies) {
this.strategies =
strategies.isEmpty() ? EnumSet.of(ChangeRequestCheckoutStrategy.HEAD) : EnumSet.copyOf(strategies);
}

public MockSCMDiscoverChangeRequests(ChangeRequestCheckoutStrategy... strategies) {
this(Arrays.asList(strategies));
}

@DataBoundConstructor
public MockSCMDiscoverChangeRequests(String strategiesStr) {
this(fromString(strategiesStr));
}

private static Set<ChangeRequestCheckoutStrategy> fromString(String strategiesStr) {
Set<ChangeRequestCheckoutStrategy> strategies = EnumSet.noneOf(ChangeRequestCheckoutStrategy.class);
for (String s : StringUtils.split(strategiesStr, ", ")) {
try {
strategies.add(ChangeRequestCheckoutStrategy.valueOf(s.trim()));
} catch (IllegalArgumentException e) {
// ignore
}
}
return strategies;
}

public String getStrategiesStr() {
StringBuilder r = new StringBuilder();
for (ChangeRequestCheckoutStrategy s : strategies) {
r.append(s.name()).append(", ");
}
return r.toString();
}


@Override
protected <B extends SCMSourceRequestBuilder<B, R>, R extends SCMSourceRequest> void decorateRequest(B builder) {
if (builder instanceof MockSCMSourceRequestBuilder) {
((MockSCMSourceRequestBuilder) builder).withChangeRequests(true);
((MockSCMSourceRequestBuilder) builder).withCheckoutStrategies(strategies);
}
}

@Override
public boolean isCategoryEnabled(@NonNull SCMHeadCategory category) {
return category instanceof ChangeRequestSCMHeadCategory;
}

@Extension
public static final class DescriptorImpl extends SCMSourceTraitDescriptor {

@Override
public String getDisplayName() {
return "";
}

@Override
public boolean isApplicableTo(Class<? extends SCMSourceRequestBuilder> requestBuilderClass) {
return MockSCMSourceRequestBuilder.class.isAssignableFrom(requestBuilderClass);
}

@Override
public boolean isApplicableTo(SCMDescriptor<?> scm) {
return scm instanceof MockSCM.DescriptorImpl;
}
}
}
50 changes: 50 additions & 0 deletions src/test/java/jenkins/scm/impl/mock/MockSCMDiscoverTags.java
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,50 @@
package jenkins.scm.impl.mock;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.scm.SCMDescriptor;
import jenkins.scm.api.SCMHeadCategory;
import jenkins.scm.api.trait.SCMSourceRequest;
import jenkins.scm.api.trait.SCMSourceRequestBuilder;
import jenkins.scm.api.trait.SCMSourceTrait;
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
import jenkins.scm.impl.TagSCMHeadCategory;
import org.kohsuke.stapler.DataBoundConstructor;

public class MockSCMDiscoverTags extends SCMSourceTrait {

@DataBoundConstructor
public MockSCMDiscoverTags() {
}

@Override
protected <B extends SCMSourceRequestBuilder<B, R>, R extends SCMSourceRequest> void decorateRequest(B builder) {
if (builder instanceof MockSCMSourceRequestBuilder) {
((MockSCMSourceRequestBuilder) builder).withTags(true);
}
}

@Override
public boolean isCategoryEnabled(@NonNull SCMHeadCategory category) {
return category instanceof TagSCMHeadCategory;
}

@Extension
public static final class DescriptorImpl extends SCMSourceTraitDescriptor {

@Override
public String getDisplayName() {
return "";
}

@Override
public boolean isApplicableTo(Class<? extends SCMSourceRequestBuilder> requestBuilderClass) {
return MockSCMSourceRequestBuilder.class.isAssignableFrom(requestBuilderClass);
}

@Override
public boolean isApplicableTo(SCMDescriptor<?> scm) {
return scm instanceof MockSCM.DescriptorImpl;
}
}
}
73 changes: 47 additions & 26 deletions src/test/java/jenkins/scm/impl/mock/MockSCMNavigator.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -28,47 +28,53 @@
import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension; import hudson.Extension;
import hudson.ExtensionList;
import hudson.model.Action; import hudson.model.Action;
import hudson.model.Descriptor;
import hudson.model.TaskListener; import hudson.model.TaskListener;
import hudson.util.ListBoxModel; import hudson.util.ListBoxModel;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import jenkins.scm.api.SCMHead; import jenkins.model.Jenkins;
import jenkins.scm.api.SCMNavigator; import jenkins.scm.api.SCMNavigator;
import jenkins.scm.api.SCMNavigatorDescriptor; import jenkins.scm.api.SCMNavigatorDescriptor;
import jenkins.scm.api.SCMNavigatorEvent; import jenkins.scm.api.SCMNavigatorEvent;
import jenkins.scm.api.SCMNavigatorOwner; import jenkins.scm.api.SCMNavigatorOwner;
import jenkins.scm.api.SCMSourceObserver; import jenkins.scm.api.SCMSourceObserver;
import jenkins.scm.api.metadata.ObjectMetadataAction; import jenkins.scm.api.metadata.ObjectMetadataAction;
import jenkins.scm.api.trait.SCMSourceTrait;
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;


public class MockSCMNavigator extends SCMNavigator { public class MockSCMNavigator extends SCMNavigator {


private final String controllerId; private final String controllerId;
private final boolean includeBranches; private final List<SCMSourceTrait> traits;
private final boolean includeTags;
private final boolean includeChangeRequests;
private transient MockSCMController controller; private transient MockSCMController controller;


@DataBoundConstructor @DataBoundConstructor
public MockSCMNavigator(String controllerId, boolean includeBranches, boolean includeTags, public MockSCMNavigator(String controllerId, List<SCMSourceTrait> traits) {
boolean includeChangeRequests) {
this.controllerId = controllerId; this.controllerId = controllerId;
this.includeBranches = includeBranches; this.traits = new ArrayList<SCMSourceTrait>(traits);
this.includeTags = includeTags;
this.includeChangeRequests = includeChangeRequests;
} }


public MockSCMNavigator(MockSCMController controller, boolean includeBranches, boolean includeTags, public MockSCMNavigator(String controllerId, SCMSourceTrait... traits) {
boolean includeChangeRequests) { this(controllerId, Arrays.asList(traits));
}

public MockSCMNavigator(MockSCMController controller, List<SCMSourceTrait> traits) {
this.controllerId = controller.getId(); this.controllerId = controller.getId();
this.controller = controller; this.controller = controller;
this.includeBranches = includeBranches; this.traits = new ArrayList<SCMSourceTrait>(traits);
this.includeTags = includeTags; }
this.includeChangeRequests = includeChangeRequests;
public MockSCMNavigator(MockSCMController controller, SCMSourceTrait... traits) {
this(controller, Arrays.asList(traits));
} }


public String getControllerId() { public String getControllerId() {
Expand All @@ -82,16 +88,8 @@ private MockSCMController controller() {
return controller; return controller;
} }


public boolean isIncludeBranches() { public List<SCMSourceTrait> getTraits() {
return includeBranches; return Collections.unmodifiableList(traits);
}

public boolean isIncludeTags() {
return includeTags;
}

public boolean isIncludeChangeRequests() {
return includeChangeRequests;
} }


@Override @Override
Expand All @@ -115,8 +113,7 @@ public void visitSources(@NonNull SCMSourceObserver observer) throws IOException
controller().applyLatency(); controller().applyLatency();
controller().checkFaults(name, null, null, false); controller().checkFaults(name, null, null, false);
SCMSourceObserver.ProjectObserver po = observer.observe(name); SCMSourceObserver.ProjectObserver po = observer.observe(name);
po.addSource(new MockSCMSource(getId() + "::" + name, po.addSource(new MockSCMSource(getId() + "::" + name, controller, name, traits));
controller, name, includeBranches, includeTags, includeChangeRequests));
po.complete(); po.complete();
} }
} }
Expand Down Expand Up @@ -165,5 +162,29 @@ public ListBoxModel doFillControllerIdItems() {
} }
return result; return result;
} }

public List<SCMSourceTraitDescriptor> getTraitDescriptors() {
MockSCM.DescriptorImpl scmDescriptor =
ExtensionList.lookup(Descriptor.class).get(MockSCM.DescriptorImpl.class);
List<SCMSourceTraitDescriptor> result = new ArrayList<SCMSourceTraitDescriptor>();
for (Descriptor<SCMSourceTrait> d : Jenkins.getActiveInstance().getDescriptorList(SCMSourceTrait.class)) {
if (d instanceof SCMSourceTraitDescriptor) {
SCMSourceTraitDescriptor descriptor = (SCMSourceTraitDescriptor) d;
if (!descriptor.isApplicableTo(
scmDescriptor)) {
continue;
}
if (!descriptor.isApplicableTo(MockSCMSourceRequestBuilder.class)) {
continue;
}
result.add(descriptor);
}
}
return result;
}

public List<SCMSourceTrait> getDefaultTraits() {
return Collections.<SCMSourceTrait>singletonList(new MockSCMDiscoverBranches());
}
} }
} }
Loading

0 comments on commit a3485be

Please sign in to comment.