/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.sa.model.util; import java.util.Calendar; import java.util.TimeZone; import org.junit.Assert; import org.junit.Test; import com.emc.storageos.db.client.model.uimodels.ExecutionWindow; import com.emc.storageos.db.client.model.uimodels.ExecutionWindowLengthType; import com.emc.storageos.db.client.model.uimodels.ExecutionWindowType; import com.emc.storageos.db.client.util.ExecutionWindowHelper; public class ExecutionWindowHelperTest { private static ExecutionWindow createDailyWindow(int hour, int minute) { ExecutionWindow window = new ExecutionWindow(); window.setExecutionWindowType(ExecutionWindowType.DAILY.name()); window.setHourOfDayInUTC(hour); window.setMinuteOfHourInUTC(minute); return window; } private static ExecutionWindow createWeeklyWindow(int dayOfWeek, int hour, int minute) { // Convert from Calendar day of week to JODA day of week if (dayOfWeek == 1) { dayOfWeek = 7; } else { dayOfWeek--; } ExecutionWindow window = new ExecutionWindow(); window.setExecutionWindowType(ExecutionWindowType.WEEKLY.name()); window.setHourOfDayInUTC(hour); window.setMinuteOfHourInUTC(minute); window.setDayOfWeek(dayOfWeek); return window; } private static ExecutionWindow createMonthlyWindow(int dayOfMonth, int hour, int minute) { ExecutionWindow window = new ExecutionWindow(); window.setExecutionWindowType(ExecutionWindowType.MONTHLY.name()); window.setHourOfDayInUTC(hour); window.setMinuteOfHourInUTC(minute); window.setDayOfMonth(dayOfMonth); return window; } private static void setLengthInHours(ExecutionWindow window, int hours) { window.setExecutionWindowLengthType(ExecutionWindowLengthType.HOURS.name()); window.setExecutionWindowLength(hours); } private static Calendar getDateTimeUTC(int year, int month, int day, int hour, int minute, int second) { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.clear(); cal.set(year, month, day, hour, minute, second); return cal; } private static void assertTime(Calendar cal, int hour, int minute, int second) { Assert.assertEquals(hour, cal.get(Calendar.HOUR_OF_DAY)); Assert.assertEquals(minute, cal.get(Calendar.MINUTE)); Assert.assertEquals(second, cal.get(Calendar.SECOND)); } private static void assertDate(Calendar cal, int year, int month, int day) { Assert.assertEquals(year, cal.get(Calendar.YEAR)); Assert.assertEquals(month, cal.get(Calendar.MONTH)); Assert.assertEquals(day, cal.get(Calendar.DAY_OF_MONTH)); } private static void assertDateTime(Calendar cal, int year, int month, int day, int hour, int minute, int second) { assertDate(cal, year, month, day); assertTime(cal, hour, minute, second); } @Test public void testDailySpanningMidnight() { // Daily at 11:30pm ExecutionWindow window = createDailyWindow(23, 30); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); Calendar beforeTime = getDateTimeUTC(2013, Calendar.MAY, 6, 23, 0, 0); assertDateTime(helper.calculateNext(beforeTime), 2013, Calendar.MAY, 6, 23, 30, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2013, Calendar.MAY, 6, 23, 30, 0); Calendar duringTime = getDateTimeUTC(2013, Calendar.MAY, 6, 23, 45, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.MAY, 7, 23, 30, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 6, 23, 30, 0); duringTime = getDateTimeUTC(2013, Calendar.MAY, 7, 0, 15, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.MAY, 7, 23, 30, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 6, 23, 30, 0); Calendar afterTime = getDateTimeUTC(2013, Calendar.MAY, 7, 1, 0, 0); assertDateTime(helper.calculateNext(afterTime), 2013, Calendar.MAY, 7, 23, 30, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2013, Calendar.MAY, 7, 23, 30, 0); } @Test public void testDailyWindowBeforeTime() { // Daily at 1:15am ExecutionWindow window = createDailyWindow(1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); // before, different hour Calendar beforeTime = getDateTimeUTC(2000, Calendar.JANUARY, 1, 0, 10, 0); // Should be the same date assertDateTime(helper.calculateNext(beforeTime), 2000, Calendar.JANUARY, 1, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2000, Calendar.JANUARY, 1, 1, 15, 0); // a few minutes before, the same hour beforeTime = getDateTimeUTC(2000, Calendar.JANUARY, 1, 1, 10, 0); // Should be the same date assertDateTime(helper.calculateNext(beforeTime), 2000, Calendar.JANUARY, 1, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2000, Calendar.JANUARY, 1, 1, 15, 0); } @Test public void testDailyWindowDuringTime() { // Daily at 1:15am ExecutionWindow window = createDailyWindow(1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); // Right at the start of the window Calendar duringTime = getDateTimeUTC(2000, Calendar.JANUARY, 10, 1, 15, 0); // Next will be the day after assertDateTime(helper.calculateNext(duringTime), 2000, Calendar.JANUARY, 11, 1, 15, 0); // Current or next will be today assertDateTime(helper.calculateCurrentOrNext(duringTime), 2000, Calendar.JANUARY, 10, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // One minute after the start of the window duringTime = getDateTimeUTC(2000, Calendar.JANUARY, 10, 1, 16, 0); // Next will be the day after assertDateTime(helper.calculateNext(duringTime), 2000, Calendar.JANUARY, 11, 1, 15, 0); // Current or next will be today assertDateTime(helper.calculateCurrentOrNext(duringTime), 2000, Calendar.JANUARY, 10, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // One minute before the end of the window duringTime = getDateTimeUTC(2000, Calendar.JANUARY, 10, 2, 14, 0); // Next will be the day after assertDateTime(helper.calculateNext(duringTime), 2000, Calendar.JANUARY, 11, 1, 15, 0); // Current or next will be today assertDateTime(helper.calculateCurrentOrNext(duringTime), 2000, Calendar.JANUARY, 10, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // Right at the end of the window duringTime = getDateTimeUTC(2000, Calendar.JANUARY, 10, 2, 15, 0); // Next will be the day after assertDateTime(helper.calculateNext(duringTime), 2000, Calendar.JANUARY, 11, 1, 15, 0); // Current or next will be tomorrow assertDateTime(helper.calculateCurrentOrNext(duringTime), 2000, Calendar.JANUARY, 11, 1, 15, 0); Assert.assertFalse(helper.isActive(duringTime)); } @Test public void testDailyWindowAfterTime() { // Daily at 1:15am ExecutionWindow window = createDailyWindow(1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); // Right after the window ends Calendar afterTime = getDateTimeUTC(2000, Calendar.FEBRUARY, 5, 2, 16, 0); assertDateTime(helper.calculateNext(afterTime), 2000, Calendar.FEBRUARY, 6, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2000, Calendar.FEBRUARY, 6, 1, 15, 0); // Should be the next day afterTime = getDateTimeUTC(2000, Calendar.FEBRUARY, 5, 10, 16, 0); assertDateTime(helper.calculateNext(afterTime), 2000, Calendar.FEBRUARY, 6, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2000, Calendar.FEBRUARY, 6, 1, 15, 0); // Last day of the month, check for rollover afterTime = getDateTimeUTC(2000, Calendar.JANUARY, 31, 5, 0, 0); assertDateTime(helper.calculateNext(afterTime), 2000, Calendar.FEBRUARY, 1, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2000, Calendar.FEBRUARY, 1, 1, 15, 0); // Last day of the year, check for rollover afterTime = getDateTimeUTC(2000, Calendar.DECEMBER, 31, 5, 0, 0); assertDateTime(helper.calculateNext(afterTime), 2001, Calendar.JANUARY, 1, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2001, Calendar.JANUARY, 1, 1, 15, 0); } @Test public void testWeeklyBeforeTime() { // Weekly on Sunday at 1:15am ExecutionWindow window = createWeeklyWindow(Calendar.SUNDAY, 1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); Calendar beforeTime = getDateTimeUTC(2013, Calendar.MAY, 5, 1, 10, 0); assertDateTime(helper.calculateNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); beforeTime = getDateTimeUTC(2013, Calendar.MAY, 4, 1, 10, 0); assertDateTime(helper.calculateNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); beforeTime = getDateTimeUTC(2013, Calendar.MAY, 3, 1, 10, 0); assertDateTime(helper.calculateNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); beforeTime = getDateTimeUTC(2013, Calendar.MAY, 2, 1, 10, 0); assertDateTime(helper.calculateNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); beforeTime = getDateTimeUTC(2013, Calendar.MAY, 1, 1, 10, 0); assertDateTime(helper.calculateNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2013, Calendar.MAY, 5, 1, 15, 0); } @Test public void testWeeklyAfterTime() { // Weekly on Sunday at 1:15am ExecutionWindow window = createWeeklyWindow(Calendar.SUNDAY, 1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); Calendar afterTime = getDateTimeUTC(2013, Calendar.MAY, 5, 3, 15, 0); assertDateTime(helper.calculateNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); afterTime = getDateTimeUTC(2013, Calendar.MAY, 6, 1, 10, 0); assertDateTime(helper.calculateNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); afterTime = getDateTimeUTC(2013, Calendar.MAY, 7, 1, 10, 0); assertDateTime(helper.calculateNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); afterTime = getDateTimeUTC(2013, Calendar.MAY, 8, 1, 10, 0); assertDateTime(helper.calculateNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); afterTime = getDateTimeUTC(2013, Calendar.MAY, 9, 1, 10, 0); assertDateTime(helper.calculateNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2013, Calendar.MAY, 12, 1, 15, 0); } @Test public void testWeeklyDuringTime() { // Weekly on Sunday at 1:15am ExecutionWindow window = createWeeklyWindow(Calendar.SUNDAY, 1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); // Start of the window Calendar duringTime = getDateTimeUTC(2013, Calendar.MAY, 5, 1, 15, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 5, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // One minute after start duringTime = getDateTimeUTC(2013, Calendar.MAY, 5, 1, 16, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 5, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // One minute before end duringTime = getDateTimeUTC(2013, Calendar.MAY, 5, 2, 14, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 5, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // End of the window duringTime = getDateTimeUTC(2013, Calendar.MAY, 5, 2, 15, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.MAY, 12, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 12, 1, 15, 0); Assert.assertFalse(helper.isActive(duringTime)); } @Test public void testMonthly() { // Monthly on the 15th at 1:15am ExecutionWindow window = createMonthlyWindow(15, 1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); // Just before window Calendar beforeTime = getDateTimeUTC(2013, Calendar.MAY, 15, 1, 10, 0); assertDateTime(helper.calculateNext(beforeTime), 2013, Calendar.MAY, 15, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(beforeTime), 2013, Calendar.MAY, 15, 1, 15, 0); // Just after the window Calendar afterTime = getDateTimeUTC(2013, Calendar.APRIL, 16, 1, 10, 0); assertDateTime(helper.calculateNext(afterTime), 2013, Calendar.MAY, 15, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(afterTime), 2013, Calendar.MAY, 15, 1, 15, 0); // Start of the window Calendar duringTime = getDateTimeUTC(2013, Calendar.MAY, 15, 1, 15, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.JUNE, 15, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 15, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // One minute after start duringTime = getDateTimeUTC(2013, Calendar.MAY, 15, 1, 16, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.JUNE, 15, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 15, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // One minute before end duringTime = getDateTimeUTC(2013, Calendar.MAY, 15, 2, 14, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.JUNE, 15, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.MAY, 15, 1, 15, 0); Assert.assertTrue(helper.isActive(duringTime)); // End of the window duringTime = getDateTimeUTC(2013, Calendar.MAY, 15, 2, 15, 0); assertDateTime(helper.calculateNext(duringTime), 2013, Calendar.JUNE, 15, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(duringTime), 2013, Calendar.JUNE, 15, 1, 15, 0); Assert.assertFalse(helper.isActive(duringTime)); } @Test public void testMonthlyNearEndOfMonth() { // Monthly on the 31st at 1:15am ExecutionWindow window = createMonthlyWindow(31, 1, 15); setLengthInHours(window, 1); ExecutionWindowHelper helper = new ExecutionWindowHelper(window); // February Calendar february = getDateTimeUTC(2013, Calendar.FEBRUARY, 1, 0, 0, 0); assertDateTime(helper.calculateNext(february), 2013, Calendar.FEBRUARY, 28, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(february), 2013, Calendar.FEBRUARY, 28, 1, 15, 0); // March Calendar march = getDateTimeUTC(2013, Calendar.MARCH, 1, 0, 0, 0); assertDateTime(helper.calculateNext(march), 2013, Calendar.MARCH, 31, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(march), 2013, Calendar.MARCH, 31, 1, 15, 0); // April Calendar april = getDateTimeUTC(2013, Calendar.APRIL, 1, 0, 0, 0); assertDateTime(helper.calculateNext(april), 2013, Calendar.APRIL, 30, 1, 15, 0); assertDateTime(helper.calculateCurrentOrNext(april), 2013, Calendar.APRIL, 30, 1, 15, 0); } }