/*
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.functionaltest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import au.com.centrumsystems.hudson.plugin.buildpipeline.trigger.BuildPipelineTrigger;
import com.cloudbees.hudson.plugins.folder.Folder;
import hudson.model.FreeStyleProject;
import hudson.model.ParametersDefinitionProperty;
import hudson.model.StringParameterDefinition;
import hudson.model.View;
import hudson.plugins.view.dashboard.Dashboard;
import hudson.tasks.BuildTrigger;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import se.diabol.jenkins.pipeline.DeliveryPipelineView;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.stream.StreamSource;
public class GuiFunctionalIT {
private static final boolean DO_NOT_SHOW_UPSTREAM = false;
private WebDriver webDriver;
@Rule
public JenkinsRule jenkins = new JenkinsRule();
private static final String NONE = null;
@Before
public void before() {
webDriver = new FirefoxDriver();
}
@After
public void cleanUpWebDriver() {
if (webDriver != null) {
webDriver.close();
webDriver.quit();
}
}
@Test
@Ignore
public void triggerManualBuild() throws Exception {
final FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
final FreeStyleProject projectB = jenkins.createFreeStyleProject("B");
projectA.getPublishersList().add(new BuildPipelineTrigger("B", null));
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline");
List<DeliveryPipelineView.ComponentSpec> specs = new ArrayList<DeliveryPipelineView.ComponentSpec>();
specs.add(new DeliveryPipelineView.ComponentSpec("Component", "A", NONE, DO_NOT_SHOW_UPSTREAM));
view.setComponentSpecs(specs);
view.setAllowManualTriggers(true);
jenkins.getInstance().rebuildDependencyGraph();
jenkins.getInstance().addView(view);
jenkins.buildAndAssertSuccess(projectA);
DeliveryPipelinePage page =
new DeliveryPipelinePage(webDriver, jenkins.getURL().toExternalForm(), "view/Pipeline");
page.open();
page.triggerManual("B0");
jenkins.waitUntilNoActivity();
assertNotNull(projectB.getLastBuild());
}
@Test
@Ignore
public void triggerManualRebuild() throws Exception {
final FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
final FreeStyleProject projectB = jenkins.createFreeStyleProject("B");
projectA.getPublishersList().add(new BuildPipelineTrigger("B", null));
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline");
List<DeliveryPipelineView.ComponentSpec> specs = new ArrayList<DeliveryPipelineView.ComponentSpec>();
specs.add(new DeliveryPipelineView.ComponentSpec("Component", "A", NONE, DO_NOT_SHOW_UPSTREAM));
view.setComponentSpecs(specs);
view.setAllowManualTriggers(true);
view.setAllowRebuild(true);
jenkins.getInstance().rebuildDependencyGraph();
jenkins.getInstance().addView(view);
projectA.scheduleBuild(0, null);
jenkins.waitUntilNoActivity();
DeliveryPipelinePage page =
new DeliveryPipelinePage(webDriver, jenkins.getURL().toExternalForm(), "view/Pipeline");
page.open();
page.triggerManual("B0");
jenkins.waitUntilNoActivity();
assertNotNull(projectB.getLastBuild());
page.open();
page.triggerRebuild("B0");
jenkins.waitUntilNoActivity();
assertEquals(2, projectB.getLastBuild().getNumber());
}
@Test
@Ignore
public void defaultView() throws Exception {
FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
jenkins.createFreeStyleProject("B");
projectA.getPublishersList().add(new BuildPipelineTrigger("B", null));
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline");
List<DeliveryPipelineView.ComponentSpec> specs = new ArrayList<DeliveryPipelineView.ComponentSpec>();
specs.add(new DeliveryPipelineView.ComponentSpec("Component", "A", NONE, DO_NOT_SHOW_UPSTREAM));
view.setComponentSpecs(specs);
view.setAllowManualTriggers(true);
view.setAllowRebuild(true);
jenkins.getInstance().rebuildDependencyGraph();
jenkins.getInstance().addView(view);
jenkins.getInstance().setPrimaryView(view);
View all = jenkins.getInstance().getView("All");
jenkins.getInstance().deleteView(all);
projectA.scheduleBuild(0, null);
jenkins.waitUntilNoActivity();
NewJobPage newJobPage = new NewJobPage(webDriver, jenkins.getURL() + "view/Pipeline");
newJobPage.open();
newJobPage.setJobName("NewJob");
newJobPage.setFreeStyle();
ConfigureJobPage configureJobPage = newJobPage.submit();
configureJobPage.submit();
assertNotNull(jenkins.getInstance().getItemByFullName("NewJob"));
}
@Test
public void testTriggerNewParameterizedPipeline() throws Exception {
FreeStyleProject start = jenkins.createFreeStyleProject("Start");
start.addProperty(new ParametersDefinitionProperty(
new StringParameterDefinition("key2", "value2")
));
jenkins.createFreeStyleProject("End");
start.getPublishersList().add(new BuildTrigger("End", true));
jenkins.getInstance().rebuildDependencyGraph();
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline");
List<DeliveryPipelineView.ComponentSpec> specs = new ArrayList<DeliveryPipelineView.ComponentSpec>();
specs.add(new DeliveryPipelineView.ComponentSpec("Component", "Start", NONE, DO_NOT_SHOW_UPSTREAM));
view.setComponentSpecs(specs);
view.setAllowPipelineStart(true);
jenkins.getInstance().addView(view);
DeliveryPipelinePage page =
new DeliveryPipelinePage(webDriver, jenkins.getURL().toExternalForm(), "view/Pipeline");
page.open();
page.triggerNewParameterizedPipelineBuild("0");
jenkins.waitUntilNoActivity();
assertNotNull(start.getLastBuild());
}
@Test
public void testTriggerNewPipeline() throws Exception {
FreeStyleProject start = jenkins.createFreeStyleProject("Start");
jenkins.createFreeStyleProject("End");
start.getPublishersList().add(new BuildTrigger("End", true));
jenkins.getInstance().rebuildDependencyGraph();
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline");
List<DeliveryPipelineView.ComponentSpec> specs = new ArrayList<DeliveryPipelineView.ComponentSpec>();
specs.add(new DeliveryPipelineView.ComponentSpec("Component", "Start", NONE, DO_NOT_SHOW_UPSTREAM));
view.setComponentSpecs(specs);
view.setAllowPipelineStart(true);
jenkins.getInstance().addView(view);
DeliveryPipelinePage page =
new DeliveryPipelinePage(webDriver, jenkins.getURL().toExternalForm(), "view/Pipeline");
page.open();
page.triggerNewPipelineBuild("0");
jenkins.waitUntilNoActivity();
assertNotNull(start.getLastBuild());
}
@Test
public void testTriggerNewPipelineFolders() throws Exception {
Folder folder = jenkins.getInstance().createProject(Folder.class, "Folder");
assertNotNull(folder);
FreeStyleProject start = jenkins.createFreeStyleProject("Start");
folder.createProject(FreeStyleProject.class, "End");
start.getPublishersList().add(new BuildTrigger("End", true));
jenkins.getInstance().rebuildDependencyGraph();
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline");
List<DeliveryPipelineView.ComponentSpec> specs = new ArrayList<DeliveryPipelineView.ComponentSpec>();
specs.add(new DeliveryPipelineView.ComponentSpec("Component", "Start", NONE, DO_NOT_SHOW_UPSTREAM));
view.setComponentSpecs(specs);
view.setAllowPipelineStart(true);
folder.addView(view);
DeliveryPipelinePage page =
new DeliveryPipelinePage(webDriver, jenkins.getURL().toExternalForm(), "job/Folder/view/Pipeline");
page.open();
page.triggerNewPipelineBuild("0");
jenkins.waitUntilNoActivity();
assertNotNull(start.getLastBuild());
}
@Test
@Issue("JENKINS-39856")
public void jsPlumbShouldNotLeakMemoryOnDeliveryPipelinePage() throws Exception {
FreeStyleProject start = jenkins.createFreeStyleProject("A");
jenkins.createFreeStyleProject("B");
start.getPublishersList().add(new BuildTrigger("B", true));
jenkins.getInstance().rebuildDependencyGraph();
DeliveryPipelineView view = new DeliveryPipelineView("Pipeline");
List<DeliveryPipelineView.ComponentSpec> specs = new ArrayList<DeliveryPipelineView.ComponentSpec>();
specs.add(new DeliveryPipelineView.ComponentSpec("Component", "A", NONE, DO_NOT_SHOW_UPSTREAM));
view.setComponentSpecs(specs);
view.setAllowPipelineStart(true);
jenkins.getInstance().addView(view);
DeliveryPipelinePage page =
new DeliveryPipelinePage(webDriver, jenkins.getURL().toExternalForm(), "view/Pipeline");
page.open();
String result = page.getJsPlumbUtilityVariable();
jenkins.waitUntilNoActivity();
assertNotNull(result);
assertEquals("1", result);
}
@Test
@Issue("JENKINS-39856")
public void jsPlumbShouldNotLeakMemoryOnDeliveryPipelineDashboardPortlet() throws Exception {
FreeStyleProject projectA = jenkins.createFreeStyleProject("A");
jenkins.createFreeStyleProject("B");
projectA.getPublishersList().add(new BuildTrigger("B", true));
FreeStyleProject projectC = jenkins.createFreeStyleProject("C");
jenkins.createFreeStyleProject("D");
projectC.getPublishersList().add(new BuildTrigger("D", true));
jenkins.getInstance().rebuildDependencyGraph();
Dashboard view = new Dashboard("Dashboard");
jenkins.getInstance().addView(view);
view.updateByXml(new StreamSource(GuiFunctionalIT.class.getResourceAsStream(
"/se/diabol/jenkins/pipeline/functionaltest/GuiFunctionalIT/DashboardViewPage.xml")));
view.save();
DeliveryPipelinePage page =
new DeliveryPipelinePage(webDriver, jenkins.getURL().toExternalForm(), "view/Dashboard");
page.open();
String result = page.getJsPlumbUtilityVariable();
jenkins.waitUntilNoActivity();
assertNotNull(result);
assertEquals("2", result);
}
}