/**
  * Returns the {@link Promotion} object that represents the successful promotion.
  *
  * @return null if the promotion has never been successful, or if it was but the record is already
  *     lost.
  */
 public Promotion getSuccessfulPromotion(JobPropertyImpl jp) {
   if (promotion >= 0) {
     PromotionProcess p = jp.getItem(name);
     if (p != null) return p.getBuildByNumber(promotion);
   }
   return null;
 }
 /** Gets the last successful {@link Promotion}. */
 public Promotion getLastFailed() {
   PromotionProcess p = getProcess();
   for (Integer n : Iterators.reverse(promotionAttempts)) {
     Promotion b = p.getBuildByNumber(n);
     if (b != null && b.getResult() != Result.SUCCESS) return b;
   }
   return null;
 }
  @Test
  public void testRebuild() throws Exception {
    // job with promotion process
    FreeStyleProject p1 = j.createFreeStyleProject("promojob");

    // setup promotion process
    JobPropertyImpl promotion = new JobPropertyImpl(p1);
    p1.addProperty(promotion);
    PromotionProcess proc = promotion.addProcess("promo");
    proc.conditions.add(new SelfPromotionCondition(false));

    // build it
    FreeStyleBuild b1 = j.assertBuildStatusSuccess(p1.scheduleBuild2(0));
    j.waitUntilNoActivity();

    // verify that promotion happened
    Assert.assertSame(proc.getBuilds().getLastBuild().getTarget(), b1);

    // job with parameter
    FreeStyleProject p2 = j.createFreeStyleProject("paramjob");

    // add promoted build param
    p2.addProperty(
        new ParametersDefinitionProperty(
            new PromotedBuildParameterDefinition(
                "var", "promojob", "promo", "promoted build param to test rebuild")));

    // build with parameter
    FreeStyleBuild b2 = j.assertBuildStatusSuccess(p2.scheduleBuild2(0));

    // validate presence of parameter
    ParametersAction a1 = b2.getAction(ParametersAction.class);
    Assert.assertNotNull(a1);
    Assert.assertFalse(a1.getParameters().isEmpty());
    ParameterValue v1 = a1.getParameter("var");
    Assert.assertTrue(v1 instanceof PromotedBuildParameterValue);
    PromotedBuildParameterValue pbpv1 = (PromotedBuildParameterValue) v1;
    Assert.assertEquals(b1.getNumber(), pbpv1.getRun().getNumber());

    // rebuild it
    JenkinsRule.WebClient wc = j.createWebClient();
    HtmlPage page = wc.getPage(b2, "rebuild");
    HtmlForm form = page.getFormByName("config");
    j.submit(form);
    j.waitUntilNoActivity();

    // validate presence of parameter
    FreeStyleBuild rebuild = p2.getLastBuild();
    j.assertBuildStatusSuccess(rebuild);
    Assert.assertNotEquals(b2.getNumber(), rebuild.getNumber());
    ParametersAction a2 = rebuild.getAction(ParametersAction.class);
    Assert.assertNotNull(a2);
    Assert.assertFalse(a2.getParameters().isEmpty());
    ParameterValue v2 = a2.getParameter("var");
    Assert.assertTrue(v2 instanceof PromotedBuildParameterValue);
    PromotedBuildParameterValue pbpv2 = (PromotedBuildParameterValue) v2;
    Assert.assertEquals(b1.getNumber(), pbpv2.getRun().getNumber());
  }
 /** Gets all the promotion builds. */
 public List<Promotion> getPromotionBuilds() {
   PromotionProcess p = getProcess();
   List<Promotion> builds = new ArrayList<Promotion>();
   for (Integer n : Iterators.reverse(promotionAttempts)) {
     Promotion b = p.getBuildByNumber(n);
     if (b != null) {
       builds.add(b);
     }
   }
   return builds;
 }
 public boolean isFor(PromotionProcess process) {
   return process.getName().equals(this.name);
 }
 public Status(PromotionProcess process, Collection<? extends PromotionBadge> badges) {
   this.name = process.getName();
   this.badges = badges.toArray(new PromotionBadge[badges.size()]);
 }
 /** Returns true if the promotion for this is pending in the queue, waiting to be executed. */
 public boolean isInQueue() {
   PromotionProcess p = getProcess();
   return p != null && p.isInQueue(getTarget());
 }