package com.thinkbiganalytics.scheduler; /*- * #%L * thinkbig-scheduler-quartz * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed 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. * #L% */ import com.thinkbiganalytics.scheduler.model.DefaultTriggerIdentifier; import com.thinkbiganalytics.scheduler.quartz.MockJob; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.internal.util.reflection.Whitebox; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerKey; import org.quartz.impl.JobDetailImpl; import org.quartz.impl.matchers.GroupMatcher; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TimeZone; import java.util.Vector; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.assertNotNull; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class QuartzSchedulerTest { QuartzScheduler toTest; @Mock QuartzClusterMessageSender clusterMessageSender; @Mock QuartzClusterMessageReceiver clusterMessageReceiver; @Mock JobIdentifier jobIdentifier; @Mock SchedulerFactoryBean schedulerFactoryBean; @Mock Scheduler scheduler; Runnable task = new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }; @Before public void before() { MockitoAnnotations.initMocks(this); when(schedulerFactoryBean.getScheduler()).thenReturn(scheduler); toTest = new QuartzScheduler(); toTest.schedulerFactoryBean = schedulerFactoryBean; Whitebox.setInternalState(toTest, "clusterMessageSender", clusterMessageSender); mockJobIdentifier("job-name", "group"); } @Test public void scheduleWithCronExpressionInTimeZoneTest() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleWithCronExpressionInTimeZone(jobIdentifier, task, "0 0 12 * * ?", TimeZone.getTimeZone("UTC")); verify(jobIdentifier).getName(); verify(jobIdentifier, times(2)).getGroup(); } @Test public void scheduleTest() throws Exception { mockJobIdentifier("job-name", "group"); toTest.schedule(jobIdentifier, task, new Date()); verify(scheduler).scheduleJob((JobDetail) any(), (Trigger) any()); } @Test public void scheduleAtFixedRateTest() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleAtFixedRate(jobIdentifier, task, 1l); verify(scheduler).scheduleJob((JobDetail) any(), (Trigger) any()); } @Test public void scheduleAtFixedRateTest2() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleAtFixedRate(jobIdentifier, task, new Date(), 1l); verify(scheduler).scheduleJob((JobDetail) any(), (Trigger) any()); } @Test public void startSchedulerTest() throws Exception { toTest.startScheduler(); verify(scheduler).start(); doThrow(new SchedulerException()).when(scheduler).start(); try { toTest.startScheduler(); } catch (final JobSchedulerException e) { return; } fail(); } @Test public void pauseSchedulerTest() throws Exception { toTest.pauseScheduler(); verify(scheduler).standby(); doThrow(new SchedulerException()).when(scheduler).standby(); try { toTest.pauseScheduler(); } catch (final JobSchedulerException e) { return; } fail(); } @Test public void triggerJobTest() throws Exception { mockJobIdentifier("job-name", "group"); toTest.triggerJob(jobIdentifier); verify(scheduler).triggerJob(eq(new JobKey("job-name", "group"))); doThrow(new SchedulerException()).when(scheduler).triggerJob((JobKey) any()); try { toTest.triggerJob(jobIdentifier); } catch (final JobSchedulerException e) { return; } fail(); } @SuppressWarnings({"rawtypes", "unchecked"}) @Test public void pauseTriggersOnJobTest() throws Exception { mockJobIdentifier("job-name", "group"); final List list = new ArrayList<Trigger>(); addMockTrigger(list, "trigger-key-name", "trigger-key-name"); when(scheduler.getTriggersOfJob(eq(new JobKey("job-name", "group")))).thenReturn(list); toTest.pauseTriggersOnJob(jobIdentifier); verify(scheduler).pauseTrigger(eq(new TriggerKey("trigger-key-name", "trigger-key-name"))); doThrow(new SchedulerException()).when(scheduler).getTriggersOfJob((JobKey) any()); try { toTest.pauseTriggersOnJob(jobIdentifier); } catch (final JobSchedulerException e) { return; } fail(); } @SuppressWarnings({"rawtypes", "unchecked"}) @Test public void resumeTriggersOnJobTest() throws Exception { mockJobIdentifier("job-name", "group"); final List list = new ArrayList<Trigger>(); addMockTrigger(list, "trigger-key-name", "trigger-key-name"); when(scheduler.getTriggersOfJob(eq(new JobKey("job-name", "group")))).thenReturn(list); toTest.resumeTriggersOnJob(jobIdentifier); verify(scheduler).resumeTrigger(eq(new TriggerKey("trigger-key-name", "trigger-key-name"))); doThrow(new SchedulerException()).when(scheduler).getTriggersOfJob((JobKey) any()); try { toTest.resumeTriggersOnJob(jobIdentifier); } catch (final JobSchedulerException e) { return; } fail(); } @Test public void updateTriggerTest() throws Exception { toTest.updateTrigger(new DefaultTriggerIdentifier("trigger-key-name", "trigger-key-name"), "0 0 12 * * ?"); verify(scheduler).rescheduleJob(eq(new TriggerKey("trigger-key-name", "trigger-key-name")), (Trigger) any()); doThrow(new SchedulerException()).when(scheduler).rescheduleJob((TriggerKey) any(), (Trigger) any()); try { toTest.updateTrigger(new DefaultTriggerIdentifier("trigger-key-name", "trigger-key-name"), "0 0 12 * * ?"); } catch (final JobSchedulerException e) { return; } fail(); } @Test public void deleteJobTest() throws Exception { mockJobIdentifier("job-name", "group"); toTest.deleteJob(jobIdentifier); verify(scheduler).deleteJob(eq(new JobKey("job-name", "group"))); doThrow(new SchedulerException()).when(scheduler).deleteJob((JobKey) any()); try { toTest.deleteJob(jobIdentifier); } catch (final JobSchedulerException e) { return; } fail(); } @Test public void scheduleWithCronExpression() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleWithCronExpression(jobIdentifier, task, "0 0 12 * * ?"); verify(jobIdentifier).getName(); verify(jobIdentifier, times(2)).getGroup(); } @Test public void testGetJobs() throws Exception { Vector<String> jobGroupNames = new Vector<>(); jobGroupNames.add("group"); Mockito.when(scheduler.getJobGroupNames()).thenReturn(jobGroupNames); Set<JobKey> set = new HashSet<>(); set.add(new JobKey("name", "group")); Mockito.when(scheduler.getJobKeys((GroupMatcher) anyObject())).thenReturn(set); Mockito.when(scheduler.getJobDetail((JobKey) anyObject())).thenReturn(new JobDetailImpl("name", "group", MockJob.class)); List v = new Vector<>(); addMockTrigger(v, "name", "group"); Mockito.when(scheduler.getTriggerState((TriggerKey) Mockito.anyObject())).thenReturn(Trigger.TriggerState.BLOCKED); Mockito.when(scheduler.getTriggersOfJob((JobKey) anyObject())).thenReturn(v); assertTrue(toTest.getJobs().size() == 1); } @Test public void scheduleAtFixedDelayTest1() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleWithFixedDelay(jobIdentifier, task, 0l); verify(scheduler).scheduleJob((JobDetail) any(), (Trigger) any()); } @Test public void scheduleAtFixedRateWithDelayTest() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleAtFixedRateWithDelay(jobIdentifier, task, "run", new Date(), 1l, 1L); verify(scheduler).scheduleJob((JobDetail) any(), (Trigger) any()); } @Test public void scheduleAtFixedDelayTest2() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleWithFixedDelay(jobIdentifier, task, new Date(), 0l); verify(scheduler).scheduleJob((JobDetail) any(), (Trigger) any()); } @Test public void staticHelperTest() throws Exception { JobIdentifier identifier = QuartzScheduler.jobIdentifierForJobKey(new JobKey("job-name", "group")); JobKey jobKey = QuartzScheduler.jobKeyForJobIdentifier(identifier); assertEquals(jobKey.getName(), identifier.getName()); TriggerKey triggerKey = new TriggerKey("trigger-key-name", "trigger-key-name"); TriggerIdentifier triggerIdentifier = QuartzScheduler.triggerIdentifierForTriggerKey(triggerKey); triggerKey = QuartzScheduler.triggerKeyForTriggerIdentifier(triggerIdentifier); assertEquals(triggerKey.getName(), triggerIdentifier.getName()); } @Test public void buildTriggerInfo() throws Exception { JobDetailImpl detail = new JobDetailImpl(); detail.setName("job-name"); JobInfo info = toTest.buildJobInfo(detail); assertNotNull(info); } @Test public void scheduleAtFixedDelayTest3() throws Exception { mockJobIdentifier("job-name", "group"); toTest.scheduleWithFixedDelay(jobIdentifier, task, "run", new Date(), 0l); verify(scheduler).scheduleJob((JobDetail) any(), (Trigger) any()); } @Test public void controlTests() throws Exception { toTest.pauseAll(); toTest.resumeAll(); toTest.getMetaData(); } @Test public void existsTests() throws Exception { Set<JobKey> set = new HashSet<>(); set.add(new JobKey("name", "group")); Mockito.when(scheduler.getJobKeys((GroupMatcher) anyObject())).thenReturn(set); toTest.jobExists(jobIdentifier); TriggerIdentifier triggerIdentifer = new DefaultTriggerIdentifier("trigger-key-name", "trigger-key-name"); toTest.triggerExists(triggerIdentifer); toTest.resumeAll(); toTest.getMetaData(); } private void mockJobIdentifier(String jobName, String groupName) { when(jobIdentifier.getName()).thenReturn(jobName); when(jobIdentifier.getGroup()).thenReturn(groupName); } @SuppressWarnings({"unchecked", "rawtypes"}) private void addMockTrigger(final List list, String triggerKeyName, String triggerKeyGroup) { final Trigger trigger = mock(Trigger.class); final TriggerKey triggerKey = new TriggerKey(triggerKeyName, triggerKeyGroup); when(trigger.getKey()).thenReturn(triggerKey); list.add(trigger); } }