/*
This file is part of Delivery Pipeline Plugin.
Delivery Pipeline Plugin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Delivery Pipeline Plugin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Delivery Pipeline Plugin.
If not, see <http://www.gnu.org/licenses/>.
*/
package se.diabol.jenkins.pipeline.util;
import hudson.EnvVars;
import hudson.model.AbstractProject;
import hudson.model.FreeStyleProject;
import hudson.tasks.BuildTrigger;
import hudson.util.ListBoxModel;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.WithoutJenkins;
import se.diabol.jenkins.pipeline.test.TestUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class ProjectUtilTest {
@Rule
public JenkinsRule jenkins = new JenkinsRule();
@WithoutJenkins
@Test
public void testValidUtilClass() throws Exception {
TestUtil.assertUtilityClassWellDefined(ProjectUtil.class);
}
@Test
public void testFillAllProjects() throws Exception {
FreeStyleProject build1 = jenkins.createFreeStyleProject("build1");
FreeStyleProject build2 = jenkins.createFreeStyleProject("build2");
ListBoxModel list = ProjectUtil.fillAllProjects(jenkins.getInstance(), AbstractProject.class);
assertEquals(2, list.size());
ListBoxModel.Option option1 = list.get(0);
assertEquals(build1.getDisplayName(), option1.name);
ListBoxModel.Option option2 = list.get(1);
assertEquals(build2.getDisplayName(), option2.name);
}
@Test
public void testGetProjects() throws Exception {
jenkins.createFreeStyleProject("build-comp1project");
jenkins.createFreeStyleProject("build-comp1-project");
jenkins.createFreeStyleProject("build-comp2-project");
jenkins.createFreeStyleProject("build-comp3-project");
Map<String, AbstractProject> result = ProjectUtil.getProjects("^build-(.+?)-project");
assertEquals(3, result.size());
assertTrue(result.containsKey("comp1"));
assertTrue(result.containsKey("comp2"));
assertTrue(result.containsKey("comp3"));
Map<String, AbstractProject> result2 = ProjectUtil.getProjects("^build-.+?-project");
assertEquals(0, result2.size());
Map<String, AbstractProject> result3 = ProjectUtil.getProjects("*");
assertEquals(0, result3.size());
}
@Test
public void testGetProjectsInFolders() throws Exception {
jenkins.createFolder("folder1");
jenkins.createFolder("folder2");
jenkins.createFreeStyleProject("folder1/project");
jenkins.createFreeStyleProject("folder1/otherProject");
jenkins.createFreeStyleProject("folder2/project");
jenkins.createFreeStyleProject("folder2/otherProject");
Map<String, AbstractProject> result = ProjectUtil.getProjects("^(project)");
assertEquals(0, result.size());
Map<String, AbstractProject> result2 = ProjectUtil.getProjects("^(.+)/project");
assertEquals(2, result2.size());
}
@Test
public void testGetProjectList() throws Exception {
jenkins.createFreeStyleProject("p1");
jenkins.createFreeStyleProject("p2");
List<AbstractProject> projects = ProjectUtil.getProjectList("p1,p2", jenkins.getInstance(), null);
assertEquals(2, projects.size());
projects = ProjectUtil.getProjectList("p1,p2,p3", jenkins.getInstance(), null);
assertEquals(2, projects.size());
projects = ProjectUtil.getProjectList("p1,p2,p3", jenkins.getInstance(), new EnvVars());
assertEquals(2, projects.size());
projects = ProjectUtil.getProjectList(",,", jenkins.getInstance(), new EnvVars());
assertEquals(0, projects.size());
}
@Test
public void testRecursiveProjects() throws Exception {
FreeStyleProject projectA = jenkins.createFreeStyleProject("projectA");
FreeStyleProject projectB = jenkins.createFreeStyleProject("projectB");
projectA.getPublishersList().add(new BuildTrigger(projectB.getName(), true));
projectB.getPublishersList().add(new BuildTrigger(projectA.getName(), true));
jenkins.getInstance().rebuildDependencyGraph();
assertEquals(projectA.getUpstreamProjects().get(0), projectB);
assertEquals(projectB.getUpstreamProjects().get(0), projectA);
// If there is a cycle dependency, then a stack overflow will be thrown here.
ProjectUtil.getAllDownstreamProjects(projectA, null);
}
@Test
public void testGetAllDownstreamProjects() {
Map<String, AbstractProject<?, ?>> result = ProjectUtil.getAllDownstreamProjects(null, null);
assertTrue(result.isEmpty());
}
@Test
public void testGetStartUpstreamsSimple() throws Exception {
FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
FreeStyleProject projectB = jenkins.createFreeStyleProject("B");
FreeStyleProject projectC = jenkins.createFreeStyleProject("C");
projectA.getPublishersList().add(new BuildTrigger(projectC.getName(), true));
projectB.getPublishersList().add(new BuildTrigger(projectC.getName(), true));
jenkins.getInstance().rebuildDependencyGraph();
List<AbstractProject> upstrems = ProjectUtil.getStartUpstreams(projectC);
assertEquals(2, upstrems.size());
}
@Test
@WithoutJenkins
public void getProjectsShouldReturnEmptyMapForEmptyRegExp() {
assertTrue(ProjectUtil.getProjects(" ").isEmpty());
assertTrue(ProjectUtil.getProjects(" ").isEmpty());
assertTrue(ProjectUtil.getProjects("\r\n").isEmpty());
assertTrue(ProjectUtil.getProjects(" \t\r\n ").isEmpty());
}
}