/*
* ******************************************************************************
*
* Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com
*
* ******************************************************************************
*
* 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.
*
*/
package org.pentaho.platform.web.http.api.resources;
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.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.scheduler2.ComplexJobTrigger;
import org.pentaho.platform.api.scheduler2.CronJobTrigger;
import org.pentaho.platform.api.scheduler2.IJobTrigger;
import org.pentaho.platform.api.scheduler2.SimpleJobTrigger;
import org.pentaho.platform.api.scheduler2.recur.ITimeRecurrence;
import org.pentaho.platform.plugin.services.exporter.ScheduleExportUtil;
import org.pentaho.platform.scheduler2.quartz.QuartzScheduler;
import org.pentaho.platform.scheduler2.recur.QualifiedDayOfWeek;
import org.pentaho.platform.scheduler2.recur.RecurrenceList;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.TimeZone;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Created by rfellows on 11/9/15.
*/
@RunWith( MockitoJUnitRunner.class )
public class SchedulerResourceUtilTest {
@Mock JobScheduleRequest scheduleRequest;
@Mock QuartzScheduler scheduler;
@Mock SimpleJobTrigger simple;
@Mock RepositoryFile repo;
CronJobTrigger cron;
ComplexJobTriggerProxy complex;
Date now;
private TimeZone system;
@Before
public void setUp() throws Exception {
// this makes the test non-deterministic!
now = new Date();
complex = new ComplexJobTriggerProxy();
complex.setStartTime( now );
system = TimeZone.getDefault();
TimeZone.setDefault( TimeZone.getTimeZone( "EST" ) );
}
@After
public void tearDown() {
TimeZone.setDefault( system );
system = null;
}
@Test
public void testConvertScheduleRequestToJobTrigger_SimpleJobTrigger() throws Exception {
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertNotNull( trigger );
assertTrue( trigger instanceof SimpleJobTrigger );
assertTrue( trigger.getStartTime().getTime() > System.currentTimeMillis() );
}
@Test
public void testConvertScheduleRequestToJobTrigger_SimpleJobTrigger_basedOnExisting() throws Exception {
when( scheduleRequest.getSimpleJobTrigger() ).thenReturn( simple );
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertNotNull( trigger );
assertEquals( simple, trigger );
verify( simple ).setStartTime( any( Date.class ) );
}
@Test
public void testConvertScheduleRequestToJobTrigger_ComplexJobTrigger_daysOfMonth() throws Exception {
complex.setDaysOfMonth( new int[] { 1, 25 } );
when( scheduleRequest.getComplexJobTrigger() ).thenReturn( complex );
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertNotNull( trigger );
assertTrue( trigger instanceof ComplexJobTrigger );
ComplexJobTrigger trig = (ComplexJobTrigger) trigger;
List<ITimeRecurrence> recurrences = trig.getDayOfMonthRecurrences().getRecurrences();
assertEquals( 2, recurrences.size() );
RecurrenceList rec = (RecurrenceList) recurrences.get( 0 );
assertEquals( 1, rec.getValues().get( 0 ).intValue() );
rec = (RecurrenceList) recurrences.get( 1 );
assertEquals( 25, rec.getValues().get( 0 ).intValue() );
}
@Test
public void testConvertScheduleRequestToJobTrigger_ComplexJobTrigger_monthsOfYear() throws Exception {
complex.setMonthsOfYear( new int[] { 1, 8 } );
when( scheduleRequest.getComplexJobTrigger() ).thenReturn( complex );
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertNotNull( trigger );
assertTrue( trigger instanceof ComplexJobTrigger );
ComplexJobTrigger trig = (ComplexJobTrigger) trigger;
List<ITimeRecurrence> recurrences = trig.getMonthlyRecurrences().getRecurrences();
assertEquals( 2, recurrences.size() );
RecurrenceList rec = (RecurrenceList) recurrences.get( 0 );
assertEquals( 2, rec.getValues().get( 0 ).intValue() );
rec = (RecurrenceList) recurrences.get( 1 );
assertEquals( 9, rec.getValues().get( 0 ).intValue() );
}
@Test
public void testConvertScheduleRequestToJobTrigger_ComplexJobTrigger_years() throws Exception {
complex.setYears( new int[] { 2016, 2020 } );
when( scheduleRequest.getComplexJobTrigger() ).thenReturn( complex );
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertNotNull( trigger );
assertTrue( trigger instanceof ComplexJobTrigger );
ComplexJobTrigger trig = (ComplexJobTrigger) trigger;
List<ITimeRecurrence> recurrences = trig.getYearlyRecurrences().getRecurrences();
assertEquals( 2, recurrences.size() );
RecurrenceList rec = (RecurrenceList) recurrences.get( 0 );
assertEquals( 2016, rec.getValues().get( 0 ).intValue() );
rec = (RecurrenceList) recurrences.get( 1 );
assertEquals( 2020, rec.getValues().get( 0 ).intValue() );
}
@Test
public void testConvertScheduleRequestToJobTrigger_ComplexJobTrigger_daysOfWeek() throws Exception {
complex.setDaysOfWeek( new int[] { 1, 5 } );
when( scheduleRequest.getComplexJobTrigger() ).thenReturn( complex );
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertNotNull( trigger );
assertTrue( trigger instanceof ComplexJobTrigger );
ComplexJobTrigger trig = (ComplexJobTrigger) trigger;
List<ITimeRecurrence> recurrences = trig.getDayOfWeekRecurrences().getRecurrences();
assertEquals( 2, recurrences.size() );
RecurrenceList rec = (RecurrenceList) recurrences.get( 0 );
assertEquals( 2, rec.getValues().get( 0 ).intValue() );
rec = (RecurrenceList) recurrences.get( 1 );
assertEquals( 6, rec.getValues().get( 0 ).intValue() );
}
@Test
public void testConvertScheduleRequestToJobTrigger_ComplexJobTrigger_weeksOfMonth() throws Exception {
complex.setDaysOfWeek( new int[] { 1, 5 } );
complex.setWeeksOfMonth( new int[] { 3, 4 } );
when( scheduleRequest.getComplexJobTrigger() ).thenReturn( complex );
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertNotNull( trigger );
assertTrue( trigger instanceof ComplexJobTrigger );
ComplexJobTrigger trig = (ComplexJobTrigger) trigger;
List<ITimeRecurrence> recurrences = trig.getDayOfWeekRecurrences().getRecurrences();
assertEquals( 4, recurrences.size() );
QualifiedDayOfWeek rec = (QualifiedDayOfWeek) recurrences.get( 0 );
assertEquals( "MON", rec.getDayOfWeek().toString() );
assertEquals( "FOURTH", rec.getQualifier().toString() );
rec = (QualifiedDayOfWeek) recurrences.get( 1 );
assertEquals( "MON", rec.getDayOfWeek().toString() );
assertEquals( "LAST", rec.getQualifier().toString() );
rec = (QualifiedDayOfWeek) recurrences.get( 2 );
assertEquals( "FRI", rec.getDayOfWeek().toString() );
assertEquals( "FOURTH", rec.getQualifier().toString() );
rec = (QualifiedDayOfWeek) recurrences.get( 3 );
assertEquals( "FRI", rec.getDayOfWeek().toString() );
assertEquals( "LAST", rec.getQualifier().toString() );
}
@Test
public void testConvertScheduleRequestToJobTrigger_CronString() throws Exception {
cron = new CronJobTrigger();
cron.setCronString( "0 45 16 ? * 2#4,2L,6#4,6L *" );
cron.setDuration( 200000 );
cron.setStartTime( now );
cron.setUiPassParam( "param" );
cron.setEndTime( now );
when( scheduleRequest.getCronJobTrigger() ).thenReturn( cron );
IJobTrigger trigger = SchedulerResourceUtil.convertScheduleRequestToJobTrigger( scheduleRequest, scheduler );
assertTrue( trigger instanceof ComplexJobTrigger );
ComplexJobTrigger trig = (ComplexJobTrigger) trigger;
assertEquals( now, trig.getStartTime() );
assertEquals( now, trig.getEndTime() );
assertEquals( 200000, trig.getDuration() );
assertEquals( "param", trig.getUiPassParam() );
List<ITimeRecurrence> recurrences = trig.getDayOfWeekRecurrences().getRecurrences();
assertEquals( 4, recurrences.size() );
QualifiedDayOfWeek rec = (QualifiedDayOfWeek) recurrences.get( 0 );
assertEquals( "MON", rec.getDayOfWeek().toString() );
assertEquals( "FOURTH", rec.getQualifier().toString() );
rec = (QualifiedDayOfWeek) recurrences.get( 1 );
assertEquals( "MON", rec.getDayOfWeek().toString() );
assertEquals( "LAST", rec.getQualifier().toString() );
rec = (QualifiedDayOfWeek) recurrences.get( 2 );
assertEquals( "FRI", rec.getDayOfWeek().toString() );
assertEquals( "FOURTH", rec.getQualifier().toString() );
rec = (QualifiedDayOfWeek) recurrences.get( 3 );
assertEquals( "FRI", rec.getDayOfWeek().toString() );
assertEquals( "LAST", rec.getQualifier().toString() );
}
@Test
public void testUpdateStartDateForTimeZone_simple() throws Exception {
SimpleJobTrigger sjt = new SimpleJobTrigger();
sjt.setStartTime( now );
when( scheduleRequest.getSimpleJobTrigger() ).thenReturn( sjt );
when( scheduleRequest.getTimeZone() ).thenReturn( "GMT" );
long gmtTime = now.getTime() + TimeZone.getTimeZone( "EST" ).getRawOffset();
SchedulerResourceUtil.updateStartDateForTimeZone( scheduleRequest );
assertEquals( gmtTime, scheduleRequest.getSimpleJobTrigger().getStartTime().getTime() );
}
@Test
public void testUpdateStartDateForTimeZone_complex() throws Exception {
ComplexJobTriggerProxy t = new ComplexJobTriggerProxy();
t.setStartTime( now );
when( scheduleRequest.getComplexJobTrigger() ).thenReturn( t );
when( scheduleRequest.getTimeZone() ).thenReturn( "GMT" );
long gmtTime = now.getTime() + TimeZone.getTimeZone( "EST" ).getRawOffset();
SchedulerResourceUtil.updateStartDateForTimeZone( scheduleRequest );
assertEquals( gmtTime, scheduleRequest.getComplexJobTrigger().getStartTime().getTime() );
}
@Test
public void testUpdateStartDateForTimeZone_cron() throws Exception {
CronJobTrigger t = new CronJobTrigger();
t.setStartTime( now );
when( scheduleRequest.getCronJobTrigger() ).thenReturn( t );
when( scheduleRequest.getTimeZone() ).thenReturn( "GMT" );
long gmtTime = now.getTime() + TimeZone.getTimeZone( "EST" ).getRawOffset();
SchedulerResourceUtil.updateStartDateForTimeZone( scheduleRequest );
assertEquals( gmtTime, scheduleRequest.getCronJobTrigger().getStartTime().getTime() );
}
@Test
public void testIsPdiFile_ktr() throws Exception {
when( repo.getName() ).thenReturn( "transform.ktr" );
assertTrue( SchedulerResourceUtil.isPdiFile( repo ) );
}
@Test
public void testIsPdiFile_kjb() throws Exception {
when( repo.getName() ).thenReturn( "job.kjb" );
assertTrue( SchedulerResourceUtil.isPdiFile( repo ) );
}
@Test
public void testIsPdiFile_txt() throws Exception {
when( repo.getName() ).thenReturn( "readme.txt" );
assertFalse( SchedulerResourceUtil.isPdiFile( repo ) );
}
@Test
public void testIsPdiFile_null() throws Exception {
assertFalse( SchedulerResourceUtil.isPdiFile( null ) );
}
@Test
public void testHandlePdiScheduling_ktr() throws Exception {
HashMap<String, Serializable> params = new HashMap<>();
params.put( "test", "value" );
when( repo.getName() ).thenReturn( "transform.ktr" );
when( repo.getPath() ).thenReturn( "/home/me/transform.ktr" );
HashMap<String, String> pdiParams = new HashMap<>();
pdiParams.put( "pdiParam", "pdiParamValue" );
HashMap<String, Serializable> result = SchedulerResourceUtil.handlePDIScheduling( repo, params, pdiParams );
assertEquals( params.size() + 3, result.size() );
assertEquals( "transform", result.get( "transformation" ) );
assertEquals( "home/me", result.get( "directory" ) );
assertEquals( "pdiParamValue", ( (HashMap) result.get( ScheduleExportUtil.RUN_PARAMETERS_KEY ) ).get( "pdiParam" ) );
}
@Test
public void testHandlePdiScheduling_requestParamsAreTransferred() throws Exception {
HashMap<String, Serializable> params = new HashMap<>();
params.put( "test1", "value1" );
params.put( "test2", "value2" );
params.put( "test3", "value3" );
when( repo.getName() ).thenReturn( "job.kjb" );
when( repo.getPath() ).thenReturn( "/home/me/job.kjb" );
HashMap<String, Serializable> result = SchedulerResourceUtil.handlePDIScheduling( repo, params, null );
assertEquals( params.size() + 3, result.size() );
Map<String, String> resultPdiMap = (HashMap<String, String>) result.get( ScheduleExportUtil.RUN_PARAMETERS_KEY );
assertEquals( "value1", resultPdiMap.get( "test1" ) );
assertEquals( "value2", resultPdiMap.get( "test2" ) );
assertEquals( "value3", resultPdiMap.get( "test3" ) );
}
@Test
public void testHandlePdiScheduling_job() throws Exception {
HashMap<String, Serializable> params = new HashMap<>();
params.put( "test", "value" );
when( repo.getName() ).thenReturn( "job.kjb" );
when( repo.getPath() ).thenReturn( "/home/me/job.kjb" );
HashMap<String, String> pdiParams = new HashMap<>();
pdiParams.put( "pdiParam", "pdiParamValue" );
HashMap<String, Serializable> result = SchedulerResourceUtil.handlePDIScheduling( repo, params, pdiParams );
assertEquals( params.size() + 3, result.size() );
assertEquals( "job", result.get( "job" ) );
assertEquals( "home/me", result.get( "directory" ) );
assertEquals( "pdiParamValue", ( (HashMap) result.get( ScheduleExportUtil.RUN_PARAMETERS_KEY ) ).get( "pdiParam" ) );
}
@Test
public void testHandlePdiScheduling_notPdiFile() throws Exception {
HashMap<String, Serializable> params = new HashMap<>();
params.put( "test", "value" );
when( repo.getName() ).thenReturn( "readme.txt" );
HashMap<String, String> pdiParams = new HashMap<>();
pdiParams.put( "pdiParam", "pdiParamValue" );
HashMap<String, Serializable> result = SchedulerResourceUtil.handlePDIScheduling( repo, params, pdiParams );
assertEquals( params.size() + pdiParams.size(), result.size() );
}
}