Esempio n. 1
0
  public void testTakeBlockedByProperty() throws Exception {
    Slave slave = createSlave();
    FreeStyleProject project = createFreeStyleProject();

    // First, attempt to run our project before adding the property
    Future<FreeStyleBuild> build = project.scheduleBuild2(0);
    assertBuildStatus(Result.SUCCESS, build.get(20, TimeUnit.SECONDS));

    // Add the build-blocker property and try again
    slave.getNodeProperties().add(new RejectAllTasksProperty());

    build = project.scheduleBuild2(0);
    try {
      build.get(10, TimeUnit.SECONDS);
      fail("Expected timeout exception");
    } catch (TimeoutException e) {
      List<BuildableItem> buildables = jenkins.getQueue().getBuildableItems();
      assertNotNull(buildables);
      assertEquals(1, buildables.size());

      BuildableItem item = buildables.get(0);
      assertEquals(project, item.task);
      assertNotNull(item.getCauseOfBlockage());
      assertEquals(
          Messages.Queue_WaitingForNextAvailableExecutor(),
          item.getCauseOfBlockage().getShortDescription());
    }
  }
  @Test
  public void shouldPopulatePropertiesContentWithCustomWorkspace() throws Exception {
    final String customWorkspaceValue = tmp.newFolder().getAbsolutePath();
    String customEnvVarName = "materialize_workspace_path";
    String customEnvVarValue = "${WORKSPACE}/materialize_workspace";

    FreeStyleProject project = j.createFreeStyleProject();
    project.setCustomWorkspace(customWorkspaceValue);

    EnvVars.masterEnvVars.remove("WORKSPACE"); // ensure build node don't have such var already

    EnvInjectBuildWrapper envInjectBuildWrapper = new EnvInjectBuildWrapper();
    envInjectBuildWrapper.setInfo(withPropContent(customEnvVarName + "=" + customEnvVarValue));
    project.getBuildWrappersList().add(envInjectBuildWrapper);

    FreeStyleBuild build = j.buildAndAssertSuccess(project);

    // Retrieve build workspace
    String buildWorkspaceValue = build.getWorkspace().getRemote();
    assertThat(
        "1. Should see actual ws equal to custom",
        buildWorkspaceValue,
        equalTo(customWorkspaceValue));

    // Compute value with workspace
    String expectedCustomEnvVarValue =
        replaceMacro(customEnvVarValue, of("WORKSPACE", buildWorkspaceValue));

    assertThat(
        "2. Property should be resolved with custom ws in build",
        build,
        withEnvInjectAction(map(hasEntry(customEnvVarName, expectedCustomEnvVarValue))));
  }
Esempio n. 3
0
  /** End-to-end installation test. */
  private void doTestAutoInstallation(String id, String fullversion) throws Exception {
    Assume.assumeTrue(
        "this is a really time consuming test, so only run it when we really want",
        Boolean.getBoolean("jenkins.testJDKInstaller"));

    retrieveUpdateCenterData();

    JDKInstaller installer = new JDKInstaller(id, true);

    JDK jdk =
        new JDK(
            "test",
            tmp.getRoot().getAbsolutePath(),
            Arrays.asList(new InstallSourceProperty(Arrays.<ToolInstaller>asList(installer))));

    j.jenkins.getJDKs().add(jdk);

    FreeStyleProject p = j.createFreeStyleProject();
    p.setJDK(jdk);
    p.getBuildersList().add(new Shell("java -fullversion\necho $JAVA_HOME"));
    FreeStyleBuild b = j.buildAndAssertSuccess(p);
    @SuppressWarnings("deprecation")
    String log = b.getLog();
    System.out.println(log);
    // make sure it runs with the JDK that just got installed
    assertTrue(log.contains(fullversion));
    assertTrue(log.contains(tmp.getRoot().getAbsolutePath()));
  }
  @Test
  @LocalData
  public void testLoadOnStart() throws Exception {
    // verify that SpecificUserAuthorizationStrategy is loaded correctly from the disk on startup.
    {
      FreeStyleProject p = j.jenkins.getItemByFullName("test", FreeStyleProject.class);
      assertNotNull(p);
      AuthorizeProjectProperty prop = p.getProperty(AuthorizeProjectProperty.class);
      assertNotNull(prop);
      assertEquals(SpecificUsersAuthorizationStrategy.class, prop.getStrategy().getClass());
      SpecificUsersAuthorizationStrategy strategy =
          (SpecificUsersAuthorizationStrategy) prop.getStrategy();
      assertEquals("test1", strategy.getUserid());
    }

    j.jenkins.reload();

    // verify that SpecificUserAuthorizationStrategy is reloaded correctly from the disk.
    {
      FreeStyleProject p = j.jenkins.getItemByFullName("test", FreeStyleProject.class);
      assertNotNull(p);
      AuthorizeProjectProperty prop = p.getProperty(AuthorizeProjectProperty.class);
      assertNotNull(prop);
      assertEquals(SpecificUsersAuthorizationStrategy.class, prop.getStrategy().getClass());
      SpecificUsersAuthorizationStrategy strategy =
          (SpecificUsersAuthorizationStrategy) prop.getStrategy();
      assertEquals("test1", strategy.getUserid());
    }
  }
  /**
   * Should not cause a fatal error even for an empty selector.
   *
   * @throws Exception
   */
  @Test
  public void testEmptySelector() throws Exception {
    FreeStyleProject copiee = j.createFreeStyleProject();
    FreeStyleProject copier = j.createFreeStyleProject();

    ParameterizedBuildSelector pbs = new ParameterizedBuildSelector("SELECTOR");
    copier
        .getBuildersList()
        .add(
            CopyArtifactUtil.createCopyArtifact(
                copiee.getFullName(),
                null, // parameters
                pbs,
                "**/*", // filter
                "", // excludes
                false, // flatten
                true, // optional
                false // finterprintArtifacts
                ));
    FreeStyleBuild b =
        (FreeStyleBuild)
            copier
                .scheduleBuild2(0, new ParametersAction(new StringParameterValue("SELECTOR", "")))
                .get();
    j.assertBuildStatusSuccess(b);
  }
 private FreeStyleProject createJob(Builder builder) throws IOException {
   FreeStyleProject p = createFreeStyleProject();
   p.setAssignedLabel(
       null); // let it roam free, or else it ties itself to the master since we have no slaves
   p.getBuildersList().add(builder);
   return p;
 }
  public void testSelfExcludingJobs() throws Exception {

    BuildBlockerProperty theProperty = new BuildBlockerProperty();
    theProperty.setBlockingJobs("SelfExcluding_.*");

    FreeStyleProject theJob1 = createFreeStyleProject("SelfExcluding_Job1");
    theJob1.addProperty(theProperty);
    assertTrue(theJob1.getBuilds().isEmpty());

    FreeStyleProject theJob2 = createFreeStyleProject("SelfExcluding_Job2");
    theJob2.addProperty(theProperty);
    assertTrue(theJob1.getBuilds().isEmpty());

    // allow executing two simultanious jobs
    int theOldNumExecutors = Hudson.getInstance().getNumExecutors();
    Hudson.getInstance().setNumExecutors(2);

    Future<FreeStyleBuild> theFuture1 = theJob1.scheduleBuild2(0);
    Future<FreeStyleBuild> theFuture2 = theJob2.scheduleBuild2(0);

    long theStartTime = System.currentTimeMillis();
    long theEndTime = theStartTime;
    while ((!theFuture1.isDone() || !theFuture2.isDone()) && theEndTime < theStartTime + 5000) {
      theEndTime = System.currentTimeMillis();
    }

    // if more then five seconds have passed, we assume its a deadlock.
    assertTrue(theEndTime < theStartTime + 5000);

    // restore changed settings
    Hudson.getInstance().setNumExecutors(theOldNumExecutors);
    theJob2.delete();
    theJob1.delete();
  }
  @Test
  public void testParameterisedJobShouldSaveAllParameters() throws Exception {
    final FreeStyleProject project = createFreeStyleProject("ParameterisedJob");

    // set parameters
    final ParameterDefinition param1 =
        new StringParameterDefinition("myStringParam", "myStringValue", "My String Parameter");
    final ParameterDefinition param2 =
        new BooleanParameterDefinition("myBooleanParam", false, "My Boolean Parameter");
    project.addProperty(new ParametersDefinitionProperty(param1, param2));

    // enable audit2db plugin
    final DbAuditPublisher plugin = getPlugin();
    project.getPublishersList().add((Publisher) plugin);

    // build now
    final Future<FreeStyleBuild> futureBuild = project.scheduleBuild2(0);
    final FreeStyleBuild build = futureBuild.get();
    Assert.assertNotNull(build);
    Assert.assertEquals("Unexpected build result", Result.SUCCESS, build.getResult());

    // check data persistence
    final BuildDetailsRepository repository = plugin.getRepository();
    final BuildDetails actual = repository.getBuildDetailsForBuild(build);
    final BuildDetails expected = new BuildDetailsImpl(build);
    Assert.assertEquals("Unexpected build details", expected, actual);
    Assert.assertNotNull("Unexpected null end date", actual.getEndDate());
    Assert.assertTrue("Unexpected duration", actual.getDuration() > 0L);
    Assert.assertEquals("Unexpected number of params", 2, actual.getParameters().size());
  }
  @Test
  public void abortBuild() throws Exception {
    FreeStyleProject p = j.createFreeStyleProject("test1");
    p.getBuildersList().add(new Shell("sleep 6000"));

    WorkflowJob foo = j.jenkins.createProject(WorkflowJob.class, "foo");
    foo.setDefinition(
        new CpsFlowDefinition(StringUtils.join(Arrays.asList("build('test1');"), "\n")));

    QueueTaskFuture<WorkflowRun> q = foo.scheduleBuild2(0);
    WorkflowRun b = q.getStartCondition().get();

    CpsFlowExecution e = (CpsFlowExecution) b.getExecutionPromise().get();
    e.waitForSuspension();

    FreeStyleBuild fb = null;
    while (fb == null) {
      fb = p.getBuildByNumber(1);
      Thread.sleep(10);
    }
    fb.getExecutor().interrupt();

    j.assertBuildStatus(Result.ABORTED, j.waitForCompletion(fb));
    j.assertBuildStatus(Result.FAILURE, q.get());
  }
Esempio n. 10
0
 public static List<AbstractProject<?, ?>> findProjectsWithEVMToolsBuilder(
     String... projectNames) {
   List<AbstractProject<?, ?>> returnList = new ArrayList<AbstractProject<?, ?>>();
   List<TopLevelItem> items = Jenkins.getInstance().getItems();
   for (TopLevelItem item : items) {
     if (item instanceof FreeStyleProject) {
       FreeStyleProject project = (FreeStyleProject) item;
       if (!project.isDisabled()) {
         DescribableList<Builder, Descriptor<Builder>> buildersList = project.getBuildersList();
         EVMToolsBuilder builder = buildersList.get(EVMToolsBuilder.class);
         if (builder != null) {
           if (projectNames.length != 0) {
             for (String projectName : projectNames) {
               if (project.getName().equals(projectName)) {
                 returnList.add(project);
                 break;
               }
             }
           } else {
             returnList.add(project);
           }
         }
       }
     }
   }
   return returnList;
 }
  @Override
  public Iterable<Edge> getEdgesIncidentWith(AbstractProject<?, ?> project) {
    Set<Edge> artifactEdges = Sets.newHashSet();

    if (copyartifactIsInstalled) {
      if (project instanceof FreeStyleProject) {

        FreeStyleProject proj = (FreeStyleProject) project;
        List<Builder> builders = proj.getBuilders();

        for (Builder builder : builders) {

          if (builder instanceof CopyArtifact) {

            CopyArtifact caBuilder = (CopyArtifact) builder;
            String projectName = caBuilder.getProjectName();
            Jenkins jenkins = Jenkins.getInstance();
            AbstractProject<?, ?> projectFromName =
                jenkins.getItem(projectName, project.getParent(), AbstractProject.class);

            if (projectFromName != null) {
              artifactEdges.add(new CopyArtifactEdge(node(projectFromName), node(project)));
            }
          }
        }
      }
    }
    return artifactEdges;
  }
  public void testDataCompatibilityWithHostNameWithWhitespace() throws Exception {
    DumbSlave slave =
        new DumbSlave(
            "abc def (xyz) : test",
            "dummy",
            createTmpDir().getPath(),
            "1",
            Mode.NORMAL,
            "",
            createComputerLauncher(null),
            RetentionStrategy.NOOP,
            Collections.EMPTY_LIST);
    jenkins.addNode(slave);

    FreeStyleProject p = createFreeStyleProject();
    p.setAssignedLabel(jenkins.getLabel("abc def"));
    assertEquals("abc def", p.getAssignedLabel().getName());
    assertEquals("\"abc def\"", p.getAssignedLabel().getExpression());

    // expression should be persisted, not the name
    Field f = AbstractProject.class.getDeclaredField("assignedNode");
    f.setAccessible(true);
    assertEquals("\"abc def\"", f.get(p));

    // but if the name is set, we'd still like to parse it
    f.set(p, "a:b c");
    assertEquals("a:b c", p.getAssignedLabel().getName());
  }
  public void testShouldHaveNextCommit() throws Exception {

    setup();
    File dir = createTempDirectory();
    MercurialBridge plugin = new MercurialBridge(false, "test", "");
    plugin.setWorkingDirectory(new FilePath(dir));

    System.out.println("Creating test repository at repository: " + dir.getAbsolutePath());

    // Setup the repository
    hg(dir, "init");
    shell(dir, "touch", "foo");
    hg(dir, "add", "foo");
    hg(dir, "commit", "-m", "\"added foo\"");
    hg(dir, "branch", "test");
    shell(dir, "touch", "bar");
    hg(dir, "add", "bar");
    hg(dir, "commit", "-m", "\"added bar\"");
    shell(dir, "touch", "bar3");
    hg(dir, "add", "bar3");
    hg(dir, "commit", "-m", "\"added bar3\"");

    MercurialSCM scm = new MercurialSCM(null, dir.getAbsolutePath(), null, null, null, null, true);
    FreeStyleProject project =
        Hudson.getInstance().createProject(FreeStyleProject.class, "testproject");
    project.setScm(scm);

    // Setup build and listener
    OutputStream out = new ByteArrayOutputStream();
    BuildListener blistener = new StreamBuildListener(out);
    FreeStyleBuild build = new FreeStyleBuild(project);

    assertNotNull(plugin.nextCommit(build, launcher, blistener, new Commit<String>("0")));
    cleanup(dir);
  }
  public void testShouldNotHaveNextCommit() throws Exception {

    setup();
    File dir = createTempDirectory();
    MercurialBridge plugin = new MercurialBridge(false, "devtest", "");
    plugin.setWorkingDirectory(new FilePath(dir));

    System.out.println("Creating test repository at repository: " + dir.getAbsolutePath());

    // Setup the repository
    hg(dir, "init");
    hg(dir, "branch", "devtest");
    shell(dir, "touch", "foo");
    hg(dir, "add", "foo");
    hg(dir, "commit", "-m", "\"added foo\"");
    String revision = hg(dir, "log", "-l1", "--template", "{node}").toString();
    // shell(dir, "echo",revision,">",".hg/currentBuildFile");

    MercurialSCM scm = new MercurialSCM(null, dir.getAbsolutePath(), null, null, null, null, true);
    FreeStyleProject project =
        Hudson.getInstance().createProject(FreeStyleProject.class, "testproject");
    project.setScm(scm);

    // Setup build and listener
    OutputStream out = new ByteArrayOutputStream();
    BuildListener blistener = new StreamBuildListener(out);
    FreeStyleBuild build = new FreeStyleBuild(project);

    Commit<String> result =
        plugin.nextCommit(build, launcher, blistener, new Commit<String>(revision));

    assertNull(result);
    cleanup(dir);
  }
  /** Scenario: loads on one label shouldn't translate to load on another label. */
  public void testLabels() throws Exception {
    BulkChange bc = new BulkChange(hudson);
    try {
      DummyCloudImpl cloud = initHudson(0);
      Label blue = hudson.getLabel("blue");
      Label red = hudson.getLabel("red");
      cloud.label = red;

      // red jobs
      List<FreeStyleProject> redJobs = create5SlowJobs(new Latch(5));
      for (FreeStyleProject p : redJobs) p.setAssignedLabel(red);

      // blue jobs
      List<FreeStyleProject> blueJobs = create5SlowJobs(new Latch(5));
      for (FreeStyleProject p : blueJobs) p.setAssignedLabel(blue);

      // build all
      List<Future<FreeStyleBuild>> blueBuilds = buildAll(blueJobs);
      verifySuccessfulCompletion(buildAll(redJobs));

      // cloud should only give us 5 nodes for 5 red jobs
      assertEquals(5, cloud.numProvisioned);

      // and all blue jobs should be still stuck in the queue
      for (Future<FreeStyleBuild> bb : blueBuilds) assertFalse(bb.isDone());
    } finally {
      bc.abort();
    }
  }
 protected FreeStyleProject setupProject() throws Exception {
   IntegritySCM scm = new IntegritySCM("server1", configPath, "devjob");
   FreeStyleProject project = jenkinsRule.createFreeStyleProject();
   project.setScm(scm);
   project.save();
   return project;
 }
  @Before
  public void setUp() throws Exception {
    project = j.createFreeStyleProject("junit");
    archiver = new JUnitResultArchiver("*.xml");
    project.getPublishersList().add(archiver);

    project.getBuildersList().add(new TouchBuilder());
  }
 @Test
 @Issue("JENKINS-25312")
 public void testMarkSuccessOnCommitNotifierFailure() throws Exception {
   FreeStyleProject prj = jRule.createFreeStyleProject();
   prj.getPublishersList().add(new GitHubCommitNotifier(Result.SUCCESS.toString()));
   Build b = prj.scheduleBuild2(0).get();
   jRule.assertBuildStatus(Result.SUCCESS, b);
 }
 @Test
 @Issue("JENKINS-23641")
 public void testNoBuildData() throws Exception {
   FreeStyleProject prj = jRule.createFreeStyleProject("23641_noBuildData");
   prj.getPublishersList().add(new GitHubCommitNotifier());
   Build b = prj.scheduleBuild2(0).get();
   jRule.assertBuildStatus(Result.FAILURE, b);
   jRule.assertLogContains(BuildDataHelper_NoBuildDataError(), b);
 }
  /**
   * Creates a new freestyle project and checks if the rebuild action is available on the project
   * level.
   *
   * @throws Exception Exception
   */
  public void testWhenProjectWithoutParamsThenRebuildProjectAvailable() throws Exception {
    FreeStyleProject project = createFreeStyleProject();

    FreeStyleBuild build = project.scheduleBuild2(0).get();

    RebuildLastCompletedBuildAction action =
        build.getProject().getAction(RebuildLastCompletedBuildAction.class);
    assertNotNull(action);
  }
 public void testFlatten() throws Exception {
   FreeStyleProject other = createArtifactProject(),
       p = createProject(other.getName(), "", "newdir", false, true, false);
   assertBuildStatusSuccess(other.scheduleBuild2(0, new UserCause()).get());
   FreeStyleBuild b = p.scheduleBuild2(0, new UserCause()).get();
   assertBuildStatusSuccess(b);
   assertFile(true, "newdir/foo.txt", b);
   assertFile(true, "newdir/subfoo.txt", b);
   assertFile(true, "newdir/c.log", b);
 }
 public void testCopyToTarget() throws Exception {
   FreeStyleProject other = createArtifactProject(),
       p = createProject(other.getName(), "deep*/**", "new/deep/dir", true, false, false);
   assertBuildStatusSuccess(other.scheduleBuild2(0, new UserCause()).get());
   FreeStyleBuild b = p.scheduleBuild2(0, new UserCause()).get();
   assertBuildStatusSuccess(b);
   assertFile(false, "foo.txt", b);
   assertFile(false, "new/deep/dir/foo.txt", b);
   assertFile(true, "new/deep/dir/deepfoo/a/b/c.log", b);
 }
 public void testCopyWithFilter() throws Exception {
   FreeStyleProject other = createArtifactProject(),
       p = createProject(other.getName(), "**/bogus*, **/sub*, bogus/**", "", false, false, false);
   assertBuildStatusSuccess(other.scheduleBuild2(0, new UserCause()).get());
   FreeStyleBuild b = p.scheduleBuild2(0, new UserCause()).get();
   assertBuildStatusSuccess(b);
   assertFile(false, "foo.txt", b);
   assertFile(true, "subdir/subfoo.txt", b);
   assertFile(false, "deepfoo/a/b/c.log", b);
 }
  public void testShouldCauseMergeConflict() throws Exception {
    setup();
    File dir = createTempDirectory();
    MercurialBridge plugin = new MercurialBridge(false, "test", "");
    plugin.setWorkingDirectory(new FilePath(dir));

    System.out.println("Creating test repository at repository: " + dir.getAbsolutePath());

    hg(dir, "init");
    File hello = new File(dir, "hello");

    PrintWriter writer = new PrintWriter(hello, "UTF-8");
    writer.println("hello");
    writer.close();
    writer = null;

    hg(dir, "add", "hello");
    hg(dir, "commit", "-m", "Added hello");
    hg(dir, "branch", "test");

    writer = new PrintWriter(hello, "UTF-8");
    writer.println("hello, world");
    writer.close();
    writer = null;

    hg(dir, "commit", "-m", "Changed contents of hello in test branch");
    String revision = hg(dir, "tip", "--template", "{node}").toString();
    hg(dir, "update", "-C", "default");

    writer = new PrintWriter(hello, "UTF-8");
    writer.println("hello, jenkins");
    writer.close();
    writer = null;

    hg(dir, "commit", "-m", "Changed contents of hello in default branch");

    MercurialSCM scm = new MercurialSCM(null, dir.getAbsolutePath(), null, null, null, null, true);
    FreeStyleProject project =
        Hudson.getInstance().createProject(FreeStyleProject.class, "testproject");
    project.setScm(scm);

    // Setup build and listener
    OutputStream out = new ByteArrayOutputStream();
    BuildListener blistener = new StreamBuildListener(out);
    FreeStyleBuild build = new FreeStyleBuild(project);

    boolean exceptionThrown = false;
    try {
      plugin.prepareWorkspace(build, launcher, blistener, new Commit<String>(revision));
    } catch (AbortException e) {
      exceptionThrown = true;
    }

    assertTrue(exceptionThrown);
  }
 /** Test copying artifacts from a particular configuration of a matrix job */
 public void testMatrixJob() throws Exception {
   MatrixProject other = createMatrixArtifactProject();
   FreeStyleProject p = createProject(other.getName() + "/FOO=two", "", "", true, false, false);
   assertBuildStatusSuccess(other.scheduleBuild2(0, new UserCause()).get());
   FreeStyleBuild b = p.scheduleBuild2(0, new UserCause()).get();
   assertBuildStatusSuccess(b);
   assertFile(true, "foo.txt", b);
   assertFile(true, "two.txt", b);
   assertFile(true, "subdir/subfoo.txt", b);
   assertFile(true, "deepfoo/a/b/c.log", b);
 }
 @Test
 @Issue("JENKINS-23641")
 public void testNoBuildRevision() throws Exception {
   FreeStyleProject prj = jRule.createFreeStyleProject();
   prj.setScm(new GitSCM("http://non.existent.git.repo.nowhere/repo.git"));
   prj.getPublishersList().add(new GitHubCommitNotifier());
   // 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);
 }
  @LocalData
  @Test
  public void persistence() throws Exception {
    project.scheduleBuild2(0).get(60, TimeUnit.SECONDS);

    reloadJenkins();

    FreeStyleBuild build = project.getBuildByNumber(1);

    assertTestResults(build);
  }
 /**
  * Akin to {@link JenkinsRule#configRoundtrip(Builder)}.
  *
  * @param <S> step type
  * @param before the incoming step
  * @return the result after displaying in a form and resaving
  */
 @SuppressWarnings("unchecked")
 public <S extends Step> S configRoundTrip(S before) throws Exception {
   FreeStyleProject p = rule.createFreeStyleProject();
   p.getBuildersList().add(new StepBuilder(before));
   // workaround for eclipse compiler Ambiguous method call
   p = (FreeStyleProject) rule.configRoundtrip((Item) p);
   StepBuilder b = p.getBuildersList().get(StepBuilder.class);
   assertNotNull(b);
   Step after = b.s;
   assertNotNull(after);
   assertEquals(before.getClass(), after.getClass());
   return (S) after;
 }
 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"))) {
     b = prj.scheduleBuild2(0, new Cause.UserIdCause(), new BuildData()).get();
   } else {
     b = prj.scheduleBuild2(0).get();
   }
   return b;
 }
  @Test
  public void testNoInfiniteRecursion() throws Exception {
    final String proj1 = "Project1";
    final String proj2 = "Project2";
    final FreeStyleProject project1 = createFreeStyleProject(proj1);
    final FreeStyleProject project2 = createFreeStyleProject(proj2);
    project1.getPublishersList().add(new BuildTrigger(proj2, false));
    project2.getPublishersList().add(new BuildTrigger(proj1, false));
    hudson.rebuildDependencyGraph();

    final BuildForm form1 = new BuildForm(jenkins, new PipelineBuild(null, project1, null));
    assertThat(form1.getDependencies(), hasSize(1));
    assertThat(form1.getDependencies().get(0).getDependencies(), hasSize(0));
  }