package hudson.scheduler;
import static org.junit.Assert.assertEquals;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.For;
import org.jvnet.hudson.test.Url;
/**
* A collection of unit tests focused around crontabs restricted to particular
* days of the week. This flexes across all the locales in the system to check
* the correctness of the {@link CronTab} class, more specifically the
* {@link CronTab#floor(Calendar)} and {@link CronTab#ceil(Calendar)} methods.
*/
@For(CronTab.class)
@RunWith(Parameterized.class)
public class CronTabDayOfWeekLocaleTest {
@Parameters
public static Collection<Object[]> parameters() {
final Locale[] locales = Locale.getAvailableLocales();
final Collection<Object[]> parameters = new ArrayList<Object[]>();
for (final Locale locale : locales) {
final Calendar cal = Calendar.getInstance(locale);
if (GregorianCalendar.class.equals(cal.getClass())) {
parameters.add(new Object[] { locale });
}
}
return parameters;
}
private final Locale locale;
public CronTabDayOfWeekLocaleTest(Locale locale) {
this.locale = locale;
}
/**
* This unit test is an slight adaptation of the unit test found in
* HUDSON-8656.
*/
@Test
@Url("http://issues.hudson-ci.org/browse/HUDSON-8656")
public void hudson8658() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 23 * * 1-5"; // execute on weekdays @23:00
final CronTab cron = new CronTab(cronStr);
final Calendar next = cron.ceil(cal);
final Calendar expectedDate = Calendar.getInstance();
// Expected next: Monday, Jan 17th 2011, 23:00
expectedDate.set(2011, 0, 17, 23, 0, 0);
compare(expectedDate, next);
}
@Test
public void isSundayAndNextRunIsMonday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 1"; // Mondays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Monday, Jan 17th 2011, 00:00
expected.set(2011, 0, 17, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsMonday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 1"; // Mondays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Monday, Jan 10th 2011, 00:00
expected.set(2011, 0, 10, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndNextRunIsTuesday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 2"; // Tuesdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Tuesday, Jan 18th 2011, 00:00
expected.set(2011, 0, 18, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsTuesday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 2"; // Tuesdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Tuesday, Jan 11th 2011, 00:00
expected.set(2011, 0, 11, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndNextRunIsWednesday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 3"; // Wednesdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Wednesday, Jan 19th 2011, 00:00
expected.set(2011, 0, 19, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsWednesday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 3"; // Wednesdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Wednesday, Jan 12th 2011, 00:00
expected.set(2011, 0, 12, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndNextRunIsThursday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 4"; // Thursdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Thursday, Jan 20th 2011, 00:00
expected.set(2011, 0, 20, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsThursday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 4"; // Thursdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Thursday, Jan 13th 2011, 00:00
expected.set(2011, 0, 13, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndNextRunIsFriday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 5"; // Fridays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Friday, Jan 21th 2011, 00:00
expected.set(2011, 0, 21, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsFriday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 5"; // Fridays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Friday, Jan 14th 2011, 00:00
expected.set(2011, 0, 14, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndNextRunIsSaturday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 6"; // Saturdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Saturday, Jan 22th 2011, 00:00
expected.set(2011, 0, 22, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsSaturday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 0 * * 6"; // Saturdays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Saturday, Jan 15th 2011, 00:00
expected.set(2011, 0, 15, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndNextRunIsNextSunday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 1, 0, 0); // Sunday, Jan 16th 2011, 01:00
final String cronStr = "0 0 * * 0"; // Sundays @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Sunday, Jan 22th 2011, 00:00
expected.set(2011, 0, 23, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsPreviousSunday() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 1 * * 0"; // Sundays @01:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Sunday, Jan 9th 2011, 01:00
expected.set(2011, 0, 9, 1, 0, 0);
compare(expected, actual);
}
@Test
@Issue("JENKINS-12357")
public void isSundayAndNextRunIsNextSunday7() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 1, 0, 0); // Sunday, Jan 16th 2011, 01:00
final String cronStr = "0 0 * * 7"; // Sundays(7 not 0) @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Sunday, Jan 22th 2011, 00:00
expected.set(2011, 0, 23, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsPreviousSunday7() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 1 * * 7"; // Sundays(7 not 0) @01:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Sunday, Jan 9th 2011, 01:00
expected.set(2011, 0, 9, 1, 0, 0);
compare(expected, actual);
}
@Test
public void isSaturdayAndNextRunIsSundayAsterisk() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 15, 1, 0, 0); // Saturday, Jan 15th 2011, 01:00
final String cronStr = "0 0 * * *"; // Everyday @00:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.ceil(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Sunday, Jan 16th 2011, 00:00
expected.set(2011, 0, 16, 0, 0, 0);
compare(expected, actual);
}
@Test
public void isSundayAndPreviousRunIsSaturdayAsterisk() throws Exception {
final Calendar cal = Calendar.getInstance(locale);
cal.set(2011, 0, 16, 0, 0, 0); // Sunday, Jan 16th 2011, 00:00
final String cronStr = "0 23 * * *"; // Everyday @23:00
final CronTab cron = new CronTab(cronStr);
final Calendar actual = cron.floor(cal);
final Calendar expected = Calendar.getInstance();
// Expected next: Saturday, Jan 15th 2011, 23:00
expected.set(2011, 0, 15, 23, 0, 0);
compare(expected, actual);
}
private void compare(final Calendar expected, final Calendar actual) {
final DateFormat f = DateFormat.getDateTimeInstance();
final String msg = "Locale: " + locale + " FirstDayOfWeek: " + actual.getFirstDayOfWeek() + " Expected: "
+ f.format(expected.getTime()) + " Actual: " + f.format(actual.getTime());
assertEquals(msg, expected.get(Calendar.YEAR), actual.get(Calendar.YEAR));
assertEquals(msg, expected.get(Calendar.MONTH), actual.get(Calendar.MONTH));
assertEquals(msg, expected.get(Calendar.DAY_OF_MONTH), actual.get(Calendar.DAY_OF_MONTH));
assertEquals(msg, expected.get(Calendar.HOUR), actual.get(Calendar.HOUR));
assertEquals(msg, expected.get(Calendar.MINUTE), actual.get(Calendar.MINUTE));
}
}