/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.scheduler.quartz.internal;
import static com.liferay.portal.kernel.util.StringUtil.randomString;
import static org.junit.Assert.assertEquals;
import com.liferay.portal.kernel.scheduler.Trigger;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.TimeZoneUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.junit.Test;
/**
* @author Marcellus Tavares
*/
public class QuartzTriggerFactoryTest {
@Test
public void testDailyEveryTwoDaysTrigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 7 1/2 * ? *");
assertFireDates(
trigger, startDate, dateOf(2017, 0, 1, 7, 0),
dateOf(2017, 0, 3, 7, 0), dateOf(2017, 0, 5, 7, 0));
}
@Test
public void testDailyEveryWeekdayTrigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 7 ? * MON-FRI *");
assertFireDates(
trigger, startDate, dateOf(2017, 0, 2, 7, 0),
dateOf(2017, 0, 3, 7, 0), dateOf(2017, 0, 4, 7, 0),
dateOf(2017, 0, 5, 7, 0), dateOf(2017, 0, 6, 7, 0),
dateOf(2017, 0, 9, 7, 0));
}
@Test
public void testMonthlyDay12OfEveryTwoMonthsTrigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 13 12 1/2 ? *");
assertFireDates(
trigger, startDate, dateOf(2017, 0, 12, 13, 0),
dateOf(2017, 2, 12, 13, 0), dateOf(2017, 4, 12, 13, 0));
}
@Test
public void testMonthlyThirdTuesdayOfEveryThreeMonthsTrigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 14 ? 1/3 TUE#3 *");
assertFireDates(
trigger, startDate, dateOf(2017, 0, 17, 14, 0),
dateOf(2017, 3, 18, 14, 0), dateOf(2017, 6, 18, 14, 0));
}
@Test
public void testWeeklyEverySundayTrigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 15 ? * SUN/1 *");
assertFireDates(
trigger, startDate, dateOf(2017, 0, 1, 15, 0),
dateOf(2017, 0, 8, 15, 0), dateOf(2017, 0, 15, 15, 0));
}
@Test
public void testWeeklyMondayAndWednesdayTrigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 12 ? * MON,WED/1 *");
assertFireDates(
trigger, startDate, dateOf(2017, 0, 2, 12, 0),
dateOf(2017, 0, 4, 12, 0), dateOf(2017, 0, 9, 12, 0),
dateOf(2017, 0, 11, 12, 0));
}
@Test
public void testYearlyEveryTwoYearsJanuary12Trigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 12 12 1 ? 2017/2");
assertFireDates(
trigger, startDate, dateOf(2017, 0, 12, 12, 0),
dateOf(2019, 0, 12, 12, 0), dateOf(2021, 0, 12, 12, 0));
}
@Test
public void testYearlyEveryTwoYearsThirdSundayOfMarchTrigger() {
Date startDate = dateOf(2017, 0, 1, 6, 0);
Trigger trigger = triggerOf(startDate, null, "0 0 12 ? 3 1#3 2017/2");
assertFireDates(
trigger, startDate, dateOf(2017, 2, 19, 12, 0),
dateOf(2019, 2, 17, 12, 0), dateOf(2021, 2, 21, 12, 0));
}
protected void assertFireDates(
Trigger trigger, Date startDate, Date... expectedFireDates) {
Date fireDate = startDate;
for (Date exprectedFireDate : expectedFireDates) {
fireDate = trigger.getFireDateAfter(fireDate);
assertEquals(exprectedFireDate, fireDate);
}
}
protected Date dateOf(int year, int month, int date, int hour, int minute) {
Calendar calendar = new GregorianCalendar(
TimeZoneUtil.getDefault(), LocaleUtil.getDefault());
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DATE, date);
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
protected Trigger triggerOf(
Date startDate, Date endDate, String cronExpression) {
return _quartzTriggerFactory.createTrigger(
randomString(), randomString(), startDate, endDate, cronExpression);
}
private final QuartzTriggerFactory _quartzTriggerFactory =
new QuartzTriggerFactory();
}