blob: 7bb674ccc331d31e4b229eb43270298218e0f4d7 [file] [log] [blame]
/*
* 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.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.lang.reflect.Field;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import java.util.Set;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.testing.mock.osgi.MockOsgi;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.quartz.impl.matchers.GroupMatcher;
public class WhiteboardHandlerTest {
private WhiteboardHandler handler;
private BundleContext context;
private QuartzScheduler quartzScheduler;
@Before
public void setUp() throws Exception {
context = MockOsgi.newBundleContext();
handler = new WhiteboardHandler();
//Getting private field through injection
Field schedulerField = WhiteboardHandler.class.getDeclaredField("scheduler");
schedulerField.setAccessible(true);
// Creating quartz scheduler for private field and activating it
quartzScheduler = ActivatedQuartzSchedulerFactory.create(context, "testName");
//Injecting quartzScheduler to WhiteboardHandler
schedulerField.set(handler, quartzScheduler);
}
@Test
public void testAddingService() throws SchedulerException {
Thread service = new Thread();
String schedulerName = "testScheduler";
Long period = 1L;
Integer times = 2;
Dictionary<String, Object> serviceProps = new Hashtable<>();
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_RUN_ON, Scheduler.VALUE_RUN_ON_LEADER);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_CONCURRENT, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_IMMEDIATE, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_NAME, schedulerName);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_PERIOD, period);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_TIMES, times);
serviceProps.put(Constants.SERVICE_PID, "1");
serviceProps.put(Constants.SERVICE_ID, 1L);
final ServiceRegistration<?> reg = context.registerService(Runnable.class.getName(), service, serviceProps);
final ServiceReference<?> reference = reg.getReference();
handler.register(reference, service);
JobKey jobKey = JobKey.jobKey(schedulerName);
assertNotNull(quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(jobKey));
}
@Test
public void testUnregisterService() throws SchedulerException {
Thread service = new Thread();
String schedulerName = "testScheduler";
Long period = 1L;
Integer times = 2;
Dictionary<String, Object> serviceProps = new Hashtable<>();
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_RUN_ON, Scheduler.VALUE_RUN_ON_LEADER);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_EXPRESSION, "0 * * * * ?");
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_CONCURRENT, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_IMMEDIATE, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_NAME, schedulerName);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_PERIOD, period);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_TIMES, times);
serviceProps.put(Constants.SERVICE_PID, "1");
serviceProps.put(Constants.SERVICE_ID, 1L);
//Register service only to get a reference of it.
//This reference is needed to test our method.
final ServiceRegistration<?> reg = context.registerService(Runnable.class.getName(), service, serviceProps);
ServiceReference<?> reference = reg.getReference();
handler.register(reference, service);
JobKey jobKey = JobKey.jobKey(schedulerName);
assertNotNull(quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(jobKey));
reg.unregister();
handler.unregister(reference);
assertNull(quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(jobKey));
}
// SLING-7037
@Test
public void testAddingServiceWithProvidedName() throws SchedulerException {
Thread service = new Thread();
String schedulerName = "testScheduler";
Long period = 1L;
Integer times = 2;
Dictionary<String, Object> serviceProps = new Hashtable<>();
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_RUN_ON, Scheduler.VALUE_RUN_ON_LEADER);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_CONCURRENT, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_IMMEDIATE, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_NAME, schedulerName);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_PERIOD, period);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_TIMES, times);
serviceProps.put(Constants.SERVICE_PID, "1");
final ServiceRegistration<?> reg = context.registerService(Runnable.class.getName(), service, serviceProps);
final ServiceReference<?> reference = reg.getReference();
handler.register(reference, service);
JobKey jobKey = JobKey.jobKey(schedulerName);
JobDetail jobDetail = quartzScheduler.getSchedulers().get("testName").getScheduler().getJobDetail(jobKey);
assertNotNull(jobDetail);
assertEquals(schedulerName, jobDetail.getJobDataMap().getString(QuartzScheduler.DATA_MAP_PROVIDED_NAME));
assertEquals(schedulerName,
jobDetail.getJobDataMap().getString(QuartzScheduler.DATA_MAP_NAME));
}
@Test
public void testAddingServiceWithoutProvidedName() throws SchedulerException {
Thread service = new Thread();
Long period = 1L;
Integer times = 2;
Dictionary<String, Object> serviceProps = new Hashtable<>();
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_RUN_ON, Scheduler.VALUE_RUN_ON_LEADER);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_CONCURRENT, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_IMMEDIATE, Boolean.FALSE);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_PERIOD, period);
serviceProps.put(Scheduler.PROPERTY_SCHEDULER_TIMES, times);
serviceProps.put(Constants.SERVICE_PID, "1");
final ServiceRegistration<?> reg = context.registerService(Runnable.class.getName(), service, serviceProps);
final ServiceReference<?> reference = reg.getReference();
handler.register(reference, service);
JobDetail jobDetail = null;
org.quartz.Scheduler scheduler = quartzScheduler.getSchedulers().get("testName").getScheduler();
final List<String> groups = scheduler.getJobGroupNames();
for(final String group : groups) {
final Set<JobKey> keys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(group));
for(final JobKey key : keys) {
final JobDetail detail = scheduler.getJobDetail(key);
if ( detail != null && detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_SERVICE_ID).equals(reg.getReference().getProperty(Constants.SERVICE_ID))) {
jobDetail = detail;
break;
}
}
}
assertNotNull(jobDetail);
assertNull(jobDetail.getJobDataMap().getString(QuartzScheduler.DATA_MAP_PROVIDED_NAME));
assertNotNull(jobDetail.getJobDataMap().getString(QuartzScheduler.DATA_MAP_NAME));
}
@After
public void deactivateScheduler() {
quartzScheduler.deactivate(context);
}
}