/**
   * Executes batch but finalizer is failed.
   *
   * @throws Exception if failed
   */
  @Test
  public void executeBatch_failed_finalize() throws Exception {
    ProfileBuilder prf = new ProfileBuilder(folder.getRoot());
    prf.setTracker(FinalizerFailed.class);
    ExecutionTask task = prf.task();
    try {
      task.executeBatch("batch");
      fail();
    } catch (IOException e) {
      // ok.
    }

    List<Record> results = SerialExecutionTracker.get(prf.trackingId);
    verifyPhaseOrder(results);

    assertThat(phase(results, "testing", ExecutionPhase.SETUP).size(), is(2));
    assertThat(phase(results, "testing", ExecutionPhase.INITIALIZE).size(), is(1));
    assertThat(phase(results, "testing", ExecutionPhase.IMPORT).size(), is(2));
    assertThat(phase(results, "testing", ExecutionPhase.PROLOGUE).size(), is(1));
    assertThat(phase(results, "testing", ExecutionPhase.MAIN).size(), is(4));
    assertThat(phase(results, "testing", ExecutionPhase.EPILOGUE).size(), is(1));
    assertThat(phase(results, "testing", ExecutionPhase.EXPORT).size(), is(2));
    assertThat(phase(results, "testing", ExecutionPhase.FINALIZE).size(), is(1));
    assertThat(phase(results, "testing", ExecutionPhase.CLEANUP).size(), is(0));

    assertThat(flow(results, "left").size(), is(0));
    assertThat(flow(results, "right").size(), is(0));
    assertThat(flow(results, "last").size(), is(0));
  }
 /**
  * Executes batch with simulation mode.
  *
  * @throws Exception if failed
  */
 @Test
 public void executeBatch_sim() throws Exception {
   ProfileBuilder prf = new ProfileBuilder(folder.getRoot());
   prf.setInvalid();
   ExecutionTask task = prf.task();
   task.setRuntimeContext(RuntimeContext.DEFAULT.mode(ExecutionMode.SIMULATION));
   task.executeBatch("batch");
 }
  /**
   * Executes batch.
   *
   * @throws Exception if failed
   */
  @Test
  public void executeBatch() throws Exception {
    ProfileBuilder prf = new ProfileBuilder(folder.getRoot());
    ExecutionTask task = prf.task();
    task.executeBatch("batch");

    List<Record> results = SerialExecutionTracker.get(prf.trackingId);
    checkFlowHappensBefore(results, "testing", "left");
    checkFlowHappensBefore(results, "testing", "right");
    checkFlowHappensBefore(results, "left", "last");
    checkFlowHappensBefore(results, "right", "last");
    verifyPhaseOrder(results);

    assertThat(phase(results, "testing", ExecutionPhase.SETUP).size(), is(2));
    assertThat(phase(results, "testing", ExecutionPhase.INITIALIZE).size(), is(1));
    assertThat(phase(results, "testing", ExecutionPhase.IMPORT).size(), is(2));
    assertThat(phase(results, "testing", ExecutionPhase.PROLOGUE).size(), is(1));
    assertThat(phase(results, "testing", ExecutionPhase.MAIN).size(), is(4));
    assertThat(phase(results, "testing", ExecutionPhase.EPILOGUE).size(), is(1));
    assertThat(phase(results, "testing", ExecutionPhase.EXPORT).size(), is(2));
    assertThat(phase(results, "testing", ExecutionPhase.FINALIZE).size(), is(2));
    assertThat(phase(results, "testing", ExecutionPhase.CLEANUP).size(), is(2));

    assertThat(phase(results, "left", ExecutionPhase.SETUP).size(), is(2));
    assertThat(phase(results, "left", ExecutionPhase.INITIALIZE).size(), is(0));
    assertThat(phase(results, "left", ExecutionPhase.IMPORT).size(), is(0));
    assertThat(phase(results, "left", ExecutionPhase.PROLOGUE).size(), is(0));
    assertThat(phase(results, "left", ExecutionPhase.MAIN).size(), is(1));
    assertThat(phase(results, "left", ExecutionPhase.EPILOGUE).size(), is(0));
    assertThat(phase(results, "left", ExecutionPhase.EXPORT).size(), is(0));
    assertThat(phase(results, "left", ExecutionPhase.FINALIZE).size(), is(0));
    assertThat(phase(results, "left", ExecutionPhase.CLEANUP).size(), is(2));

    assertThat(phase(results, "right", ExecutionPhase.SETUP).size(), is(2));
    assertThat(phase(results, "right", ExecutionPhase.INITIALIZE).size(), is(0));
    assertThat(phase(results, "right", ExecutionPhase.IMPORT).size(), is(0));
    assertThat(phase(results, "right", ExecutionPhase.PROLOGUE).size(), is(0));
    assertThat(phase(results, "right", ExecutionPhase.MAIN).size(), is(1));
    assertThat(phase(results, "right", ExecutionPhase.EPILOGUE).size(), is(0));
    assertThat(phase(results, "right", ExecutionPhase.EXPORT).size(), is(0));
    assertThat(phase(results, "right", ExecutionPhase.FINALIZE).size(), is(0));
    assertThat(phase(results, "right", ExecutionPhase.CLEANUP).size(), is(2));

    assertThat(phase(results, "last", ExecutionPhase.SETUP).size(), is(2));
    assertThat(phase(results, "last", ExecutionPhase.INITIALIZE).size(), is(0));
    assertThat(phase(results, "last", ExecutionPhase.IMPORT).size(), is(0));
    assertThat(phase(results, "last", ExecutionPhase.PROLOGUE).size(), is(0));
    assertThat(phase(results, "last", ExecutionPhase.MAIN).size(), is(1));
    assertThat(phase(results, "last", ExecutionPhase.EPILOGUE).size(), is(0));
    assertThat(phase(results, "last", ExecutionPhase.EXPORT).size(), is(0));
    assertThat(phase(results, "last", ExecutionPhase.FINALIZE).size(), is(0));
    assertThat(phase(results, "last", ExecutionPhase.CLEANUP).size(), is(2));
  }
  /**
   * Executes batch but some flows are skipped.
   *
   * @throws Exception if failed
   */
  @Test
  public void executeBatch_seriaize() throws Exception {
    ProfileBuilder prf = new ProfileBuilder(folder.getRoot());
    prf.setTracker(FlowSerialized.class);
    ExecutionTask task = prf.task();
    task.setSerializeFlows(true);
    task.executeBatch("batch");

    List<Record> results = SerialExecutionTracker.get(prf.trackingId);
    checkFlowHappensBefore(results, "testing", "left");
    checkFlowHappensBefore(results, "testing", "right");
    checkFlowHappensBefore(results, "left", "last");
    checkFlowHappensBefore(results, "right", "last");
    verifyPhaseOrder(results);
  }