package er.quartzscheduler.foundation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Set;
import org.junit.Test;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSDictionary;
import er.quartzscheduler.util.ERQSSchedulerFP4Test;
public class ERQSJobSupervisorTest {
@Test
public void testBuildTriggerName() throws SchedulerException
{
ERQSJobSupervisor js = new ERQSJobSupervisor();
String name = js.buildTriggerName("name");
assertEquals(name, "name" + ERQSJobSupervisor.TRIGGER_SUFFIX);
}
@Test
public void testBuildGroup() throws SchedulerException
{
ERQSJobSupervisor js = new ERQSJobSupervisor();
String group = js.buildGroup("group");
assertEquals(group, ERQSJobSupervisor.GROUP_NAME_PREFIX + "group");
group = js.buildGroup(null);
assertEquals(group, ERQSJobSupervisor.GROUP_NAME_PREFIX + Scheduler.DEFAULT_GROUP);
}
@Test
public void testIsJobDescriptionValid() throws SchedulerException
{
ERQSJobSupervisor js = new ERQSJobSupervisor();
ERQSJobDescription4Test jd = new ERQSJobDescription4Test();
jd.setClassPath("er.quartzscheduler.foundation.ERQSJobSupervisor");
jd.setName(null);
js.isJobDescriptionValid(jd);
assertFalse(js.isJobDescriptionValid(jd));
jd = new ERQSJobDescription4Test();
jd.setClassPath("er.quartzscheduler.foundation.ERQSJobSupervisor");
jd.setGroup(null);
assertTrue(js.isJobDescriptionValid(jd));
jd = new ERQSJobDescription4Test();
jd.setClassPath("er.quartzscheduler.foundation.ERQSJobSupervisor");
jd.setCronExpression(null); // A null cron expression is valid
assertTrue(js.isJobDescriptionValid(jd));
jd = new ERQSJobDescription4Test();
jd.setClassPath(null);
assertFalse(js.isJobDescriptionValid(jd));
}
@Test
public void testGetClassString() throws SchedulerException
{
ERQSJobSupervisor js = new ERQSJobSupervisor();
Class<? extends ERQSJob> aClass = (Class<? extends ERQSJob>) js.getClass("er.quartzscheduler.foundation.ERQSJobSupervisor");
assertEquals(ERQSJobSupervisor.class, aClass);
}
@Test
public void testBuildJobDetail() throws SchedulerException
{
ERQSJobExecutionContext4Test jec = new ERQSJobExecutionContext4Test(true);
ERQSSchedulerFP4Test fp = new ERQSSchedulerFP4Test();
jec.setSchedulerFP(fp);
ERQSJobSupervisor js = new ERQSJobSupervisor();
js.execute(jec);
ERQSJobDescription4Test jd = new ERQSJobDescription4Test();
jd.setIsEnterpriseObject(false);
jd.setClassPath("er.quartzscheduler.foundation.ERQSJobSupervisor");
jd.setCronExpression("0 0 12 * * ?");
JobDetail job = js.buildJobDetail(jd);
assertNotNull(job);
}
@Test
public void testBuildTrigger() throws SchedulerException
{
ERQSJobExecutionContext4Test jec = new ERQSJobExecutionContext4Test(true);
ERQSSchedulerFP4Test fp = new ERQSSchedulerFP4Test();
jec.setSchedulerFP(fp);
ERQSJobSupervisor js = new ERQSJobSupervisor();
js.execute(jec);
ERQSJobDescription4Test jd = new ERQSJobDescription4Test();
jd.setIsEnterpriseObject(false);
jd.setClassPath("er.quartzscheduler.foundation.ERQSJobSupervisor");
jd.setCronExpression("0 0 12 * * ?");
JobDetail job = js.buildJobDetail(jd);
Trigger t = js.buildTrigger(jd.name, jd.group, jd.cronExpression(), new JobDataMap(), job);
assertNotNull(t);
}
@Test
public void testExecute() throws SchedulerException
{
ERQSJobExecutionContext4Test jec = new ERQSJobExecutionContext4Test(true);
ERQSSchedulerFP4Test fp = new ERQSSchedulerFP4Test();
jec.setSchedulerFP(fp);
ERQSJobSupervisor js = new ERQSJobSupervisor();
js.execute(jec);
assertNotNull(js.getSchedulerFPInstance());
assertNotNull(js.getJobContext());
}
@Test
public void testBuildTriggerForJob() throws SchedulerException
{
ERQSJobExecutionContext4Test jec = new ERQSJobExecutionContext4Test(true);
ERQSSchedulerFP4Test fp = new ERQSSchedulerFP4Test();
jec.setSchedulerFP(fp);
ERQSJobSupervisor js = new ERQSJobSupervisor();
js.execute(jec);
ERQSJobDescription4Test jd = new ERQSJobDescription4Test();
// We use a NSDictionary because there is a constructor easy to use
jd.setJobInfos(new NSDictionary<>("Value", "key"));
jd.setIsEnterpriseObject(false);
jd.setClassPath("er.quartzscheduler.foundation.ERQSJobSupervisor");
jd.setCronExpression("0 0 12 * * ?");
JobDetail job = js.buildJobDetail(jd);
assertEquals(job.getJobDataMap().getString("key"), "Value");
Trigger t = js.buildTriggerForJob(jd, job);
assertNotNull(t);
}
/**
* We need to test add and remove in the same test because when the scheduler is created, it's a singleton that remains in
* memory until the last test is executed.
*
* @throws SchedulerException
*/
@Test
public void testAddAndRemoveJob2Scheduler() throws SchedulerException
{
ERQSJobExecutionContext4Test jec = new ERQSJobExecutionContext4Test(true);
ERQSSchedulerFP4Test fp = new ERQSSchedulerFP4Test();
jec.setSchedulerFP(fp);
ERQSJobSupervisor js = new ERQSJobSupervisor();
js.execute(jec);
ERQSJobDescription4Test jd = new ERQSJobDescription4Test();
jd.setClassPath("er.quartzscheduler.foundation.ERQSExtendedAbstractJob4Test");
jd.setCronExpression("0 0 12 * * ?");
jd.setIsEnterpriseObject(false);
js.addJob2Scheduler(jd);
JobKey aJobKey = new JobKey(ERQSJobDescription4Test.DEF_JOB_NAME, ERQSJobSupervisor.GROUP_NAME_PREFIX + ERQSJobDescription4Test.DEF_GROUP_NAME);
JobDetail job = fp.getScheduler().getJobDetail(aJobKey);
assertNotNull(job);
Set<JobKey> aSet = js.getScheduledJobKeys();
assertTrue(aSet.size() == 1);
ERQSJobDescription4Test newJd = new ERQSJobDescription4Test();
newJd.setName("newName");
NSArray<ERQSJobDescription> newJobsList = new NSArray<>(newJd);
// As the the new list of jobs doesn't contain the previous one, it must be removed.
js.removeObsoleteJobs(newJobsList);
aSet = js.getScheduledJobKeys();
assertTrue(aSet.size() == 0);
}
/**
* We need to test add and remove in the same test because when the scheduler is created, it's a singleton that remains in
* memory until the last test is executed.<p>
* Not the best option.
*
* @throws SchedulerException
*/
@Test
public void testJobs2AddOrModify() throws SchedulerException
{
ERQSJobExecutionContext4Test jec = new ERQSJobExecutionContext4Test(true);
ERQSSchedulerFP4Test fp = new ERQSSchedulerFP4Test();
jec.setSchedulerFP(fp);
ERQSJobSupervisor js = new ERQSJobSupervisor();
js.execute(jec);
ERQSJobDescription4Test jd1 = new ERQSJobDescription4Test();
jd1.setName("jd1");
jd1.setClassPath("er.quartzscheduler.foundation.ERQSExtendedAbstractJob4Test");
jd1.setCronExpression("0 0 12 * * ?");
jd1.setIsEnterpriseObject(false);
ERQSJobDescription4Test jd2 = new ERQSJobDescription4Test();
jd2.setName("jd2");
jd2.setClassPath("er.quartzscheduler.foundation.ERQSExtendedAbstractJob4Test");
jd2.setCronExpression("0 0 12 * * ?");
jd2.setIsEnterpriseObject(false);
NSArray<ERQSJobDescription> jds = new NSArray<>(new ERQSJobDescription4Test[] {jd1, jd2});
js.addOrModifyJobs(jds);
Set<JobKey> aSet = js.getScheduledJobKeys();
assertTrue(aSet.size() == 2);
jd2.setCronExpression("0 0 6 * * ?");
JobKey jobKey4jd2 = js.getJobKeyForJobDescription(jd2);
JobDetail job4jd2 = fp.getScheduler().getJobDetail(jobKey4jd2);
js.modifyJob(jd2, job4jd2);
List<? extends Trigger> triggers = fp.getScheduler().getTriggersOfJob(jobKey4jd2);
assertNotNull(triggers);
assertTrue(triggers.size() == 1);
CronTrigger aTrigger = (CronTrigger)triggers.get(0);
assertEquals(aTrigger.getCronExpression(), "0 0 6 * * ?");
jd2.setClassPath("er.quartzscheduler.foundation.ERQSJobSupervisor");
js.modifyJob(jd2, job4jd2);
job4jd2 = fp.getScheduler().getJobDetail(jobKey4jd2);
assertEquals("er.quartzscheduler.foundation.ERQSJobSupervisor", job4jd2.getJobClass().getName());
}
}