diff --git a/source/test-java/org/alfresco/util/CronTriggerBeanTest.java b/source/test-java/org/alfresco/util/CronTriggerBeanTest.java index aafcc95ff0..ee8a86b0cb 100644 --- a/source/test-java/org/alfresco/util/CronTriggerBeanTest.java +++ b/source/test-java/org/alfresco/util/CronTriggerBeanTest.java @@ -2,7 +2,7 @@ package org.alfresco.util; import static org.junit.Assert.*; -import java.util.ArrayList; +import java.util.*; import org.junit.After; import org.junit.AfterClass; @@ -22,7 +22,7 @@ public class CronTriggerBeanTest { private ClassPathXmlApplicationContext ctx; private Scheduler scheduler; - private static ArrayList dummyJobRuns; + private static Map> dummyJobRuns; @BeforeClass public static void setUpBeforeClass() throws Exception { @@ -34,7 +34,7 @@ public class CronTriggerBeanTest { @Before public void setUp() throws Exception { - dummyJobRuns = new ArrayList<>(); + dummyJobRuns = new HashMap>(); this.ctx = null; this.scheduler = null; } @@ -56,39 +56,43 @@ public class CronTriggerBeanTest { @Test public void testCodedCronTriggerBean() throws Exception { - assertEquals(0, dummyJobRuns.size()); + final String JOB_NAME = "codedCronJob"; + List jobRuns = this.getRunList(JOB_NAME); + assertEquals(0, jobRuns.size()); scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); CronTriggerBean ctBean = new CronTriggerBean(); ctBean.setBeanName("Dummy"); ctBean.setCronExpression("0/1 * * * * ? *"); ctBean.setEnabled(true); - JobDetail jobDetail = new JobDetail("DummyJob", "DefaultGroup", DummyJob.class); + JobDetail jobDetail = new JobDetail(JOB_NAME, "DefaultGroup", DummyJob.class); ctBean.setJobDetail(jobDetail); ctBean.setScheduler(scheduler); ctBean.afterPropertiesSet(); Thread.sleep(1000); - int runs = dummyJobRuns.size(); + int runs = jobRuns.size(); assertTrue(runs > 0); scheduler.shutdown(); Thread.sleep(1000); - assertEquals(runs, dummyJobRuns.size()); + assertEquals(runs, jobRuns.size()); Thread.sleep(1000); - assertEquals(runs, dummyJobRuns.size()); + assertEquals(runs, jobRuns.size()); } @Test public void testCodedDelayedCronTriggerBean() throws Exception { - assertEquals(0, dummyJobRuns.size()); + final String JOB_NAME = "codedDelayedCronJob"; + List jobRuns = this.getRunList(JOB_NAME); + assertEquals(0, jobRuns.size()); Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); CronTriggerBean ctBean = new CronTriggerBean(); ctBean.setBeanName("Dummy"); ctBean.setCronExpression("0/1 * * * * ? *"); ctBean.setEnabled(true); - JobDetail jobDetail = new JobDetail("DummyJob", "DefaultGroup", DummyJob.class); + JobDetail jobDetail = new JobDetail(JOB_NAME, "DefaultGroup", DummyJob.class); ctBean.setJobDetail(jobDetail); ctBean.setScheduler(scheduler); final long START_DELAY = 4000L; @@ -97,49 +101,95 @@ public class CronTriggerBeanTest { // It should not have run during the delay. Give a second precision leeway Thread.sleep(START_DELAY - 1000); - assertEquals(0, dummyJobRuns.size()); + assertEquals(0, jobRuns.size()); // It should have had a chance to run after the delay Thread.sleep(1000); - int runs = dummyJobRuns.size(); + int runs = jobRuns.size(); assertTrue(runs > 0); // It should not have run again after shutdown scheduler.shutdown(); Thread.sleep(1000); - assertEquals(runs, dummyJobRuns.size()); + assertEquals(runs, jobRuns.size()); // Indeed after another second, it should not have changed. Thread.sleep(1000); - assertEquals(runs, dummyJobRuns.size()); + assertEquals(runs, jobRuns.size()); } @Test - public void testConfiguredCronTriggerBean() throws BeansException, - Exception { - assertEquals(0, dummyJobRuns.size()); + public void testConfiguredDelayedCronTriggerBean() throws BeansException, Exception { + final String JOB_NAME = "configuredDelayedCronJob"; + List jobRuns = this.getRunList(JOB_NAME); + assertEquals(0, jobRuns.size()); ctx = new ClassPathXmlApplicationContext( "alfresco/scheduler-core-context.xml", "org/alfresco/util/test-scheduled-jobs-context.xml"); - CronTriggerBean ctBean = ctx.getBean(CronTriggerBean.class); + CronTriggerBean ctBean = ctx.getBean("cronTriggerBeanDelayed", CronTriggerBean.class); scheduler = ctBean.getScheduler(); scheduler.start(); + // It should not have run during the delay. Give a second precision leeway + final long START_DELAY = ctBean.getStartDelay(); + Thread.sleep(START_DELAY - 1000); + assertEquals(0, jobRuns.size()); + // After the interval, there should be at least one run - final long INTERVAL = 2000L; + final long INTERVAL = 1000L; Thread.sleep(INTERVAL); - int runs = dummyJobRuns.size(); + int runs = jobRuns.size(); assertTrue(runs > 0); // When the context closes, the scheduler should close, thereby stopping the job ctx.close(); Thread.sleep(INTERVAL); - assertEquals(runs, dummyJobRuns.size()); + assertEquals(runs, jobRuns.size()); Thread.sleep(INTERVAL); - assertEquals(runs, dummyJobRuns.size()); + assertEquals(runs, jobRuns.size()); + } + + @Test + public void testConfiguredCronTriggerBean() throws BeansException, Exception { + final String JOB_NAME = "configuredCronJob"; + List jobRuns = this.getRunList(JOB_NAME); + assertEquals(0, jobRuns.size()); + ctx = new ClassPathXmlApplicationContext( + "alfresco/scheduler-core-context.xml", + "org/alfresco/util/test-scheduled-jobs-context.xml"); + CronTriggerBean ctBean = ctx.getBean("cronTriggerBean", CronTriggerBean.class); + scheduler = ctBean.getScheduler(); + scheduler.start(); + + // After the interval, there should be at least one run + final long INTERVAL = 1000L; + Thread.sleep(INTERVAL); + int runs = jobRuns.size(); + assertTrue(runs > 0); + + // When the context closes, the scheduler should close, thereby stopping the job + ctx.close(); + Thread.sleep(INTERVAL); + assertEquals(runs, jobRuns.size()); + Thread.sleep(INTERVAL); + assertEquals(runs, jobRuns.size()); } public static class DummyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { long now = System.currentTimeMillis(); - dummyJobRuns.add(now); + ArrayList runs = dummyJobRuns.get(context.getJobDetail().getName()); + if (runs == null) { + runs = new ArrayList(); + dummyJobRuns.put(context.getJobDetail().getName(), runs); + } + runs.add(now); } } + + private List getRunList(String jobName) { + ArrayList runs = dummyJobRuns.get(jobName); + if (runs == null) { + runs = new ArrayList(); + dummyJobRuns.put(jobName, runs); + } + return runs; + } } diff --git a/source/test-resources/org/alfresco/util/test-scheduled-jobs-context.xml b/source/test-resources/org/alfresco/util/test-scheduled-jobs-context.xml index 0e96fd54f7..fa000e6ee0 100644 --- a/source/test-resources/org/alfresco/util/test-scheduled-jobs-context.xml +++ b/source/test-resources/org/alfresco/util/test-scheduled-jobs-context.xml @@ -3,13 +3,21 @@ + + + org.alfresco.util.CronTriggerBeanTest$DummyJob + + + configuredDelayedCronJob + + org.alfresco.util.CronTriggerBeanTest$DummyJob - dummy + configuredCronJob @@ -45,12 +53,31 @@ - 0/2 * * * * ? + 0/1 * * * * ? dummyTriggerBean - - + + + + + + + + + + + 0/1 * * * * ? + + + dummyTriggerBeanDelayed + + + 4000 + + + +