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()); + } + + } + +}