diff --git a/pom.xml b/pom.xml
index 84a24f433..07629e08a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
com.coravy.hudson.plugins.github
github
- 1.29.5-SNAPSHOT
+ 1.30.0-SNAPSHOT
hpi
GitHub plugin
@@ -47,10 +47,10 @@
- 2.60.3
+ 2.107.3
false
true
- 3.0.2
+ 3.0.5
1
8
1.14.2
@@ -62,7 +62,7 @@
https://repo.jenkins-ci.org/public/
-
+
repo.jenkins-ci.org
@@ -99,13 +99,7 @@
org.jenkins-ci.plugins
git
- 3.4.0
-
-
-
- org.jenkins-ci.plugins
- scm-api
- 2.2.0
+ 4.0.0-rc
@@ -129,7 +123,7 @@
org.jenkins-ci.plugins
token-macro
- 1.12.1
+ 2.1
@@ -157,7 +151,7 @@
org.jenkins-ci.plugins
apache-httpcomponents-client-4-api
- 4.5.3-2.1
+ 4.5.5-3.0
test
diff --git a/src/main/java/org/jenkinsci/plugins/github/status/sources/BuildDataRevisionShaSource.java b/src/main/java/org/jenkinsci/plugins/github/status/sources/BuildDataRevisionShaSource.java
index 126122b67..f44c7ec8e 100644
--- a/src/main/java/org/jenkinsci/plugins/github/status/sources/BuildDataRevisionShaSource.java
+++ b/src/main/java/org/jenkinsci/plugins/github/status/sources/BuildDataRevisionShaSource.java
@@ -6,7 +6,7 @@
import hudson.model.TaskListener;
import org.eclipse.jgit.lib.ObjectId;
import org.jenkinsci.plugins.github.extension.status.GitHubCommitShaSource;
-import org.jenkinsci.plugins.github.util.BuildDataHelper;
+import org.jenkinsci.plugins.github.util.BuildDetailsHelper;
import org.kohsuke.stapler.DataBoundConstructor;
import javax.annotation.Nonnull;
@@ -29,7 +29,7 @@ public BuildDataRevisionShaSource() {
*/
@Override
public String get(@Nonnull Run, ?> run, @Nonnull TaskListener listener) throws IOException {
- return ObjectId.toString(BuildDataHelper.getCommitSHA1(run));
+ return ObjectId.toString(BuildDetailsHelper.getCommitSHA1(run));
}
@Extension
diff --git a/src/main/java/org/jenkinsci/plugins/github/util/BuildDataHelper.java b/src/main/java/org/jenkinsci/plugins/github/util/BuildDataHelper.java
deleted file mode 100644
index 118437ec8..000000000
--- a/src/main/java/org/jenkinsci/plugins/github/util/BuildDataHelper.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.jenkinsci.plugins.github.util;
-
-import hudson.model.Job;
-import hudson.model.Run;
-import hudson.plugins.git.Revision;
-import hudson.plugins.git.util.Build;
-import hudson.plugins.git.util.BuildData;
-import org.eclipse.jgit.lib.ObjectId;
-
-import javax.annotation.Nonnull;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Stores common methods for {@link BuildData} handling.
- *
- * @author Oleg Nenashev
- * @since 1.10
- */
-public final class BuildDataHelper {
- private BuildDataHelper() {
- }
-
- /**
- * Calculate build data from downstream builds, that could be a shared library
- * which is loaded first in a pipeline. For that reason, this method compares
- * all remote URLs for each build data, with the real project name, to determine
- * the proper build data. This way, the SHA returned in the build data will
- * relate to the project
- *
- * @param parentName name of the parent build
- * @param parentFullName full name of the parent build
- * @param buildDataList the list of build datas from a build run
- * @return the build data related to the project, null if not found
- */
- public static BuildData calculateBuildData(
- String parentName, String parentFullName, List buildDataList
- ) {
-
- if (buildDataList == null) {
- return null;
- }
-
- if (buildDataList.size() == 1) {
- return buildDataList.get(0);
- }
-
- String projectName = parentFullName.replace(parentName, "");
-
- if (projectName.endsWith("/")) {
- projectName = projectName.substring(0, projectName.lastIndexOf('/'));
- }
-
- for (BuildData buildData : buildDataList) {
- Set remoteUrls = buildData.getRemoteUrls();
-
- for (String remoteUrl : remoteUrls) {
- if (remoteUrl.contains(projectName)) {
- return buildData;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Gets SHA1 from the build.
- *
- * @param build
- *
- * @return SHA1 of the las
- * @throws IOException Cannot get the info about commit ID
- */
- @Nonnull
- public static ObjectId getCommitSHA1(@Nonnull Run, ?> build) throws IOException {
- List buildDataList = build.getActions(BuildData.class);
-
- Job, ?> parent = build.getParent();
-
- BuildData buildData = calculateBuildData(
- parent.getName(), parent.getFullName(), buildDataList
- );
-
- if (buildData == null) {
- throw new IOException(Messages.BuildDataHelper_NoBuildDataError());
- }
-
- // buildData?.lastBuild?.marked and fall back to .revision with null check everywhere to be defensive
- Build b = buildData.lastBuild;
- if (b != null) {
- Revision r = b.marked;
- if (r == null) {
- r = b.revision;
- }
- if (r != null) {
- return r.getSha1();
- }
- }
-
- // Nowhere to report => fail the build
- throw new IOException(Messages.BuildDataHelper_NoLastRevisionError());
- }
-}
diff --git a/src/main/java/org/jenkinsci/plugins/github/util/BuildDetailsHelper.java b/src/main/java/org/jenkinsci/plugins/github/util/BuildDetailsHelper.java
new file mode 100644
index 000000000..f7766fdff
--- /dev/null
+++ b/src/main/java/org/jenkinsci/plugins/github/util/BuildDetailsHelper.java
@@ -0,0 +1,126 @@
+package org.jenkinsci.plugins.github.util;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import org.eclipse.jgit.lib.ObjectId;
+
+import hudson.model.Job;
+import hudson.model.Run;
+import hudson.plugins.git.Revision;
+import hudson.plugins.git.UserRemoteConfig;
+import hudson.plugins.git.util.Build;
+import hudson.plugins.git.util.BuildData;
+import hudson.plugins.git.util.BuildDetails;
+
+/**
+ * Stores common methods for {@link BuildDetails} handling.
+ *
+ * @author Baptiste Gaillard
+ * @since 1.30.0
+ */
+public final class BuildDetailsHelper {
+
+ private BuildDetailsHelper() {
+ }
+
+ /**
+ * Calculate build data from downstream builds, that could be a shared library which is loaded first in a pipeline.
+ * For that reason, this method compares all remote URLs for each build data, with the real project name, to
+ * determine the proper build data. This way, the SHA returned in the build data will relate to the project.
+ *
+ * @param parentName name of the parent build.
+ * @param parentFullName full name of the parent build.
+ * @param buildDetailsList the list of build details from a build run.
+ *
+ * @return the build data related to the project, null if not found.
+ */
+ public static BuildDetails calculateBuildDetails(
+ String parentName, String parentFullName, List buildDetailsList
+ ) {
+ if (buildDetailsList == null) {
+ return null;
+ }
+
+ if (buildDetailsList.size() == 1) {
+ return buildDetailsList.get(0);
+ }
+
+ String projectName = parentFullName.replace(parentName, "");
+
+ if (projectName.endsWith("/")) {
+ projectName = projectName.substring(0, projectName.lastIndexOf('/'));
+ }
+
+ for (BuildDetails buildDetails : buildDetailsList) {
+ Set remoteUrls = buildDetails.getRemoteUrls();
+
+ for (String remoteUrl : remoteUrls) {
+ if (remoteUrl.contains(projectName)) {
+ return buildDetails;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Gets SHA1 from the build.
+ *
+ * @param build
+ *
+ * @return SHA1 of the last build.
+ *
+ * @throws IOException Cannot get the info about commit ID.
+ */
+ @Nonnull
+ public static ObjectId getCommitSHA1(@Nonnull Run, ?> build) throws IOException {
+
+ Job, ?> parent = build.getParent();
+
+ List buildDetailsList = build.getActions(BuildDetails.class);
+
+ // If we cannot get build data from a 'BuildDetails' action then we try to get it from a 'BuildData' action.
+ // This should not be possible in the future as the 'BuildData' class will be deprecated.
+ if (buildDetailsList.isEmpty()) {
+ buildDetailsList = new ArrayList<>();
+
+ for (BuildData buildData : build.getActions(BuildData.class)) {
+ Collection remoteConfigs = new ArrayList<>();
+
+ for (String url : buildData.getRemoteUrls()) {
+ remoteConfigs.add(new UserRemoteConfig(url, null, null, null));
+ }
+
+ buildDetailsList.add(new BuildDetails(buildData.lastBuild, buildData.scmName, remoteConfigs));
+ }
+ }
+
+ BuildDetails buildDetails = calculateBuildDetails(parent.getName(), parent.getFullName(), buildDetailsList);
+
+ if (buildDetails == null) {
+ throw new IOException(Messages.BuildDetailsHelper_NoBuildDataError());
+ }
+
+ // buildData?.lastBuild?.marked and fall back to .revision with null check everywhere to be defensive
+ Build b = buildDetails.getBuild();
+ if (b != null) {
+ Revision r = b.marked;
+ if (r == null) {
+ r = b.revision;
+ }
+ if (r != null) {
+ return r.getSha1();
+ }
+ }
+
+ // Nowhere to report => fail the build
+ throw new IOException(Messages.BuildDetailsHelper_NoLastRevisionError());
+ }
+}
diff --git a/src/main/java/org/jenkinsci/plugins/github/util/JobInfoHelpers.java b/src/main/java/org/jenkinsci/plugins/github/util/JobInfoHelpers.java
index 7579b1cc7..bb48b910e 100644
--- a/src/main/java/org/jenkinsci/plugins/github/util/JobInfoHelpers.java
+++ b/src/main/java/org/jenkinsci/plugins/github/util/JobInfoHelpers.java
@@ -111,7 +111,7 @@ public static T triggerFrom(Item item, Class tClass) {
if (item instanceof ParameterizedJobMixIn.ParameterizedJob) {
ParameterizedJobMixIn.ParameterizedJob pJob = (ParameterizedJobMixIn.ParameterizedJob) item;
- for (Trigger candidate : pJob.getTriggers().values()) {
+ for (Object candidate : pJob.getTriggers().values()) {
if (tClass.isInstance(candidate)) {
return tClass.cast(candidate);
}
diff --git a/src/main/resources/org/jenkinsci/plugins/github/util/Messages.properties b/src/main/resources/org/jenkinsci/plugins/github/util/Messages.properties
index bc5e71650..008d76aee 100644
--- a/src/main/resources/org/jenkinsci/plugins/github/util/Messages.properties
+++ b/src/main/resources/org/jenkinsci/plugins/github/util/Messages.properties
@@ -1,2 +1,2 @@
-BuildDataHelper.NoBuildDataError=Cannot retrieve Git metadata for the build
-BuildDataHelper.NoLastRevisionError=Cannot determine sha1 of the commit. The status cannot be reported
+BuildDetailsHelper.NoBuildDataError=Cannot retrieve Git metadata for the build
+BuildDetailsHelper.NoLastRevisionError=Cannot determine sha1 of the commit. The status cannot be reported
diff --git a/src/test/java/com/cloudbees/jenkins/GitHubCommitNotifierTest.java b/src/test/java/com/cloudbees/jenkins/GitHubCommitNotifierTest.java
index 50f167f6b..0830d8bac 100644
--- a/src/test/java/com/cloudbees/jenkins/GitHubCommitNotifierTest.java
+++ b/src/test/java/com/cloudbees/jenkins/GitHubCommitNotifierTest.java
@@ -12,6 +12,7 @@
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.Revision;
import hudson.plugins.git.util.BuildData;
+import hudson.plugins.git.util.BuildDetails;
import hudson.util.VersionNumber;
import org.eclipse.jgit.lib.ObjectId;
import org.jenkinsci.plugins.github.config.GitHubPluginConfig;
@@ -36,10 +37,12 @@
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
-import static org.jenkinsci.plugins.github.util.Messages.BuildDataHelper_NoBuildDataError;
-import static org.jenkinsci.plugins.github.util.Messages.BuildDataHelper_NoLastRevisionError;
+import static org.jenkinsci.plugins.github.util.Messages.BuildDetailsHelper_NoBuildDataError;
+import static org.jenkinsci.plugins.github.util.Messages.BuildDetailsHelper_NoLastRevisionError;
import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+
/**
* Tests for {@link GitHubCommitNotifier}.
*
@@ -51,6 +54,8 @@ public class GitHubCommitNotifierTest {
@Mock
public BuildData data;
+ public BuildDetails buildDetails;
+
@Mock
public Revision rev;
@@ -79,6 +84,8 @@ protected void before() throws Throwable {
when(data.getLastBuiltRevision()).thenReturn(rev);
data.lastBuild = new hudson.plugins.git.util.Build(rev, rev, 0, Result.SUCCESS);
when(rev.getSha1()).thenReturn(ObjectId.fromString(SOME_SHA));
+
+ buildDetails = new BuildDetails(data.lastBuild, data.scmName, new ArrayList<>());
}
};
@@ -89,7 +96,7 @@ public void testNoBuildData() throws Exception {
prj.getPublishersList().add(new GitHubCommitNotifier());
Build b = prj.scheduleBuild2(0).get();
jRule.assertBuildStatus(Result.FAILURE, b);
- jRule.assertLogContains(BuildDataHelper_NoBuildDataError(), b);
+ jRule.assertLogContains(BuildDetailsHelper_NoBuildDataError(), b);
}
@Test
@@ -101,7 +108,7 @@ public void testNoBuildRevision() throws Exception {
//Git plugin 2.4.1 + does not include BuildData if checkout fails, so we add it if needed
Build b = safelyGenerateBuild(prj);
jRule.assertBuildStatus(Result.FAILURE, b);
- jRule.assertLogContains(BuildDataHelper_NoLastRevisionError(), b);
+ jRule.assertLogContains(BuildDetailsHelper_NoLastRevisionError(), b);
}
@Test
@@ -123,7 +130,7 @@ public void testMarkSuccessOnCommitNotifierFailure() throws Exception {
}
@Test
- public void shouldWriteStatusOnGH() throws Exception {
+ public void shouldWriteStatusOnGHWithBuildData() throws Exception {
config.getConfigs().add(github.serverConfig());
FreeStyleProject prj = jRule.createFreeStyleProject();
@@ -142,6 +149,27 @@ public boolean perform(AbstractBuild, ?> build, Launcher launcher, BuildListen
github.service().verify(1, postRequestedFor(urlPathMatching(".*/" + SOME_SHA)));
}
+ @Test
+ @Issue("JENKINS-54249")
+ public void shouldWriteStatusOnGHWithBuildDetails() throws Exception {
+ config.getConfigs().add(github.serverConfig());
+ FreeStyleProject prj = jRule.createFreeStyleProject();
+
+ prj.getBuildersList().add(new TestBuilder() {
+ @Override
+ public boolean perform(AbstractBuild, ?> build, Launcher launcher, BuildListener listener) {
+ build.addAction(buildDetails);
+ return true;
+ }
+ });
+
+ prj.getPublishersList().add(new GitHubCommitNotifier(Result.SUCCESS.toString()));
+
+ prj.scheduleBuild2(0).get();
+
+ github.service().verify(1, postRequestedFor(urlPathMatching(".*/" + SOME_SHA)));
+ }
+
private Build safelyGenerateBuild(FreeStyleProject prj) throws InterruptedException, java.util.concurrent.ExecutionException {
Build b;
if (jRule.getPluginManager().getPlugin("git").getVersionNumber().isNewerThan(new VersionNumber("2.4.0"))) {
diff --git a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTest.java b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTest.java
index 00a529c28..89e6da3a8 100644
--- a/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTest.java
+++ b/src/test/java/com/cloudbees/jenkins/GitHubPushTriggerTest.java
@@ -4,6 +4,7 @@
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.util.Build;
import hudson.plugins.git.util.BuildData;
+import hudson.plugins.git.util.BuildDetails;
import hudson.util.FormValidation;
import org.eclipse.jgit.lib.ObjectId;
import org.jenkinsci.plugins.github.admin.GitHubHookRegisterProblemMonitor;
@@ -65,7 +66,9 @@ public void shouldStartWorkflowByTrigger() throws Exception {
// Trigger the build once to register SCMs
WorkflowRun lastRun = jRule.assertBuildStatusSuccess(job.scheduleBuild2(0));
// Testing hack! This will make the polling believe that there was remote changes to build
- BuildData buildData = lastRun.getActions(BuildData.class).get(0);
+
+ BuildDetails buildDetails = lastRun.getActions(BuildDetails.class).get(0);
+ BuildData buildData = new BuildData(buildDetails);
buildData.buildsByBranchName = new HashMap();
buildData.getLastBuiltRevision().setSha1(ObjectId.zeroId());
diff --git a/src/test/java/org/jenkinsci/plugins/github/status/GitHubCommitStatusSetterTest.java b/src/test/java/org/jenkinsci/plugins/github/status/GitHubCommitStatusSetterTest.java
index 1b13af21a..3dc4bf80a 100644
--- a/src/test/java/org/jenkinsci/plugins/github/status/GitHubCommitStatusSetterTest.java
+++ b/src/test/java/org/jenkinsci/plugins/github/status/GitHubCommitStatusSetterTest.java
@@ -85,7 +85,6 @@ protected void before() throws Throwable {
}
};
-
@Test
public void shouldSetGHCommitStatus() throws Exception {
config.getConfigs().add(github.serverConfig());
diff --git a/src/test/java/org/jenkinsci/plugins/github/util/BuildDataHelperTest.java b/src/test/java/org/jenkinsci/plugins/github/util/BuildDataHelperTest.java
deleted file mode 100644
index 0f58cc9e0..000000000
--- a/src/test/java/org/jenkinsci/plugins/github/util/BuildDataHelperTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package org.jenkinsci.plugins.github.util;
-
-import hudson.plugins.git.util.BuildData;
-
-import org.junit.Test;
-import org.junit.experimental.runners.Enclosed;
-import org.junit.runner.RunWith;
-import org.jvnet.hudson.test.Issue;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.nullValue;
-
-/**
- * @author Manuel de la Peña
- */
-@RunWith(Enclosed.class)
-public class BuildDataHelperTest {
-
- public static class WhenBuildingRegularJobs {
-
- private static final String GITHUB_USERNAME = "user1";
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProject() throws Exception {
- BuildData projectBuildData = new BuildData();
- projectBuildData.remoteUrls = new HashSet<>();
-
- projectBuildData.addRemoteUrl(
- "https://github.com/" + GITHUB_USERNAME + "/project.git");
-
- List buildDataList = new ArrayList<>();
-
- buildDataList.add(projectBuildData);
-
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", "project/master", buildDataList);
-
- assertThat("should fetch project build data", buildData, is(projectBuildData));
- }
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProjectWithTwoBuildDatas() throws Exception {
- BuildData sharedLibBuildData = new BuildData();
- sharedLibBuildData.remoteUrls = new HashSet<>();
-
- sharedLibBuildData.addRemoteUrl(
- "https://github.com/" + GITHUB_USERNAME + "/sharedLibrary.git");
-
- BuildData realProjectBuildData = new BuildData();
- realProjectBuildData.remoteUrls = new HashSet<>();
-
- realProjectBuildData.addRemoteUrl(
- "https://github.com/" + GITHUB_USERNAME + "/project.git");
-
- List buildDataList = new ArrayList<>();
-
- Collections.addAll(buildDataList, sharedLibBuildData, realProjectBuildData);
-
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", "project/master", buildDataList);
-
- assertThat("should not fetch shared library build data", buildData, not(sharedLibBuildData));
- assertThat("should fetch project build data", buildData, is(realProjectBuildData));
- }
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProjectWithEmptyBuildDatas() throws Exception {
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", "project/master", Collections.EMPTY_LIST);
-
- assertThat("should be null", buildData, nullValue());
- }
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProjectWithNullBuildDatas() throws Exception {
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", "project/master", null);
-
- assertThat("should be null", buildData, nullValue());
- }
-
- }
-
- public static class WhenBuildingOrganizationJobs {
-
- private static final String ORGANIZATION_NAME = "Organization";
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProject() throws Exception {
- BuildData projectBuildData = new BuildData();
- projectBuildData.remoteUrls = new HashSet<>();
-
- projectBuildData.addRemoteUrl(
- "https://github.com/" + ORGANIZATION_NAME + "/project.git");
-
- List buildDataList = new ArrayList<>();
-
- buildDataList.add(projectBuildData);
-
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", ORGANIZATION_NAME + "/project/master", buildDataList);
-
- assertThat("should fetch project build data", buildData, is(projectBuildData));
- }
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProjectWithTwoBuildDatas() throws Exception {
- BuildData sharedLibBuildData = new BuildData();
- sharedLibBuildData.remoteUrls = new HashSet<>();
-
- sharedLibBuildData.addRemoteUrl(
- "https://github.com/" + ORGANIZATION_NAME + "/sharedLibrary.git");
-
- BuildData realProjectBuildData = new BuildData();
- realProjectBuildData.remoteUrls = new HashSet<>();
-
- realProjectBuildData.addRemoteUrl(
- "https://github.com/" + ORGANIZATION_NAME + "/project.git");
-
- List buildDataList = new ArrayList<>();
-
- Collections.addAll(buildDataList, sharedLibBuildData, realProjectBuildData);
-
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", ORGANIZATION_NAME + "/project/master", buildDataList);
-
- assertThat("should not fetch shared library build data", buildData, not(sharedLibBuildData));
- assertThat("should fetch project build data", buildData, is(realProjectBuildData));
- }
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProjectWithEmptyBuildDatas() throws Exception {
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", ORGANIZATION_NAME + "/project/master", Collections.EMPTY_LIST);
-
- assertThat("should be null", buildData, nullValue());
- }
-
- @Test
- @Issue("JENKINS-53149")
- public void shouldCalculateDataBuildFromProjectWithNullBuildDatas() throws Exception {
- BuildData buildData = BuildDataHelper.calculateBuildData(
- "master", ORGANIZATION_NAME + "/project/master", null);
-
- assertThat("should be null", buildData, nullValue());
- }
-
- }
-
-}
\ No newline at end of file
diff --git a/src/test/java/org/jenkinsci/plugins/github/util/BuildDetailsHelperTest.java b/src/test/java/org/jenkinsci/plugins/github/util/BuildDetailsHelperTest.java
new file mode 100644
index 000000000..52ddb7e59
--- /dev/null
+++ b/src/test/java/org/jenkinsci/plugins/github/util/BuildDetailsHelperTest.java
@@ -0,0 +1,189 @@
+package org.jenkinsci.plugins.github.util;
+
+import hudson.plugins.git.UserRemoteConfig;
+import hudson.plugins.git.util.Build;
+import hudson.plugins.git.util.BuildDetails;
+
+import org.junit.Test;
+import org.junit.experimental.runners.Enclosed;
+import org.junit.runner.RunWith;
+import org.jvnet.hudson.test.Issue;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.nullValue;
+
+import org.mockito.Mock;
+
+/**
+ * @author Baptiste Gaillard
+ */
+@RunWith(Enclosed.class)
+public class BuildDetailsHelperTest {
+
+ public static class WhenBuildingRegularJobs {
+
+ private static final String GITHUB_USERNAME = "user1";
+
+ @Mock
+ private Build build;
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProject() throws Exception {
+ BuildDetails projectBuildDetails = new BuildDetails(
+ this.build,
+ "git",
+ new ArrayList()
+ );
+
+ projectBuildDetails.addRemoteUrl(
+ "https://github.com/" + GITHUB_USERNAME + "/project.git");
+
+ List buildDetailsList = new ArrayList<>();
+ buildDetailsList.add(projectBuildDetails);
+
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", "project/master", buildDetailsList);
+
+ assertThat("should fetch project build data", buildDetails, is(projectBuildDetails));
+ }
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProjectWithTwoBuildDetails() throws Exception {
+ BuildDetails sharedLibBuildDetails = new BuildDetails(
+ this.build,
+ "git",
+ new ArrayList()
+ );
+ sharedLibBuildDetails.addRemoteUrl(
+ "https://github.com/" + GITHUB_USERNAME + "/sharedLibrary.git");
+
+ BuildDetails realProjectBuildDetails = new BuildDetails(
+ this.build,
+ "git",
+ new ArrayList()
+ );
+ realProjectBuildDetails.addRemoteUrl(
+ "https://github.com/" + GITHUB_USERNAME + "/project.git");
+
+ List buildDetailsList = new ArrayList<>();
+
+ Collections.addAll(buildDetailsList, sharedLibBuildDetails, realProjectBuildDetails);
+
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", "project/master", buildDetailsList);
+
+ assertThat("should not fetch shared library build data", buildDetails, not(sharedLibBuildDetails));
+ assertThat("should fetch project build data", buildDetails, is(realProjectBuildDetails));
+ }
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProjectWithEmptyBuildDetails() throws Exception {
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", "project/master", new ArrayList()
+ );
+
+ assertThat("should be null", buildDetails, nullValue());
+ }
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProjectWithNullBuildDetails() throws Exception {
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", "project/master", null
+ );
+
+ assertThat("should be null", buildDetails, nullValue());
+ }
+
+ }
+
+ public static class WhenBuildingOrganizationJobs {
+
+ private static final String ORGANIZATION_NAME = "Organization";
+
+ @Mock
+ private Build build;
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProject() throws Exception {
+ BuildDetails projectBuildDetails = new BuildDetails(
+ this.build,
+ "git",
+ new ArrayList()
+ );
+ projectBuildDetails.addRemoteUrl(
+ "https://github.com/" + ORGANIZATION_NAME + "/project.git");
+
+ List buildDetailsList = new ArrayList<>();
+ buildDetailsList.add(projectBuildDetails);
+
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", ORGANIZATION_NAME + "/project/master", buildDetailsList
+ );
+
+ assertThat("should fetch project build data", buildDetails, is(projectBuildDetails));
+ }
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProjectWithTwoBuildDetails() throws Exception {
+ BuildDetails sharedLibBuildDetails = new BuildDetails(
+ this.build,
+ "git",
+ new ArrayList()
+ );
+ sharedLibBuildDetails.addRemoteUrl(
+ "https://github.com/" + ORGANIZATION_NAME + "/sharedLibrary.git");
+
+ BuildDetails realProjectBuildDetails = new BuildDetails(
+ this.build,
+ "git",
+ new ArrayList()
+ );
+ realProjectBuildDetails.addRemoteUrl(
+ "https://github.com/" + ORGANIZATION_NAME + "/project.git");
+
+ List buildDetailsList = new ArrayList<>();
+
+ Collections.addAll(buildDetailsList, sharedLibBuildDetails, realProjectBuildDetails);
+
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", ORGANIZATION_NAME + "/project/master", buildDetailsList
+ );
+
+ assertThat("should not fetch shared library build data", buildDetails, not(sharedLibBuildDetails));
+ assertThat("should fetch project build data", buildDetails, is(realProjectBuildDetails));
+ }
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProjectWithEmptyBuildDetails() throws Exception {
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", ORGANIZATION_NAME + "/project/master", new ArrayList()
+ );
+
+ assertThat("should be null", buildDetails, nullValue());
+ }
+
+ @Test
+ @Issue("JENKINS-53149")
+ public void shouldCalculateDataBuildFromProjectWithNullBuildDetails() throws Exception {
+ BuildDetails buildDetails = BuildDetailsHelper.calculateBuildDetails(
+ "master", ORGANIZATION_NAME + "/project/master", null);
+
+ assertThat("should be null", buildDetails, nullValue());
+ }
+
+ }
+
+}