@Test(expected = ScheduleException.class)
  public void testInvalidCronSchedule() throws Exception {
    expect(cronScheduler.isValidSchedule(job.getCronSchedule())).andReturn(false);

    control.replay();

    cron.receiveJob(sanitizedConfiguration);
  }
  @Test
  public void testInvalidStoredJob() throws Exception {
    // Invalid jobs are left alone, but doesn't halt operation.

    expect(cronScheduler.startAsync()).andReturn(cronScheduler);
    cronScheduler.awaitRunning();
    shutdownRegistry.addAction(EasyMock.<ExceptionalCommand<?>>anyObject());

    IJobConfiguration jobA =
        IJobConfiguration.build(makeJob().newBuilder().setCronSchedule("1 2 3 4 5 6 7"));
    IJobConfiguration jobB = IJobConfiguration.build(makeJob().newBuilder().setCronSchedule(null));

    expect(storageUtil.jobStore.fetchJobs(MANAGER_KEY)).andReturn(ImmutableList.of(jobA, jobB));
    expect(cronScheduler.isValidSchedule(jobA.getCronSchedule())).andReturn(false);

    control.replay();

    cron.schedulerActive(new SchedulerActive());
  }
  @Test
  public void testRunOverlapLoadedSuccessfully() throws Exception {
    // Existing RUN_OVERLAP jobs should still load and map.

    expect(cronScheduler.startAsync()).andReturn(cronScheduler);
    cronScheduler.awaitRunning();
    shutdownRegistry.addAction(EasyMock.<ExceptionalCommand<?>>anyObject());

    IJobConfiguration jobA =
        IJobConfiguration.build(
            makeJob().newBuilder().setCronCollisionPolicy(CronCollisionPolicy.RUN_OVERLAP));

    expect(storageUtil.jobStore.fetchJobs(MANAGER_KEY)).andReturn(ImmutableList.of(jobA));
    expect(cronScheduler.isValidSchedule(jobA.getCronSchedule())).andReturn(true);
    expect(cronScheduler.schedule(eq(jobA.getCronSchedule()), EasyMock.<Runnable>anyObject()))
        .andReturn("keyA");

    control.replay();

    cron.schedulerActive(new SchedulerActive());
  }
 private void expectJobValidated(IJobConfiguration savedJob) {
   expect(cronScheduler.isValidSchedule(savedJob.getCronSchedule())).andReturn(true);
 }