| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.sling.commons.scheduler.impl; |
| |
| import static org.apache.sling.commons.scheduler.Scheduler.VALUE_RUN_ON_LEADER; |
| import static org.apache.sling.commons.scheduler.Scheduler.VALUE_RUN_ON_SINGLE; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| import static org.mockito.Mockito.when; |
| |
| import java.io.Serializable; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.apache.sling.commons.scheduler.Job; |
| import org.apache.sling.commons.scheduler.JobContext; |
| import org.apache.sling.testing.mock.osgi.MockOsgi; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.mockito.Mock; |
| import org.mockito.runners.MockitoJUnitRunner; |
| import org.osgi.framework.BundleContext; |
| import org.quartz.JobDetail; |
| import org.quartz.JobExecutionContext; |
| import org.quartz.JobKey; |
| import org.quartz.SchedulerException; |
| |
| @RunWith(MockitoJUnitRunner.class) |
| public class QuartzJobExecutorTest { |
| private BundleContext context; |
| private QuartzJobExecutor jobExecutor; |
| private QuartzScheduler quartzScheduler; |
| private volatile boolean isRunnablePseudoJobCompleted; |
| |
| @Mock |
| private JobExecutionContext executionContext; |
| |
| @Before |
| public void setUp() throws Exception { |
| context = MockOsgi.newBundleContext(); |
| jobExecutor = new QuartzJobExecutor(); |
| |
| quartzScheduler = ActivatedQuartzSchedulerFactory.create(context, "testName"); |
| } |
| |
| @Test |
| public void testRunnableJob() throws SchedulerException, InterruptedException { |
| Thread job = new Thread(new SimpleRunnableJob()); |
| String jobName = "testName"; |
| Map<String, Serializable> jobConfig = new HashMap<String, Serializable>(); |
| |
| //Adding a job just to receive a JobDetail object which is needed for testing |
| quartzScheduler.addJob(1L, 1L, jobName, job, jobConfig, "0 * * * * ?", true); |
| |
| JobDetail jobDetail = quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(JobKey.jobKey(jobName)); |
| when(executionContext.getJobDetail()).thenReturn(jobDetail); |
| |
| isRunnablePseudoJobCompleted = false; |
| jobExecutor.execute(executionContext); |
| if (job.isAlive()) { |
| synchronized (job) { |
| if (job.isAlive()) { |
| job.join(); |
| } |
| } |
| } |
| assertTrue(isRunnablePseudoJobCompleted); |
| } |
| |
| @Test |
| public void testJob() throws SchedulerException { |
| Job job = new SimpleJob(); |
| String jobName = "testName"; |
| Map<String, Serializable> jobConfig = new HashMap<String, Serializable>(); |
| |
| //Adding a job just to receive a JobDetail object which is needed for testing |
| quartzScheduler.addJob(1L, 1L, jobName, job, jobConfig, "0 * * * * ?", true); |
| |
| JobDetail jobDetail = quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(JobKey.jobKey(jobName)); |
| when(executionContext.getJobDetail()).thenReturn(jobDetail); |
| |
| isRunnablePseudoJobCompleted = false; |
| jobExecutor.execute(executionContext); |
| assertTrue(isRunnablePseudoJobCompleted); |
| } |
| |
| @Test |
| public void testJobNotExecuted() throws SchedulerException { |
| Job job = new SimpleJob(); |
| String jobName = "testName"; |
| Map<String, Serializable> jobConfig = new HashMap<String, Serializable>(); |
| |
| //Adding a job just to receive a JobDetail object which is needed for testing |
| quartzScheduler.addJob(1L, 1L, jobName, job, jobConfig, "0 * * * * ?", true); |
| |
| JobDetail jobDetail = quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(JobKey.jobKey(jobName)); |
| when(executionContext.getJobDetail()).thenReturn(jobDetail); |
| //Job with this config should not be executed |
| jobDetail.getJobDataMap().put(QuartzScheduler.DATA_MAP_RUN_ON, new String[]{VALUE_RUN_ON_LEADER}); |
| |
| isRunnablePseudoJobCompleted = false; |
| jobExecutor.execute(executionContext); |
| assertFalse(isRunnablePseudoJobCompleted); |
| } |
| |
| @Test |
| public void testJobNotExecutedWithTwoRunOnParams() throws SchedulerException { |
| Job job = new SimpleJob(); |
| String jobName = "testName"; |
| Map<String, Serializable> jobConfig = new HashMap<String, Serializable>(); |
| |
| //Adding a job just to receive a JobDetail object which is needed for testing |
| quartzScheduler.addJob(1L, 1L, jobName, job, jobConfig, "0 * * * * ?", true); |
| |
| JobDetail jobDetail = quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(JobKey.jobKey(jobName)); |
| when(executionContext.getJobDetail()).thenReturn(jobDetail); |
| //Job with this config should not be executed |
| jobDetail.getJobDataMap().put(QuartzScheduler.DATA_MAP_RUN_ON, |
| new String[]{VALUE_RUN_ON_LEADER, VALUE_RUN_ON_SINGLE}); |
| QuartzJobExecutor.SLING_ID = "ANY STRING NOT EQUAL TO OF VALUE_RUN_ON_LEADER OR" + |
| "VALUE_RUN_ON_SINGLE JUST A TEST CASE, NOTHING MORE"; |
| |
| isRunnablePseudoJobCompleted = false; |
| jobExecutor.execute(executionContext); |
| assertFalse(isRunnablePseudoJobCompleted); |
| } |
| |
| @Test |
| public void testJobExecutedWithTwoRunOnParams() throws SchedulerException { |
| Job job = new SimpleJob(); |
| String jobName = "testName"; |
| Map<String, Serializable> jobConfig = new HashMap<String, Serializable>(); |
| |
| //Adding a job just to receive a JobDetail object which is needed for testing |
| quartzScheduler.addJob(1L, 1L, jobName, job, jobConfig, "0 * * * * ?", true); |
| |
| JobDetail jobDetail = quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(JobKey.jobKey(jobName)); |
| when(executionContext.getJobDetail()).thenReturn(jobDetail); |
| //Job with this config should not be executed |
| jobDetail.getJobDataMap().put(QuartzScheduler.DATA_MAP_RUN_ON, |
| new String[]{VALUE_RUN_ON_LEADER, VALUE_RUN_ON_SINGLE}); |
| //In this case, when SLING_ID is equal to one of values above |
| //Job should be executed |
| QuartzJobExecutor.SLING_ID = VALUE_RUN_ON_SINGLE; |
| |
| isRunnablePseudoJobCompleted = false; |
| jobExecutor.execute(executionContext); |
| assertTrue(isRunnablePseudoJobCompleted); |
| } |
| |
| @Test |
| public void testReferences() { |
| String testName = "testName"; |
| Map<String, Serializable> testMap = new HashMap<String, Serializable>(); |
| QuartzJobExecutor.JobContextImpl underTest = new QuartzJobExecutor.JobContextImpl(testName, testMap); |
| |
| assertTrue(underTest.getConfiguration().equals(testMap)); |
| assertTrue(underTest.getName().equals(testName)); |
| } |
| |
| @Test |
| public void testLazyScheduler() { |
| assertTrue(quartzScheduler.getSchedulers().isEmpty()); |
| } |
| |
| @After |
| public void deactivateScheduler() { |
| quartzScheduler.deactivate(context); |
| } |
| |
| private class SimpleJob implements Job { |
| @Override |
| public void execute(JobContext context) { |
| isRunnablePseudoJobCompleted = true; |
| } |
| } |
| |
| private class SimpleRunnableJob implements Runnable { |
| @Override |
| public void run() { |
| isRunnablePseudoJobCompleted = true; |
| } |
| } |
| |
| } |