diff --git a/pom.xml b/pom.xml index 70bf42c..0a2c776 100644 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,12 @@ test + + org.jenkins-ci.plugins + ant + test + + diff --git a/src/test/java/org/jenkinsci/plugins/pluginusage/PluginUsageViewApiTest.java b/src/test/java/org/jenkinsci/plugins/pluginusage/PluginUsageViewApiTest.java index 1cbf0c3..ec192e7 100644 --- a/src/test/java/org/jenkinsci/plugins/pluginusage/PluginUsageViewApiTest.java +++ b/src/test/java/org/jenkinsci/plugins/pluginusage/PluginUsageViewApiTest.java @@ -9,14 +9,18 @@ import org.jenkinsci.plugins.pluginusage.api.Project; import org.junit.Rule; import org.junit.Test; +import org.junit.jupiter.api.Assertions; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.recipes.LocalData; -import org.jvnet.hudson.test.recipes.WithPlugin; import java.io.File; import java.io.FileInputStream; import java.net.URL; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; @@ -26,9 +30,22 @@ public class PluginUsageViewApiTest { @Rule public JenkinsRule j = new JenkinsRule(); + Function> otherPluginsPluginNamesExtractor = p -> p.getOtherPlugins() + .stream() + .map(Plugin::getShortName) + .collect(Collectors.toSet()); + Function> jobsPerPluginPluginNamesExtractor = p -> p.getJobsPerPlugin() + .stream() + .map(PluginProjects::getPlugin) + .map(Plugin::getShortName) + .collect(Collectors.toSet()); + + Function>> projectsExtractor = p -> p.getJobsPerPlugin() + .stream() + .collect(Collectors.toMap(x -> x.getPlugin().getShortName(), PluginProjects::getProjects)); + @Test @LocalData("plugin-usage.xml") - @WithPlugin({"structs-1.17.hpi", "ant-1.9.hpi"}) public void shouldRenderJson() throws Exception { // given two jobs are using the ant builder URL configUsingAnt = Resources.getResource("with-ant.xml"); @@ -42,52 +59,84 @@ public void shouldRenderJson() throws Exception { // and one job is not j.createFreeStyleProject("c"); PluginUsage expected = new PluginUsage(Lists.newArrayList( - new PluginProjects(new Plugin("ant", "1.9"), Lists.newArrayList( + new PluginProjects(new Plugin("ant", "511.v0a_a_1a_334f41b_"), Lists.newArrayList( new Project("a"), new Project("b") )), - new PluginProjects(new Plugin("junit", "1265.v65b_14fa_f12f0"), Lists.newArrayList()), + new PluginProjects(new Plugin("junit", "1296.vb_f538b_c88630"), Lists.newArrayList()), new PluginProjects(new Plugin("mailer", "472.vf7c289a_4b_420"), Lists.newArrayList()) ), Lists.newArrayList( - new Plugin("asm-api", "9.6-3.v2e1fa_b_338cd7"), + new Plugin("asm-api", "9.7-33.v4d23ef79fcc8"), new Plugin("apache-httpcomponents-client-4-api", "4.5.14-208.v438351942757"), new Plugin("bootstrap5-api", "5.3.3-1"), + new Plugin("branch-api", "2.1178.v969d9eb_c728e"), new Plugin("caffeine-api", "3.1.8-133.v17b_1ff2e0599"), - new Plugin("checks-api", "2.0.2"), + new Plugin("checks-api", "2.2.1"), new Plugin("command-launcher", "107.v773860566e2e"), - new Plugin("display-url-api", "2.200.vb_9327d658781"), - new Plugin("echarts-api", "5.5.0-1"), - new Plugin("font-awesome-api", "6.5.1-3"), - new Plugin("gson-api", "2.10.1-15.v0d99f670e0a_7"), + new Plugin("credentials-binding", "681.vf91669a_32e45"), + new Plugin("credentials", "1371.vfee6b_095f0a_3"), + new Plugin("display-url-api", "2.204.vf6fddd8a_8b_e9"), + new Plugin("durable-task", "568.v8fb_5c57e8417"), + new Plugin("echarts-api", "5.5.1-1"), + new Plugin("eddsa-api", "0.3.0-4.v84c6f0f4969e"), + new Plugin("cloudbees-folder", "6.901.vb_4c7a_da_75da_3"), + new Plugin("font-awesome-api", "6.6.0-1"), + new Plugin("gson-api", "2.11.0-41.v019fcf6125dc"), new Plugin("instance-identity", "185.v303dc7c645f9"), - new Plugin("ionicons-api", "70.v2959a_b_74e3cf"), + new Plugin("ionicons-api", "74.v93d5eb_813d5f"), new Plugin("jaxb", "2.3.9-1"), new Plugin("jquery3-api", "3.7.1-2"), new Plugin("json-api", "20240303-41.v94e11e6de726"), + new Plugin("json-path-api", "2.9.0-58.v62e3e85b_a_655"), + new Plugin("jsch", "0.2.16-86.v42e010d9484b_"), new Plugin("jackson2-api", "2.17.0-379.v02de8ec9f64c"), new Plugin("jakarta-activation-api", "2.1.3-1"), new Plugin("jakarta-mail-api", "2.1.3-1"), - new Plugin("javax-activation-api", "1.2.0-6"), + new Plugin("javax-activation-api", "1.2.0-7"), new Plugin("javax-mail-api", "1.6.2-9"), + new Plugin("javadoc", "280.v050b_5c849f69"), + new Plugin("joda-time-api", "2.12.7-29.v5a_b_e3a_82269a_"), new Plugin("matrix-auth", "3.2.2"), + new Plugin("matrix-project", "832.va_66e270d2946"), + new Plugin("maven-plugin", "3.23"), new Plugin("mina-sshd-api-common", "2.12.1-101.v85b_e08b_780dd"), new Plugin("mina-sshd-api-core", "2.12.1-101.v85b_e08b_780dd"), new Plugin("antisamy-markup-formatter", "162.v0e6ec0fcfcf6"), new Plugin("jdk-tool", "73.vddf737284550"), - new Plugin("workflow-api", "1291.v51fd2a_625da_7"), - new Plugin("workflow-step-api", "657.v03b_e8115821b_"), - new Plugin("workflow-support", "896.v175a_a_9c5b_78f"), + new Plugin("workflow-api", "1336.vee415d95c521"), + new Plugin("workflow-basic-steps", "1058.vcb_fc1e3a_21a_9"), + new Plugin("pipeline-model-definition", "2.2214.vb_b_34b_2ea_9b_83"), + new Plugin("pipeline-model-extensions", "2.2214.vb_b_34b_2ea_9b_83"), + new Plugin("workflow-cps", "3953.v19f11da_8d2fa_"), + new Plugin("pipeline-groovy-lib", "730.ve57b_34648c63"), + new Plugin("pipeline-input-step", "495.ve9c153f6067b_"), + new Plugin("workflow-job", "1400.v7fd111b_ec82f"), + new Plugin("pipeline-model-api", "2.2214.vb_b_34b_2ea_9b_83"), + new Plugin("workflow-multibranch", "773.vc4fe1378f1d5"), + new Plugin("workflow-durable-task-step", "1371.vb_7cec8f3b_95e"), + new Plugin("workflow-scm-step", "427.v4ca_6512e7df1"), + new Plugin("pipeline-stage-step", "312.v8cd10304c27a_"), + new Plugin("pipeline-stage-tags-metadata", "2.2214.vb_b_34b_2ea_9b_83"), + new Plugin("workflow-step-api", "678.v3ee58b_469476"), + new Plugin("workflow-support", "920.v59f71ce16f04"), + new Plugin("plain-credentials", "183.va_de8f1dd5a_2b_"), + new Plugin("plugin-usage-plugin", "4.7-SNAPSHOT"), new Plugin("plugin-util-api", "4.1.0"), - new Plugin("scm-api", "689.v237b_6d3a_ef7f"), + new Plugin("run-condition", "1.7"), + new Plugin("scm-api", "696.v778d637b_a_762"), + new Plugin("ssh-credentials", "343.v884f71d78167"), new Plugin("sshd", "3.322.v159e91f6a_550"), - new Plugin("script-security", "1326.vdb_c154de8669"), - new Plugin("snakeyaml-api", "2.2-111.vc6598e30cc65"), - new Plugin("structs", "337.v1b_04ea_4df7c8"), - new Plugin("structs", "1.17"), - new Plugin("trilead-api", "2.142.v748523a_76693"), - new Plugin("bouncycastle-api", "2.30.1.77-225.v26ea_c9455fd9"), - new Plugin("commons-lang3-api", "3.13.0-62.v7d18e55f51e2"), - new Plugin("commons-text-api", "1.11.0-95.v22a_d30ee5d36") + new Plugin("script-security", "1358.vb_26663c13537"), + new Plugin("snakeyaml-api", "2.3-123.v13484c65210a_"), + new Plugin("structs", "338.v848422169819"), + new Plugin("token-macro", "400.v35420b_922dcb_"), + new Plugin("trilead-api", "2.147.vb_73cc728a_32e"), + new Plugin("variant", "60.v7290fc0eb_b_cd"), + new Plugin("bouncycastle-api", "2.30.1.78.1-248.ve27176eb_46cb_"), + new Plugin("commons-lang3-api", "3.17.0-84.vb_b_938040b_078"), + new Plugin("commons-text-api", "1.12.0-129.v99a_50df237f7"), + new Plugin("conditional-buildstep", "1.2"), + new Plugin("promoted-builds", "965.vcda_c6a_e0998f") ) ); @@ -96,6 +145,10 @@ public void shouldRenderJson() throws Exception { PluginUsage actual = gson.fromJson(body, PluginUsage.class); // then - assertEquals(expected, actual); + Assertions.assertAll( + () -> assertEquals(otherPluginsPluginNamesExtractor.apply(expected), otherPluginsPluginNamesExtractor.apply(actual)), + () -> assertEquals(jobsPerPluginPluginNamesExtractor.apply(expected), jobsPerPluginPluginNamesExtractor.apply(actual)), + () -> assertEquals(projectsExtractor.apply(expected), projectsExtractor.apply(actual)) + ); } } diff --git a/src/test/resources/plugins/ant-1.9.hpi b/src/test/resources/plugins/ant-1.9.hpi deleted file mode 100644 index a59abfd..0000000 Binary files a/src/test/resources/plugins/ant-1.9.hpi and /dev/null differ diff --git a/src/test/resources/plugins/structs-1.17.hpi b/src/test/resources/plugins/structs-1.17.hpi deleted file mode 100644 index 981c180..0000000 Binary files a/src/test/resources/plugins/structs-1.17.hpi and /dev/null differ